From f07ce2bbc2b4f8168edd2bb411bfd33d2c74159d Mon Sep 17 00:00:00 2001 From: Rob Wu Date: Wed, 16 Aug 2017 23:35:39 +0200 Subject: [PATCH] SVG: Don't render missing glyphs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This bug is similar to the canvas bug of #6721. I found this bug when I tried to run pdf2svg on a SVG file, and the generated SVG could not be viewed in Chrome due to a SVG/XML parsing error: "PCDATA invalid Char value 3" Reduced test case: - https://github.com/mozilla/pdf.js/files/1229507/pcdatainvalidchar.pdf - expected: "hardware performance" - Actual SVG source: "hardware\x03performance" (where "\x03" is a non-printable character, and invalid XML). In terms of rendering, this bug is similar to #6721, where an unexpected glyph appeared in the canvas renderer. This was fixed by #7023, which skips over missing glyphs. This commit follows a similar logic. The test case from #6721 can be used here too: - https://github.com/mozilla/pdf.js/files/52205/issue6721_reduced.pdf expected: "Issue 6721" actual (before this patch): "Issue ààà6721" --- src/display/svg.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/display/svg.js b/src/display/svg.js index e0f65c3ac..0ab555391 100644 --- a/src/display/svg.js +++ b/src/display/svg.js @@ -742,15 +742,23 @@ SVGGraphics = (function SVGGraphicsClosure() { x += -glyph * fontSize * 0.001; continue; } - current.xcoords.push(current.x + x * textHScale); var width = glyph.width; var character = glyph.fontChar; var spacing = (glyph.isSpace ? wordSpacing : 0) + charSpacing; var charWidth = width * widthAdvanceScale + spacing * fontDirection; - x += charWidth; + if (!glyph.isInFont && !font.missingFile) { + x += charWidth; + // TODO: To assist with text selection, we should replace the missing + // character with a space character if charWidth is not zero. + // But we cannot just do "character = ' '", because the ' ' character + // might actually map to a different glyph. + continue; + } + current.xcoords.push(current.x + x * textHScale); current.tspan.textContent += character; + x += charWidth; } if (vertical) { current.y -= x * textHScale;