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
相关产品推荐
相关产品推荐

