diff --git a/src/core/fonts.js b/src/core/fonts.js index c519dd75d..04eab4c27 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -3200,7 +3200,7 @@ var Type1Font = (function Type1FontClosure() { var eexecBlock = getEexecBlock(file, eexecBlockLength); var eexecBlockParser = new Type1Parser(eexecBlock.stream, true, SEAC_ANALYSIS_ENABLED); - var data = eexecBlockParser.extractFontProgram(); + var data = eexecBlockParser.extractFontProgram(properties); for (var info in data.properties) { properties[info] = data.properties[info]; } diff --git a/src/core/type1_parser.js b/src/core/type1_parser.js index 0a54c4038..319375653 100644 --- a/src/core/type1_parser.js +++ b/src/core/type1_parser.js @@ -520,7 +520,7 @@ var Type1Parser = (function Type1ParserClosure() { * Returns an object containing a Subrs array and a CharStrings * array extracted from and eexec encrypted block of data */ - extractFontProgram: function Type1Parser_extractFontProgram() { + extractFontProgram: function Type1Parser_extractFontProgram(properties) { var stream = this.stream; var subrs = [], charstrings = []; @@ -646,6 +646,16 @@ var Type1Parser = (function Type1ParserClosure() { lsb: charString.lsb, seac: charString.seac, }); + + // Attempt to replace missing widths, from the font dictionary /Widths + // entry, with ones from the font data (fixes issue11150_reduced.pdf). + if (properties.builtInEncoding) { + const index = properties.builtInEncoding.indexOf(glyph); + if (index > -1 && properties.widths[index] === undefined && + index >= properties.firstChar && index <= properties.lastChar) { + properties.widths[index] = charString.width; + } + } } return program; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 6c76b3302..02eaef340 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -82,6 +82,7 @@ !issue10665_reduced.pdf !issue11016_reduced.pdf !issue11045.pdf +!issue11150_reduced.pdf !bad-PageLabels.pdf !decodeACSuccessive.pdf !filled-background.pdf diff --git a/test/pdfs/issue11150_reduced.pdf b/test/pdfs/issue11150_reduced.pdf new file mode 100644 index 000000000..cab585e7f Binary files /dev/null and b/test/pdfs/issue11150_reduced.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index fc3a95c21..a939822c1 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -53,6 +53,13 @@ "link": false, "type": "text" }, + { "id": "issue11150", + "file": "pdfs/issue11150_reduced.pdf", + "md5": "8b86381089a9ec28723791245a9adfa6", + "rounds": 1, + "link": false, + "type": "eq" + }, { "id": "issue1293", "file": "pdfs/issue1293r.pdf", "md5": "4a098f5051f34fab036f5bbe88f8deef", diff --git a/test/unit/type1_parser_spec.js b/test/unit/type1_parser_spec.js index b031376e0..c718e607a 100644 --- a/test/unit/type1_parser_spec.js +++ b/test/unit/type1_parser_spec.js @@ -90,7 +90,7 @@ describe('Type1Parser', function() { '/.notdef 1 RD x ND\n' + 'end'); var parser = new Type1Parser(stream, false, SEAC_ANALYSIS_ENABLED); - var program = parser.extractFontProgram(); + var program = parser.extractFontProgram({}); expect(program.charstrings.length).toEqual(1); expect(program.properties.privateData.ExpansionFactor).toEqual(99); });