Merge pull request #21320 from calixteman/issue7625

Substitute a system font when an embedded CFF is truncated
This commit is contained in:
Tim van der Meij 2026-05-24 19:00:50 +02:00 committed by GitHub
commit e6cb600896
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 46 additions and 1 deletions

View File

@ -787,6 +787,12 @@ class CFFParser {
this.emptyPrivateDictionary(parentDict);
return;
}
// The Private DICT extends past the end of the font data, which means
// the embedded font is truncated; abort so the caller can substitute a
// system font instead of rendering blank glyphs (issue 7625).
if (offset + size > this.bytes.length) {
throw new FormatError("CFF Private DICT extends past end of font");
}
const privateDictEnd = offset + size;
const dictData = this.bytes.subarray(offset, privateDictEnd);

View File

@ -4728,7 +4728,35 @@ class PartialEvaluator {
const newProperties = await this.extractDataStructures(dict, properties);
this.extractWidths(dict, descriptor, newProperties);
return new Font(fontName.name, fontFile, newProperties, this.options);
const font = new Font(fontName.name, fontFile, newProperties, this.options);
// The embedded font may have been too corrupt to parse, in which case
// we ended up in the fallback path without a substitution selected.
// Try the substitution map now so text renders in a font close to what
// the document asked for (issue 7625).
if (
font.missingFile &&
!font.systemFontInfo &&
!isType3Font &&
this.options.useSystemFonts
) {
const standardFontName = getStandardFontName(fontName.name);
const substitution = getFontSubstitution(
this.systemFontCache,
this.idFactory,
this.options.standardFontDataUrl,
fontName.name,
standardFontName,
type
);
if (substitution) {
if (substitution.guessFallback) {
substitution.guessFallback = false;
substitution.css += `,${font.fallbackName}`;
}
font.systemFontInfo = substitution;
}
}
return font;
}
static buildFontPaths(font, glyphs, handler, evaluatorOptions) {

View File

@ -0,0 +1 @@
https://github.com/mozilla/pdf.js/files/467169/Er.aestetik.en.loftestang.for.laering.pdf

View File

@ -14310,5 +14310,15 @@
"md5": "39d15f7f810bd89a4e5858df9c75ca4e",
"rounds": 1,
"type": "eq"
},
{
"id": "issue7625",
"file": "pdfs/issue7625.pdf",
"md5": "77ca0a41da767dca31ca45219e2ae202",
"link": true,
"rounds": 1,
"firstPage": 1,
"lastPage": 1,
"type": "eq"
}
]