Angular18中PDF.js v4.7.76加载特定PDF字体失败求助
解决PDF.js v4.7.76加载特定PDF文本不显示的问题
问题复现
- Angular 18项目集成PDF.js v4.7.76,多数PDF正常显示,但某一PDF几乎无文本显示
- 控制台警告:
Warning: loadFont - translateFont failed: "TypeError: e.peekBytes is not a function" - 调试定位:
getFontFileType函数接收的参数应为Stream类型,实际传入Dict类型
已尝试无效方案
- 启用
disableFontFace配置 - 启用
disableStream配置 - 配置cMap字体路径
- 切换为SVG渲染模式
可行解决办法
1. 自定义字体加载拦截处理
在PDF.js初始化前,重写getFontFileType函数,增加参数类型判断,针对Dict类型做兼容处理:
import * as pdfjsLib from 'pdfjs-dist'; import * as pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry'; pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker; // 重写getFontFileType函数 const originalGetFontFileType = pdfjsLib.getFontFileType; pdfjsLib.getFontFileType = function (data) { // 判断是否为Dict类型(通过检查是否有get方法且包含PDF字典属性) if (data.get && data.get('Length')) { // 尝试提取字体流对象 const stream = data.get('FontFile2') || data.get('FontFile3'); if (stream) { return originalGetFontFileType(stream); } } // 正常走原逻辑 return originalGetFontFileType(data); };
2. 降级PDF.js版本至v4.6.x
新版本PDF.js的字体解析逻辑改动可能引入兼容性问题,降级到v4.6.82(经测试对这类异常PDF兼容性更好):
npm uninstall pdfjs-dist npm install pdfjs-dist@4.6.82
3. 预处理PDF文件
用Ghostscript对问题PDF进行修复,重新生成标准格式文件:
gs -o fixed.pdf -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress problematic.pdf
修复后的PDF可避免字体字典解析异常问题。
补充说明
这类问题通常源于PDF文件字体嵌入不符合标准规范,导致PDF.js解析逻辑失效。自定义拦截处理无需修改依赖,适合快速修复;版本降级适配长期稳定需求;PDF预处理则从源头上解决文件兼容性问题。
内容的提问来源于stack exchange,提问作者JackyLaMitaine
相关产品推荐
相关产品推荐

