Merge pull request #16416 from calixteman/use_local_font_2
For missing font, use a local font if it exists even if there's no standard substitution
This commit is contained in:
		
						commit
						202496a7ca
					
				@ -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
 | 
			
		||||
        );
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -224,7 +224,6 @@ const substitutionMap = new Map([
 | 
			
		||||
  [
 | 
			
		||||
    "ArialBlack-Italic",
 | 
			
		||||
    {
 | 
			
		||||
      prepend: ["Arial Black Italic"],
 | 
			
		||||
      local: {
 | 
			
		||||
        alias: "ArialBlack",
 | 
			
		||||
        append: "Italic",
 | 
			
		||||
@ -337,6 +336,8 @@ const fontAliases = new Map([["Arial-Black", "ArialBlack"]]);
 | 
			
		||||
/**
 | 
			
		||||
 * Create the src path to use to load a font (see FontFace).
 | 
			
		||||
 * @param {Array<String>} prepend A list of font names to search first.
 | 
			
		||||
 * @param {String} appendToPrepended A String to append to the list of fonts in
 | 
			
		||||
 *  prepend.
 | 
			
		||||
 * @param {Array<String>|Object} local A list of font names to search. If an
 | 
			
		||||
 *   Object is passed, then local.alias is the name of an other substition font
 | 
			
		||||
 *   and local.append is a String to append to the list of fonts in the alias.
 | 
			
		||||
@ -344,7 +345,7 @@ const fontAliases = new Map([["Arial-Black", "ArialBlack"]]);
 | 
			
		||||
 *   list of fonts will be "FooSubst1 Bold", "FooSubst2 Bold", etc.
 | 
			
		||||
 * @returns an String with the local fonts.
 | 
			
		||||
 */
 | 
			
		||||
function makeLocal(prepend, local) {
 | 
			
		||||
function makeLocal(prepend, appendToPrepended, local) {
 | 
			
		||||
  let append = "";
 | 
			
		||||
  if (!Array.isArray(local)) {
 | 
			
		||||
    // We are getting our list of fonts in the alias and we'll append Bold,
 | 
			
		||||
@ -352,9 +353,14 @@ function makeLocal(prepend, local) {
 | 
			
		||||
    append = ` ${local.append}`;
 | 
			
		||||
    local = substitutionMap.get(local.alias).local;
 | 
			
		||||
  }
 | 
			
		||||
  if (appendToPrepended) {
 | 
			
		||||
    appendToPrepended = ` ${appendToPrepended}`;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  let prependedPaths = "";
 | 
			
		||||
  if (prepend) {
 | 
			
		||||
    prependedPaths = prepend.map(name => `local(${name})`).join(",") + ",";
 | 
			
		||||
    prependedPaths =
 | 
			
		||||
      prepend.map(name => `local(${name}${appendToPrepended})`).join(",") + ",";
 | 
			
		||||
  }
 | 
			
		||||
  return (
 | 
			
		||||
    prependedPaths + local.map(name => `local(${name}${append})`).join(",")
 | 
			
		||||
@ -378,8 +384,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 +443,8 @@ function getFontSubstitution(
 | 
			
		||||
      (italic && ITALIC) ||
 | 
			
		||||
      NORMAL;
 | 
			
		||||
    substitutionInfo = {
 | 
			
		||||
      css: `${loadedName},sans-serif`,
 | 
			
		||||
      css: loadedName,
 | 
			
		||||
      guessFallback: true,
 | 
			
		||||
      loadedName,
 | 
			
		||||
      src: `local(${baseFontName})`,
 | 
			
		||||
      style,
 | 
			
		||||
@ -457,16 +464,20 @@ function getFontSubstitution(
 | 
			
		||||
 | 
			
		||||
  // Prepend the fonts to test before the fallback font.
 | 
			
		||||
  let prepend = substitution.prepend;
 | 
			
		||||
  let appendToPrepended = "";
 | 
			
		||||
 | 
			
		||||
  if (fallback) {
 | 
			
		||||
    // We've a fallback font: this one is a standard font we want to use in case
 | 
			
		||||
    // nothing has been found from the prepend list.
 | 
			
		||||
    prepend ||= substitutionMap.get(substitution.local.alias).prepend;
 | 
			
		||||
    if (substitution.local) {
 | 
			
		||||
      prepend ||= substitutionMap.get(substitution.local.alias).prepend;
 | 
			
		||||
      appendToPrepended = substitution.local.append;
 | 
			
		||||
    }
 | 
			
		||||
    substitution = substitutionMap.get(fallback);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const { local, path, ultimate } = substitution;
 | 
			
		||||
  let src = makeLocal(prepend, local);
 | 
			
		||||
  let src = makeLocal(prepend, appendToPrepended, local);
 | 
			
		||||
  if (path && localFontPath !== null) {
 | 
			
		||||
    // PDF.js embeds some fonts we can use.
 | 
			
		||||
    src += `,url(${localFontPath}${path})`;
 | 
			
		||||
@ -480,6 +491,7 @@ function getFontSubstitution(
 | 
			
		||||
 | 
			
		||||
  substitutionInfo = {
 | 
			
		||||
    css: `${loadedName},${ultimate}`,
 | 
			
		||||
    guessFallback: false,
 | 
			
		||||
    loadedName,
 | 
			
		||||
    src,
 | 
			
		||||
    style,
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
@ -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";
 | 
			
		||||
 | 
			
		||||
@ -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;
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user