Improve handling of mismatching /BaseFont and /FontName entries for non-embedded fonts (issue 7454)
This patch is the result of me going through some old issues regarding non-embedded Wingdings support. There's a few different things wrong in the referenced PDF document: - The /BaseFont and /FontName entries don't agree on the name of the fonts, with one font using `/BaseFont /Wingdings-Regular` and `/FontName /wg09np` which obviously makes no sense. To address this we'll compare the font-names against our lists of known ones and ignore /FontName entries that don't make sense iff the /BaseFont entry is a known font-name. - The non-embedded Wingdings font also set an incorrect /Encoding, in this case /MacRomanEncoding, which should have been fixed by PR 16465. However this doesn't work since the font has *bogus* font-flags, that fail to categorize the font as Symbolic. To address this we'll also compare the font-name against the list of known symbol fonts.
This commit is contained in:
parent
0023c4a511
commit
459d26edec
@ -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) {
|
||||
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
|
||||
// - 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;
|
||||
}
|
||||
//
|
||||
// - 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;
|
||||
|
@ -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,
|
||||
};
|
||||
|
1
test/pdfs/.gitignore
vendored
1
test/pdfs/.gitignore
vendored
@ -490,6 +490,7 @@
|
||||
!issue11656.pdf
|
||||
!annotation-fileattachment.pdf
|
||||
!annotation-text-widget.pdf
|
||||
!issue7454.pdf
|
||||
!issue15443.pdf
|
||||
!annotation-choice-widget.pdf
|
||||
!issue10900.pdf
|
||||
|
BIN
test/pdfs/issue7454.pdf
Normal file
BIN
test/pdfs/issue7454.pdf
Normal file
Binary file not shown.
@ -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",
|
||||
|
Loading…
Reference in New Issue
Block a user