mirror of
https://github.com/mozilla/pdf.js.git
synced 2025-04-25 09:38:06 +02:00
[api-minor] Use a local font or fallback on an embedded one (if it exists) for non-embedded fonts (bug 1766039)
- Replace FoxitSans with LiberationSans: LiberationSans is already there (for XFA) and we can use it as a good replacement of FoxitSans. - For now we just try to substitue standard fonts, the strategy is the following: * we try to find a font locally from a hardcoded list; * if it fails then we use Liberation as fallback (only for Helvetica for the moment); * else we just fallback on the system serif/sansserif/monospace font.
This commit is contained in:
parent
a24e11a91c
commit
53134c0c0b
12 changed files with 584 additions and 28 deletions
|
@ -423,6 +423,31 @@ function encodeToXmlString(str) {
|
|||
return buffer.join("");
|
||||
}
|
||||
|
||||
function validateFontName(fontFamily, mustWarn = false) {
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/CSS/string.
|
||||
const m = /^("|').*("|')$/.exec(fontFamily);
|
||||
if (m && m[1] === m[2]) {
|
||||
const re = new RegExp(`[^\\\\]${m[1]}`);
|
||||
if (re.test(fontFamily.slice(1, -1))) {
|
||||
if (mustWarn) {
|
||||
warn(`FontFamily contains unescaped ${m[1]}: ${fontFamily}.`);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident.
|
||||
for (const ident of fontFamily.split(/[ \t]+/)) {
|
||||
if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) {
|
||||
if (mustWarn) {
|
||||
warn(`FontFamily contains invalid <custom-ident>: ${fontFamily}.`);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function validateCSSFont(cssFontInfo) {
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/CSS/font-style.
|
||||
const DEFAULT_CSS_FONT_OBLIQUE = "14";
|
||||
|
@ -447,24 +472,8 @@ function validateCSSFont(cssFontInfo) {
|
|||
|
||||
const { fontFamily, fontWeight, italicAngle } = cssFontInfo;
|
||||
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/CSS/string.
|
||||
const m = /^("|').*("|')$/.exec(fontFamily);
|
||||
if (m && m[1] === m[2]) {
|
||||
const re = new RegExp(`[^\\\\]${m[1]}`);
|
||||
if (re.test(fontFamily.slice(1, -1))) {
|
||||
warn(`XFA - FontFamily contains unescaped ${m[1]}: ${fontFamily}.`);
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// See https://developer.mozilla.org/en-US/docs/Web/CSS/custom-ident.
|
||||
for (const ident of fontFamily.split(/[ \t]+/)) {
|
||||
if (/^(\d|(-(\d|-)))/.test(ident) || !/^[\w-\\]+$/.test(ident)) {
|
||||
warn(
|
||||
`XFA - FontFamily contains invalid <custom-ident>: ${fontFamily}.`
|
||||
);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
if (!validateFontName(fontFamily, true)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
const weight = fontWeight ? fontWeight.toString() : "";
|
||||
|
@ -617,6 +626,7 @@ export {
|
|||
stringToUTF16String,
|
||||
toRomanNumerals,
|
||||
validateCSSFont,
|
||||
validateFontName,
|
||||
XRefEntryException,
|
||||
XRefParseException,
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue