# Foxit PDF SDK for Web 中新字体的策略和使用方法

# 背景

Foxit PDF SDK for Web 允许开发者自定义字体,以满足个性化的需求。然而,当前端引入新的字体时,如果 SDK 底层引擎的字体信息列表中没有相应的记录,就会出现字体匹配不准确的问题,导致文档中的文本显示为错误的字体。为了解决这个问题,我们需要将前端所支持的所有字体信息,包括字体名称、样式等,传递给 SDK 底层引擎。通过这种方式,SDK 底层引擎就可以在渲染文档时,根据文档中的字体信息,从前端提供的字体信息列表中找到匹配的字体,从而确保文档的正确显示。

# 如何配置字体信息文件

Foxit PDF SDK for Web 提供了一个名为 fontInfoPath 的配置参数,允许用户根据自己的需求自定义字体信息列表。具体用法可以参考下面的示例。

# 如何生成字体信息列表文件

Foxit PDF SDK for Web 提供了一个字体信息生成工具 (见 package 中的 /server/gen-font-info 文件夹),用于创建字体信息列表文件。

该文件主要包含以下字体信息: family name, sub-family name, face index, postscript name, code page 等。

# 如何使用

  • Foxit PDF SDK for Web 在 package 的 /external 文件夹中提供了一些开源字体。因此,Foxit PDF SDK for Web 将根据这些开源字体生成一个名为 fileInfo.csv 的字体信息文件。

  • 如果用户需要使用自定义字体,可以根据自定义的字体生成一个新的字体信息文件,如 fileInfoNew.csv。或者,也可以将自定义字体信息追加到现有的 fileInfo.csv 文件中。

  • 在使用这种字体策略时,需要结合使用 PDFView.setJRFontMap

备注:在字体匹配时,我们依据的是字体的 "family name",其对应于 fileInfo.csv 文件的 F 列,并且区分大小写。

# 示例

const pdfui = new PDFUI({
    viewerOptions: {
        jr: {
            fontPath: '../external/brotli',
            fontInfoPath: '../external/brotli/fontInfo.csv',   // Set the path for the font information file.
            licenseSN,
            licenseKey,
            brotli:{
                core:false
            },
        },
    },
    customs: {
    },
    appearance,
    renderTo: '#pdf-ui',
    fragments: [],
    addons: []
});
// Add custom fonts
var fontMaps = [
    {
        nameMatches: [/Arial/i],
        glyphs: [
            {
                // bold: -1,
                flags: -1 ,
                url: 'http://<hostname>/unitTest/font/ARIAL.TTF'
            }
        ],
        charsets: [0]
    }
]
pdfui.getPDFViewer().then(function (viewer) {
    viewer.setJRFontMap(fontMaps)
})

# 备注

在手型模式下,当直接从浏览器复制富文本并将其粘贴到 PDFViewer 中时,Foxit PDF SDK for Web 会将其添加为 Typewriter 注释。然而,从浏览器复制的大多数字体通常是系统字体,如 "-apple-system","BlinkMacSystemFont","Segoe UI","Roboto","Oxygen","Ubuntu","Fira Sans","Droid Sans","Helvetica Neue","sans-serif"。在使用此功能时,建议根据系统平台指定特定字体,以便 Foxit PDF SDK for Web 的字体引擎能更好地识别它。否则,字体引擎将无法知道应用层正在使用哪种字体,可能导致无法正确显示复制和粘贴的内容。

因此,在使用此功能时,Foxit PDF SDK for Web 默认在 Windows 平台上使用 "Dengxian Light" 字体,在 Mac 平台上使用 "PingFangSC" 字体。应用层需要按照第三方字体的流程将字体加载进来。