diff --git a/src/core/evaluator.js b/src/core/evaluator.js index 4baf3ffe2759aa..031e051a4ca6a3 100644 --- a/src/core/evaluator.js +++ b/src/core/evaluator.js @@ -3921,6 +3921,9 @@ class PartialEvaluator { } if (isMonospace) { properties.flags |= FontFlags.FixedPitch; + } else { + // Clear the flag. + properties.flags &= ~FontFlags.FixedPitch; } properties.defaultWidth = defaultWidth; @@ -4197,15 +4200,15 @@ class PartialEvaluator { if (standardFontName) { file = await this.fetchStandardFontData(standardFontName); properties.isInternalFont = !!file; - if (!properties.isInternalFont && this.options.useSystemFonts) { - properties.systemFontInfo = getFontSubstitution( - this.systemFontCache, - this.idFactory, - this.options.standardFontDataUrl, - baseFontName, - standardFontName - ); - } + } + if (!properties.isInternalFont && this.options.useSystemFonts) { + properties.systemFontInfo = getFontSubstitution( + this.systemFontCache, + this.idFactory, + this.options.standardFontDataUrl, + baseFontName, + standardFontName + ); } return this.extractDataStructures(dict, dict, properties).then( newProperties => { @@ -4310,15 +4313,15 @@ class PartialEvaluator { if (standardFontName) { fontFile = await this.fetchStandardFontData(standardFontName); isInternalFont = !!fontFile; - if (!isInternalFont && this.options.useSystemFonts) { - systemFontInfo = getFontSubstitution( - this.systemFontCache, - this.idFactory, - this.options.standardFontDataUrl, - fontName.name, - standardFontName - ); - } + } + if (!isInternalFont && this.options.useSystemFonts) { + systemFontInfo = getFontSubstitution( + this.systemFontCache, + this.idFactory, + this.options.standardFontDataUrl, + fontName.name, + standardFontName + ); } } diff --git a/src/core/font_substitutions.js b/src/core/font_substitutions.js index bc576aa6d1fd3b..3c7e7fadfc873e 100644 --- a/src/core/font_substitutions.js +++ b/src/core/font_substitutions.js @@ -354,7 +354,8 @@ function makeLocal(prepend, local) { } let prependedPaths = ""; if (prepend) { - prependedPaths = prepend.map(name => `local(${name})`).join(",") + ","; + prependedPaths = + prepend.map(name => `local(${name}${append})`).join(",") + ","; } return ( prependedPaths + local.map(name => `local(${name}${append})`).join(",") @@ -378,8 +379,8 @@ function makeLocal(prepend, local) { * @param {Object} idFactory The ids factory. * @param {String} localFontPath Path to the fonts directory. * @param {String} baseFontName The font name to be substituted. - * @param {String} standardFontName The standard font name to use if the base - * font is not available. + * @param {String|undefined} standardFontName The standard font name to use + * if the base font is not available. * @returns an Object with the CSS, the loaded name, the src and the style. */ function getFontSubstitution( @@ -437,7 +438,8 @@ function getFontSubstitution( (italic && ITALIC) || NORMAL; substitutionInfo = { - css: `${loadedName},sans-serif`, + css: loadedName, + guessFallback: true, loadedName, src: `local(${baseFontName})`, style, @@ -480,6 +482,7 @@ function getFontSubstitution( substitutionInfo = { css: `${loadedName},${ultimate}`, + guessFallback: false, loadedName, src, style, diff --git a/src/core/fonts.js b/src/core/fonts.js index 62502cfa1e0930..5fbacdba3e5ee4 100644 --- a/src/core/fonts.js +++ b/src/core/fonts.js @@ -986,6 +986,7 @@ class Font { let { type, subtype } = properties; this.type = type; this.subtype = subtype; + this.systemFontInfo = properties.systemFontInfo; const matches = name.match(/^InvalidPDFjsFont_(.*)_\d+$/); this.isInvalidPDFjsFont = !!matches; @@ -999,7 +1000,10 @@ class Font { this.fallbackName = "sans-serif"; } - this.systemFontInfo = properties.systemFontInfo; + if (this.systemFontInfo?.guessFallback) { + this.systemFontInfo.css += `,${this.fallbackName}`; + } + this.differences = properties.differences; this.widths = properties.widths; this.defaultWidth = properties.defaultWidth; diff --git a/src/core/standard_fonts.js b/src/core/standard_fonts.js index 9f025adf31396a..e3e835a674a0e2 100644 --- a/src/core/standard_fonts.js +++ b/src/core/standard_fonts.js @@ -58,6 +58,9 @@ const getStdFontMap = getLookupTableFactory(function (t) { t["Arial-BoldItalicMT"] = "Helvetica-BoldOblique"; t["Arial-BoldMT"] = "Helvetica-Bold"; t["Arial-ItalicMT"] = "Helvetica-Oblique"; + t["Arial-BoldItalicMT-BoldItalic"] = "Helvetica-BoldOblique"; + t["Arial-BoldMT-Bold"] = "Helvetica-Bold"; + t["Arial-ItalicMT-Italic"] = "Helvetica-Oblique"; t.ArialUnicodeMS = "Helvetica"; t["ArialUnicodeMS-Bold"] = "Helvetica-Bold"; t["ArialUnicodeMS-BoldItalic"] = "Helvetica-BoldOblique"; diff --git a/src/display/font_loader.js b/src/display/font_loader.js index dce51fafb3b6bf..08700e2ae53cb4 100644 --- a/src/display/font_loader.js +++ b/src/display/font_loader.js @@ -97,9 +97,17 @@ class FontLoader { await fontFace.load(); this.#systemFonts.add(loadedName); } catch { - warn( - `Cannot load system font: ${loadedName} for style ${style.style} and weight ${style.weight}.` - ); + if (info.guessFallback) { + // We're trying to load only one system font. + const match = src.match(/^local\((.*)\)$/); + warn( + `Cannot load system font: ${match?.[1]}, installing it could help to improve PDF rendering.` + ); + } else { + warn( + `Cannot load system font: ${loadedName} for style ${style.style} and weight ${style.weight}.` + ); + } this.removeNativeFontFace(fontFace); } return;