Browse Source

Try to skip mapping of missing TrueType glyphs

Also don't skip mapping of glyphs which are empty, if the corresponding charCode is included in toUnicode.
Jonas Jenwald 10 years ago
parent
commit
01e6565dd4
  1. 21
      src/core/fonts.js
  2. 2
      test/pdfs/.gitignore
  3. BIN
      test/pdfs/bug893730.pdf
  4. BIN
      test/pdfs/issue5704.pdf
  5. 14
      test/test_manifest.json

21
src/core/fonts.js

@ -4070,11 +4070,21 @@ var Font = (function FontClosure() {
} }
} }
var charCodeToGlyphId = [], charCode; var charCodeToGlyphId = [], charCode, toUnicode = properties.toUnicode;
function hasGlyph(glyphId, charCode) {
if (!missingGlyphs[glyphId]) {
return true;
}
if (charCode >= 0 && toUnicode.has(charCode)) {
return true;
}
return false;
}
if (properties.type === 'CIDFontType2') { if (properties.type === 'CIDFontType2') {
var cidToGidMap = properties.cidToGidMap || []; var cidToGidMap = properties.cidToGidMap || [];
var isCidToGidMapEmpty = cidToGidMap.length === 0; var isCidToGidMapEmpty = cidToGidMap.length === 0;
var toUnicode = properties.toUnicode;
properties.cMap.forEach(function(charCode, cid) { properties.cMap.forEach(function(charCode, cid) {
assert(cid <= 0xffff, 'Max size of CID is 65,535'); assert(cid <= 0xffff, 'Max size of CID is 65,535');
@ -4086,7 +4096,7 @@ var Font = (function FontClosure() {
} }
if (glyphId >= 0 && glyphId < numGlyphs && if (glyphId >= 0 && glyphId < numGlyphs &&
(!missingGlyphs[glyphId] || toUnicode.has(charCode))) { hasGlyph(glyphId, charCode)) {
charCodeToGlyphId[charCode] = glyphId; charCodeToGlyphId[charCode] = glyphId;
} }
}); });
@ -4146,7 +4156,8 @@ var Font = (function FontClosure() {
var found = false; var found = false;
for (i = 0; i < cmapMappingsLength; ++i) { for (i = 0; i < cmapMappingsLength; ++i) {
if (cmapMappings[i].charCode === unicodeOrCharCode) { if (cmapMappings[i].charCode === unicodeOrCharCode &&
hasGlyph(cmapMappings[i].glyphId, unicodeOrCharCode)) {
charCodeToGlyphId[charCode] = cmapMappings[i].glyphId; charCodeToGlyphId[charCode] = cmapMappings[i].glyphId;
found = true; found = true;
break; break;
@ -4156,7 +4167,7 @@ var Font = (function FontClosure() {
// Try to map using the post table. There are currently no known // Try to map using the post table. There are currently no known
// pdfs that this fixes. // pdfs that this fixes.
var glyphId = properties.glyphNames.indexOf(glyphName); var glyphId = properties.glyphNames.indexOf(glyphName);
if (glyphId > 0) { if (glyphId > 0 && hasGlyph(glyphId, -1)) {
charCodeToGlyphId[charCode] = glyphId; charCodeToGlyphId[charCode] = glyphId;
} }
} }

2
test/pdfs/.gitignore vendored

@ -59,6 +59,8 @@
!zerowidthline.pdf !zerowidthline.pdf
!bug868745.pdf !bug868745.pdf
!mmtype1.pdf !mmtype1.pdf
!issue5704.pdf
!bug893730.pdf
!bug864847.pdf !bug864847.pdf
!issue1002.pdf !issue1002.pdf
!issue925.pdf !issue925.pdf

BIN
test/pdfs/bug893730.pdf

Binary file not shown.

BIN
test/pdfs/issue5704.pdf

Binary file not shown.

14
test/test_manifest.json

@ -1022,6 +1022,20 @@
"link": true, "link": true,
"type": "eq" "type": "eq"
}, },
{ "id": "issue5704",
"file": "pdfs/issue5704.pdf",
"md5": "6e0b62585feef24dff2d7e7687cd8128",
"rounds": 1,
"link": false,
"type": "eq"
},
{ "id": "bug893730",
"file": "pdfs/bug893730.pdf",
"md5": "2587379fb1b3bbff89c14f0863e78383",
"rounds": 1,
"link": false,
"type": "eq"
},
{ "id": "pdfkit_compressed", { "id": "pdfkit_compressed",
"file": "pdfs/pdfkit_compressed.pdf", "file": "pdfs/pdfkit_compressed.pdf",
"md5": "ffe9c571d0a1572e234253e6c7cdee6c", "md5": "ffe9c571d0a1572e234253e6c7cdee6c",

Loading…
Cancel
Save