技术背景:PDF未嵌入其使用到的字体的情况下,使用PDF引擎进行解析渲染的时候,通常会出现使用相关字体书写的内容不能正确显示或是直接显示空白页面的现象。这是因为PDF引擎在渲染PDF时会优先从PDF自身的数据结构中寻找内容相关字体的字型。如果内容相关字体没有嵌入到PDF数据结构中,则PDF引擎需要借助应用层引入的字体进行内容渲染展示。若应用层没有引入任何字体,则显示时就会出现空白页面的情况。若应用层没有引入该PDF中用到的字体,但有类似的其他字体,则PDF引擎会根据应用层引入的字体,去寻找并匹配类似字体的字型去渲染显示PDF内容,确保PDF内容的可读性。比如PDF内容生成时用的是宋体,但是保存PDF时其用到的宋体字型未嵌入到PDF中,那么PDF引擎在渲染显示该PDF时就会用缺省的开源中文字体进行显示,最终预览的效果看着像黑体。
基于前边补充的技术背景,针对上述问题,解决思路如下:
步骤一:
使用包含开源字体资源的WebSDK标准包或完整包,其中的external目录是SDK内置的开源免费字体资源,用于确保PDF中未嵌入字体的相关内容仍然可以被渲染展示出来,方便使用者可以完整阅读到PDF的内容。
开发者需要在初始化PDFViewer或pdfui实例对象时,在其构造函数中指定PDF引擎可使用的缺省字体资源路径,即fontPath参数,如`fontPath: '../external/brotli'`,fontPath参数的值,可以是项目中的相对路径,也可以是字体服务器的url地址,确保字体资源可以被有效访问到即可。
步骤二:
结合技术背景的描述可以知道,“步骤一”只能确保PDF内容的可读性,但未必能确保PDF内容的完整且正确显示。如上所述,如果待渲染的PDF中用到的是黑体相关的字型,或使用者不在乎渲染时的字体效果,只在乎内容的完整性,那么“步骤一”完成后即可满足使用场景。如果使用者要求完整且正确的显示PDF中的内容,则需要开发者根据业务需要,在应用程序中引入已购买了授权的字体文件(需要引入的字体数量取决于待渲染的PDF中未嵌入的字体数量),并为PDF引擎配置这些自定义字体的存放路径和相关参数。可以参考WebSDK中内置的Demo:`/examples/UIExtension/custom-font/`。
备注:上述解答适用于WebSDK 8.x版本 及 9.0.0版本。