Skip to content

Commit

Permalink
Fix PDF/A validation and Adobe Reader display problems due to missing…
Browse files Browse the repository at this point in the history
… required fields

The /Encoding entry in a Type0 font needs to be a Symbol or a valid CMap
stream. These streams needs additional entries that were missing since
the the recent change for supporting multiple codepoints referencing the
same glyph introduced them.

This lead to a PDF/A validation regression and a display problem on
Adobe Reader.
  • Loading branch information
gettalong committed Nov 5, 2024
1 parent 8895738 commit 21e5a2c
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 1 deletion.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
## Unreleased

### Added

* [HexaPDF::Type::CMap] for representing CMap streams

### Fixed

* Checksum calculation for TrueType tables
* Automatic wrapping of dictionary entry /CIDToGIDMap for CID fonts
* Performance regression when encoding char codes for TrueType fonts
* PDF/A validation regression for PDFs using TrueType fonts


## 1.0.1 - 2024-11-04
Expand Down
1 change: 1 addition & 0 deletions lib/hexapdf/configuration.rb
Original file line number Diff line number Diff line change
Expand Up @@ -722,6 +722,7 @@ def self.font_on_invalid_glyph(codepoint, invalid_glyph)
OutputIntent: 'HexaPDF::Type::OutputIntent',
XXDestOutputProfileRef: 'HexaPDF::Type::OutputIntent::DestOutputProfileRef',
ExData: 'HexaPDF::Type::Annotations::MarkupAnnotation::ExData',
CMap: 'HexaPDF::Type::CMap',
},
'object.subtype_map' => {
nil => {
Expand Down
6 changes: 5 additions & 1 deletion lib/hexapdf/font/true_type_wrapper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -381,7 +381,11 @@ def add_encoding_information_cmap(dict, document)
dict[:Encoding] = :'Identity-H'
else
stream = HexaPDF::StreamData.new { HexaPDF::Font::CMap.create_cid_cmap(mapping) }
stream_obj = document.add({}, stream: stream)
stream_obj = document.add({Type: :CMap,
CMapName: :Custom,
CIDSystemInfo: {Registry: "Adobe", Ordering: "Identity",
Supplement: 0},
}, stream: stream)
stream_obj.set_filter(:FlateDecode)
dict[:Encoding] = stream_obj
end
Expand Down
1 change: 1 addition & 0 deletions lib/hexapdf/type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ module Type
autoload(:OptionalContentConfiguration, 'hexapdf/type/optional_content_configuration')
autoload(:Metadata, 'hexapdf/type/metadata')
autoload(:OutputIntent, 'hexapdf/type/output_intent')
autoload(:CMap, 'hexapdf/type/cmap')

end

Expand Down
58 changes: 58 additions & 0 deletions lib/hexapdf/type/cmap.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
# -*- encoding: utf-8; frozen_string_literal: true -*-
#
#--
# This file is part of HexaPDF.
#
# HexaPDF - A Versatile PDF Creation and Manipulation Library For Ruby
# Copyright (C) 2014-2024 Thomas Leitner
#
# HexaPDF is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License version 3 as
# published by the Free Software Foundation with the addition of the
# following permission added to Section 15 as permitted in Section 7(a):
# FOR ANY PART OF THE COVERED WORK IN WHICH THE COPYRIGHT IS OWNED BY
# THOMAS LEITNER, THOMAS LEITNER DISCLAIMS THE WARRANTY OF NON
# INFRINGEMENT OF THIRD PARTY RIGHTS.
#
# HexaPDF is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public
# License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with HexaPDF. If not, see <http://www.gnu.org/licenses/>.
#
# The interactive user interfaces in modified source and object code
# versions of HexaPDF must display Appropriate Legal Notices, as required
# under Section 5 of the GNU Affero General Public License version 3.
#
# In accordance with Section 7(b) of the GNU Affero General Public
# License, a covered work must retain the producer line in every PDF that
# is created or manipulated using HexaPDF.
#
# If the GNU Affero General Public License doesn't fit your need,
# commercial licenses are available at <https://gettalong.at/hexapdf/>.
#++

require 'hexapdf/stream'

module HexaPDF
module Type

# Represents an embedded CMap file.
#
# See: PDF2.0 s9.7.5.3
class CMap < Stream

define_type :CMap

define_field :Type, type: Symbol, required: true, default: type
define_field :CMapName, type: Symbol, required: true
define_field :CIDSystemInfo, type: :XXCIDSystemInfo, required: true
define_field :WMode, type: Integer
define_field :UseCMap, type: [Stream, Symbol]

end

end
end

0 comments on commit 21e5a2c

Please sign in to comment.