Pass the ignoreErrors API option to the FontFaceObject constructor, and utilize it in getPathGenerator to ignore missing glyphs

Obviously it's still not possible to render non-embedded fonts as paths, but in this way the rest of the page will at least be allowed to continue rendering.

*Please note:* Including the 14 standard fonts in PDF.js probably wouldn't be *that* difficult to implement. (I'm not a lawyer, but the fonts from PDFium could probably be used given their BSD license.)
However, the main blocker ought to be the total size of the necessary font data, since I cannot imagine people being OK with shipping ~5 MB of (additional) font data with Firefox. (Based on the reactions when the CMap files were added, and those are only ~1 MB in size.)
This commit is contained in:
Jonas Jenwald 2018-06-13 11:02:06 +02:00
parent fe288bb872
commit bf0db0fb72
4 changed files with 24 additions and 1 deletions

View File

@ -1884,6 +1884,7 @@ var WorkerTransport = (function WorkerTransportClosure() {
var font = new FontFaceObject(exportedData, {
isEvalSupported: params.isEvalSupported,
disableFontFace: params.disableFontFace,
ignoreErrors: params.ignoreErrors,
fontRegistry,
});
var fontReady = (fontObjs) => {

View File

@ -338,6 +338,7 @@ var IsEvalSupportedCached = {
var FontFaceObject = (function FontFaceObjectClosure() {
function FontFaceObject(translatedData, { isEvalSupported = true,
disableFontFace = false,
ignoreErrors = false,
fontRegistry = null, }) {
this.compiledGlyphs = Object.create(null);
// importing translated data
@ -346,6 +347,7 @@ var FontFaceObject = (function FontFaceObjectClosure() {
}
this.isEvalSupported = isEvalSupported !== false;
this.disableFontFace = disableFontFace === true;
this.ignoreErrors = ignoreErrors === true;
this.fontRegistry = fontRegistry;
}
FontFaceObject.prototype = {
@ -390,7 +392,19 @@ var FontFaceObject = (function FontFaceObjectClosure() {
return this.compiledGlyphs[character];
}
let cmds = objs.get(this.loadedName + '_path_' + character), current;
let cmds, current;
try {
cmds = objs.get(this.loadedName + '_path_' + character);
} catch (ex) {
if (!this.ignoreErrors) {
throw ex;
}
warn(`getPathGenerator - ignoring character: "${ex}".`);
return this.compiledGlyphs[character] = function(c, size) {
// No-op function, to allow rendering to continue.
};
}
// If we can, compile cmds into JS for MAXIMUM SPEED...
if (this.isEvalSupported && IsEvalSupportedCached.value) {

View File

@ -0,0 +1 @@
https://web.archive.org/web/20180613082417/https://tcpdf.org/files/examples/example_026.pdf

View File

@ -2267,6 +2267,13 @@
"rounds": 1,
"type": "eq"
},
{ "id": "issue4244",
"file": "pdfs/issue4244.pdf",
"md5": "26845274a32a537182ced1fd693a38b2",
"rounds": 1,
"link": true,
"type": "eq"
},
{ "id": "preistabelle",
"file": "pdfs/preistabelle.pdf",
"md5": "d2f0b2086160d4f3d325c79a5dc1fb4d",