You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 00:57:32