From cfdb597e4a2274c9882a2192a4dcf9601fbb4f7b Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Fri, 27 Jul 2018 16:19:57 +0200 Subject: [PATCH 1/3] Ensure that the `CIDSystemInfo` strings, in Type0 fonts, are correctly decoded This isn't directly related to the subsequent patch, but just something that I happened to notice while poking around in the font code. --- src/core/evaluator.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/evaluator.js b/src/core/evaluator.js index ff6699cf8..d7bccc401 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -16,8 +16,8 @@ import { AbortException, assert, CMapCompressionType, createPromiseCapability, FONT_IDENTITY_MATRIX, FormatError, getLookupTableFactory, IDENTITY_MATRIX, - info, isNum, isString, NativeImageDecoding, OPS, TextRenderingMode, - UNSUPPORTED_FEATURES, Util, warn + info, isNum, isString, NativeImageDecoding, OPS, stringToPDFString, + TextRenderingMode, UNSUPPORTED_FEATURES, Util, warn } from '../shared/util'; import { CMapFactory, IdentityCMap } from './cmap'; import { DecodeStream, Stream } from './stream'; @@ -1871,8 +1871,8 @@ var PartialEvaluator = (function PartialEvaluatorClosure() { var cidSystemInfo = dict.get('CIDSystemInfo'); if (isDict(cidSystemInfo)) { properties.cidSystemInfo = { - registry: cidSystemInfo.get('Registry'), - ordering: cidSystemInfo.get('Ordering'), + registry: stringToPDFString(cidSystemInfo.get('Registry')), + ordering: stringToPDFString(cidSystemInfo.get('Ordering')), supplement: cidSystemInfo.get('Supplement'), }; } From 17eac2d48a9597f96d4e3d36d4d075e465c5b298 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Fri, 27 Jul 2018 16:33:30 +0200 Subject: [PATCH 2/3] Ensure that Type0, i.e. composite, OpenType fonts with `CFF ` tables are *not* treated as CFF fonts if their glyph mapping is non-default (issue 9915) This particular code-path has been the source of *numerous* regressions to date, so hopefully this patch won't cause any more of those. Fixes 9915. --- src/core/fonts.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/core/fonts.js b/src/core/fonts.js index 168444693..aff4ac513 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -35,6 +35,7 @@ import { getUnicodeForGlyph, getUnicodeRangeFor, mapSpecialUnicodeValues } from './unicode'; import { FontRendererFactory } from './font_renderer'; +import { IdentityCMap } from './cmap'; import { Stream } from './stream'; import { Type1Parser } from './type1_parser'; @@ -2308,9 +2309,11 @@ var Font = (function FontClosure() { var isTrueType = !tables['CFF ']; if (!isTrueType) { - // OpenType font (skip composite fonts with non-default CID to GID map). - if ((header.version === 'OTTO' && - !(properties.composite && properties.cidToGidMap)) || + const isComposite = properties.composite && + ((properties.cidToGidMap || []).length > 0 || + !(properties.cMap instanceof IdentityCMap)); + // OpenType font (skip composite fonts with non-default glyph mapping). + if ((header.version === 'OTTO' && !isComposite) || !tables['head'] || !tables['hhea'] || !tables['maxp'] || !tables['post']) { // No major tables: throwing everything at `CFFFont`. From 690bcc8c8a2fc5ed789ec06320226d1539e1bc96 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Fri, 27 Jul 2018 16:57:58 +0200 Subject: [PATCH 3/3] Add a reduced, `eq`, test-case for issue 9915 --- test/pdfs/.gitignore | 1 + test/pdfs/issue9915_reduced.pdf | Bin 0 -> 13814 bytes test/test_manifest.json | 7 +++++++ 3 files changed, 8 insertions(+) create mode 100644 test/pdfs/issue9915_reduced.pdf diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index bd38ac166..cd4cc8b70 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -70,6 +70,7 @@ !issue9291.pdf !issue9418.pdf !issue9458.pdf +!issue9915_reduced.pdf !bad-PageLabels.pdf !decodeACSuccessive.pdf !filled-background.pdf diff --git a/test/pdfs/issue9915_reduced.pdf b/test/pdfs/issue9915_reduced.pdf new file mode 100644 index 0000000000000000000000000000000000000000..f515595a90a238344eaf785cb894dc142e9382cf GIT binary patch literal 13814 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 OKQJhmE_hMBh5rG}6=y8~ literal 0 HcmV?d00001 diff --git a/test/test_manifest.json b/test/test_manifest.json index defb40f4f..f1a67d5fa 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -1339,6 +1339,13 @@ "link": false, "type": "eq" }, + { "id": "issue9915", + "file": "pdfs/issue9915_reduced.pdf", + "md5": "c56dabe5066a6c821901920e09dffe00", + "rounds": 1, + "link": false, + "type": "eq" + }, { "id": "issue8570", "file": "pdfs/issue8570.pdf", "md5": "0355731adb72df233eaa10464dcc8c51",