Skip to content

Commit

Permalink
SVG: Don't render missing glyphs
Browse files Browse the repository at this point in the history
This bug is similar to the canvas bug of mozilla#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 mozilla#6721, where an unexpected glyph
appeared in the canvas renderer. This was fixed by mozilla#7023, which skips over
missing glyphs. This commit follows a similar logic.

The test case from mozilla#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"
  • Loading branch information
Rob--W committed Aug 16, 2017
1 parent ba5dbc9 commit f07ce2b
Showing 1 changed file with 10 additions and 2 deletions.
12 changes: 10 additions & 2 deletions src/display/svg.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit f07ce2b

Please sign in to comment.