diff --git a/src/core/fonts.js b/src/core/fonts.js index 0c511f8aa..927200467 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -191,7 +191,7 @@ function getFontType(type, subtype) { var Glyph = (function GlyphClosure() { function Glyph(fontChar, unicode, accent, width, vmetric, operatorListId, - isSpace) { + isSpace, isInFont) { this.fontChar = fontChar; this.unicode = unicode; this.accent = accent; @@ -199,17 +199,20 @@ var Glyph = (function GlyphClosure() { this.vmetric = vmetric; this.operatorListId = operatorListId; this.isSpace = isSpace; + this.isInFont = isInFont; } Glyph.prototype.matchesForCache = function(fontChar, unicode, accent, width, - vmetric, operatorListId, isSpace) { + vmetric, operatorListId, isSpace, + isInFont) { return this.fontChar === fontChar && this.unicode === unicode && this.accent === accent && this.width === width && this.vmetric === vmetric && this.operatorListId === operatorListId && - this.isSpace === isSpace; + this.isSpace === isSpace && + this.isInFont === isInFont; }; return Glyph; @@ -468,6 +471,7 @@ var Font = (function FontClosure() { this.loadedName = properties.loadedName; this.isType3Font = properties.isType3Font; this.sizes = []; + this.missingFile = false; this.glyphCache = Object.create(null); @@ -2807,6 +2811,7 @@ var Font = (function FontClosure() { unicode = String.fromCharCode(unicode); } + var isInFont = charcode in this.toFontChar; // First try the toFontChar map, if it's not there then try falling // back to the char code. fontCharCode = this.toFontChar[charcode] || charcode; @@ -2821,6 +2826,7 @@ var Font = (function FontClosure() { var accent = null; if (this.seacMap && this.seacMap[charcode]) { + isInFont = true; var seac = this.seacMap[charcode]; fontCharCode = seac.baseFontCharCode; accent = { @@ -2834,9 +2840,9 @@ var Font = (function FontClosure() { var glyph = this.glyphCache[charcode]; if (!glyph || !glyph.matchesForCache(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace)) { + operatorListId, isSpace, isInFont)) { glyph = new Glyph(fontChar, unicode, accent, width, vmetric, - operatorListId, isSpace); + operatorListId, isSpace, isInFont); this.glyphCache[charcode] = glyph; } return glyph; diff --git a/src/display/canvas.js b/src/display/canvas.js index 2e8c76607..bd9f68e28 100644 --- a/src/display/canvas.js +++ b/src/display/canvas.js @@ -1501,15 +1501,19 @@ var CanvasGraphics = (function CanvasGraphicsClosure() { } } - if (simpleFillText && !accent) { - // common case - ctx.fillText(character, scaledX, scaledY); - } else { - this.paintChar(character, scaledX, scaledY); - if (accent) { - scaledAccentX = scaledX + accent.offset.x / fontSizeScale; - scaledAccentY = scaledY - accent.offset.y / fontSizeScale; - this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY); + // Only attempt to draw the glyph if it is actually in the embedded font + // file or if there isn't a font file so the fallback font is shown. + if (glyph.isInFont || font.missingFile) { + if (simpleFillText && !accent) { + // common case + ctx.fillText(character, scaledX, scaledY); + } else { + this.paintChar(character, scaledX, scaledY); + if (accent) { + scaledAccentX = scaledX + accent.offset.x / fontSizeScale; + scaledAccentY = scaledY - accent.offset.y / fontSizeScale; + this.paintChar(accent.fontChar, scaledAccentX, scaledAccentY); + } } } diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 911781e82..68726982a 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -166,6 +166,7 @@ !issue5010.pdf !issue4934.pdf !issue4650.pdf +!issue6721_reduced.pdf !issue3025.pdf !issue2099-1.pdf !issue3371.pdf diff --git a/test/pdfs/issue6721_reduced.pdf b/test/pdfs/issue6721_reduced.pdf new file mode 100644 index 000000000..1ce3cb7b8 Binary files /dev/null and b/test/pdfs/issue6721_reduced.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index 1bbc7f005..3f73f9e69 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -543,6 +543,15 @@ "lastPage": 1, "type": "eq" }, + { "id": "issue6721_reduced", + "file": "pdfs/issue6721_reduced.pdf", + "md5": "719aa66d8081a15e3ba6032ed4279237", + "rounds": 1, + "link": false, + "firstPage": 1, + "lastPage": 1, + "type": "eq" + }, { "id": "issue5010", "file": "pdfs/issue5010.pdf", "md5": "419f4b13403a0871c463ec69d96e342c",