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

Puppeteer本地(Windows)与CentOS服务器PDF生成结果不一致问题

解决CentOS上Puppeteer生成PDF字体缺失、体积过大的问题

你遇到的问题非常典型——CentOS默认字体库和Windows差异极大,而Puppeteer在headless模式下完全依赖系统字体渲染页面,这直接导致了PDF效果和体积的双重差异。下面是一步步的排查和解决方法:

1. 核心原因:CentOS缺少目标字体

Windows默认预装了Impact、Courier New这类微软系字体,但CentOS的默认字体库中并没有这些。当Puppeteer找不到指定字体时,会自动 fallback 到系统默认字体(通常是DejaVu系列),这不仅会导致字体显示异常,还会因为替换的字体未被子集化嵌入,使得PDF体积大幅增加。

2. 安装缺失的字体

方法一:安装微软核心字体包

CentOS可以通过第三方rpm包安装微软的核心字体集合,包含你需要的Impact和Courier New:

# 先安装fontconfig工具(用于管理系统字体)
sudo yum install fontconfig -y

# 下载并安装微软核心字体安装包
sudo yum install https://downloads.sourceforge.net/project/mscorefonts2/rpms/msttcore-fonts-installer-2.6-1.noarch.rpm -y

# 更新字体缓存,让系统识别新安装的字体
fc-cache -fv

方法二:手动安装字体

如果上述rpm包无法下载,你可以手动从Windows系统或可信字体源获取字体文件(比如impact.ttf、cour.ttf等),然后:

  • 创建字体目录:sudo mkdir -p /usr/share/fonts/winfonts
  • 将字体文件上传到该目录
  • 设置权限:sudo chmod 644 /usr/share/fonts/winfonts/*.ttf
  • 更新字体缓存:fc-cache -fv

3. 验证字体是否安装成功

运行以下命令确认目标字体已被系统识别:

# 检查Impact字体
fc-list | grep -i "impact"

# 检查Courier New字体
fc-list | grep -i "courier"

如果输出对应的字体路径,说明安装成功。

4. 额外优化:确保PDF生成配置正确

你的核心代码已经没问题,但可以补充以下检查:

  • 确认page.emulateMedia('screen')已设置,这会让Puppeteer使用屏幕渲染模式,和本地环境更一致
  • 在page.pdf的配置中,可添加preferCSSPageSize: true确保CSS定义的页面尺寸被正确应用
  • 可添加日志排查字体加载错误:在page.goto之前加入控制台监听
    page.on('console', msg => console.log('Page console:', msg.text()));
    

5. 体积问题的解决

当字体正确安装后,Puppeteer会自动将用到的字体子集嵌入PDF中,而非嵌入整个字体文件或使用体积更大的fallback字体,生成的PDF体积就会和本地Windows环境一致了。

按照以上步骤操作后,重新生成PDF应该就能和本地效果完全匹配了。

内容的提问来源于stack exchange,提问作者Shreyas Acharya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 03:55:44