diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 3e83d6e0a..a03fa7010 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -49,6 +49,7 @@ import { getStandardFontName, getStdFontMap, getSymbolsFonts, + isKnownFontName, } from "./standard_fonts.js"; import { getTilingPatternIR, Pattern } from "./pattern.js"; import { getXfaFontDict, getXfaFontName } from "./xfa_fonts.js"; @@ -3487,14 +3488,11 @@ class PartialEvaluator { } } - const nonEmbeddedFont = !properties.file || properties.isInternalFont; + const nonEmbeddedFont = !properties.file || properties.isInternalFont, + isSymbolsFontName = getSymbolsFonts()[properties.name]; // Ignore an incorrectly specified named encoding for non-embedded // symbol fonts (fixes issue16464.pdf). - if ( - baseEncodingName && - nonEmbeddedFont && - getSymbolsFonts()[properties.name] - ) { + if (baseEncodingName && nonEmbeddedFont && isSymbolsFontName) { baseEncodingName = null; } @@ -3512,7 +3510,7 @@ class PartialEvaluator { } // The Symbolic attribute can be misused for regular fonts // Heuristic: we have to check if the font is a standard one also - if (isSymbolicFont) { + if (isSymbolicFont || isSymbolsFontName) { encoding = MacRomanEncoding; if (nonEmbeddedFont) { if (/Symbol/i.test(properties.name)) { @@ -4249,19 +4247,25 @@ class PartialEvaluator { baseFont = Name.get(baseFont); } - if (!isType3Font) { - const fontNameStr = fontName?.name; - const baseFontStr = baseFont?.name; - if (fontNameStr !== baseFontStr) { - info( - `The FontDescriptor's FontName is "${fontNameStr}" but ` + - `should be the same as the Font's BaseFont "${baseFontStr}".` - ); - // Workaround for cases where e.g. fontNameStr = 'Arial' and - // baseFontStr = 'Arial,Bold' (needed when no font file is embedded). - if (fontNameStr && baseFontStr?.startsWith(fontNameStr)) { - fontName = baseFont; - } + const fontNameStr = fontName?.name; + const baseFontStr = baseFont?.name; + if (!isType3Font && fontNameStr !== baseFontStr) { + info( + `The FontDescriptor's FontName is "${fontNameStr}" but ` + + `should be the same as the Font's BaseFont "${baseFontStr}".` + ); + // - Workaround for cases where e.g. fontNameStr = 'Arial' and + // baseFontStr = 'Arial,Bold' (needed when no font file is embedded). + // + // - Workaround for cases where e.g. fontNameStr = 'wg09np' and + // baseFontStr = 'Wingdings-Regular' (fixes issue7454.pdf). + if ( + fontNameStr && + baseFontStr && + (baseFontStr.startsWith(fontNameStr) || + (!isKnownFontName(fontNameStr) && isKnownFontName(baseFontStr))) + ) { + fontName = null; } } fontName ||= baseFont; diff --git a/src/core/standard_fonts.js b/src/core/standard_fonts.js index ca447aef8..216176c44 100644 --- a/src/core/standard_fonts.js +++ b/src/core/standard_fonts.js @@ -309,6 +309,9 @@ const getSymbolsFonts = getLookupTableFactory(function (t) { t.Dingbats = true; t.Symbol = true; t.ZapfDingbats = true; + t.Wingdings = true; + t["Wingdings-Bold"] = true; + t["Wingdings-Regular"] = true; }); // Glyph map for well-known standard fonts. Sometimes Ghostscript uses CID @@ -888,6 +891,16 @@ function getStandardFontName(name) { return stdFontMap[fontName]; } +function isKnownFontName(name) { + const fontName = normalizeFontName(name); + return !!( + getStdFontMap()[fontName] || + getNonStdFontMap()[fontName] || + getSerifFonts()[fontName] || + getSymbolsFonts()[fontName] + ); +} + export { getFontNameToFileMap, getGlyphMapForStandardFonts, @@ -898,4 +911,5 @@ export { getSupplementalGlyphMapForArialBlack, getSupplementalGlyphMapForCalibri, getSymbolsFonts, + isKnownFontName, }; diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 3ebf63d39..161997e7c 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -490,6 +490,7 @@ !issue11656.pdf !annotation-fileattachment.pdf !annotation-text-widget.pdf +!issue7454.pdf !issue15443.pdf !annotation-choice-widget.pdf !issue10900.pdf diff --git a/test/pdfs/issue7454.pdf b/test/pdfs/issue7454.pdf new file mode 100644 index 000000000..448eab521 Binary files /dev/null and b/test/pdfs/issue7454.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index 8465574de..4d4bb76d0 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -5042,6 +5042,12 @@ "link": true, "type": "load" }, + { "id": "issue7454", + "file": "pdfs/issue7454.pdf", + "md5": "45889bf6a9d3e2eccd01dc48668b21e5", + "rounds": 1, + "type": "eq" + }, { "id": "bigboundingbox", "file": "pdfs/bigboundingbox.pdf", "md5": "e5c5e2cb80826d6ebf535413865270cd",