如何让Ghostscript 10仅加载一次字体,恢复Ghostscript 9的高效性能?
问题现象
在Debian 11/Bullseye系统中,用Ghostscript 9.53.3处理example.pdf时,字体仅加载一次,性能正常:
bullseye$ gs -sOutputFile=page-%04d.png -dNOPAUSE -dBATCH -sDEVICE=png16m -r108 example.pdf GPL Ghostscript 9.53.3 (2020-10-01) Copyright (C) 2020 Artifex Software, Inc. All rights reserved. This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY: see the file COPYING for details. Processing pages 1 through 8154. Page 1 Loading NimbusSans-Bold font from /usr/share/ghostscript/9.53.3/Resource/Font/NimbusSans-Bold... 4466348 2932264 35444440 32057018 4 done. Page 2 Page 3 Page 4 Page 5 Page 6 Page 7 Page 8 ...
但在Debian 12/Bookworm系统中,Ghostscript 10.0.0会反复加载字体,占用大量资源,性能远低于旧版本:
bookworm$ gs -sOutputFile=page-%04d.png -dNOPAUSE -dBATCH -sDEVICE=png16m -r108 example.pdf GPL Ghostscript 10.0.0 (2022-09-21) Copyright (C) 2022 Artifex Software, Inc. All rights reserved. This software is supplied under the GNU AGPLv3 and comes with NO WARRANTY: see the file COPYING for details. Processing pages 1 through 8154. Page 1 Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Page 2 Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Page 3 Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold Loading font Helvetica-Bold (or substitute) from /usr/share/ghostscript/10.00.0/Resource/Font/NimbusSans-Bold ...
Ghostscript 9与10的核心变化
- 9.x版本默认启用全局字体缓存,加载过的字体会一直保留在内存里,后续页面直接复用,不会重复加载
- 10.x版本为了降低默认内存占用,调整了缓存策略:对于使用替代字体(比如PDF里的Helvetica映射到NimbusSans)的场景,每次遇到字体请求都会触发加载检查,虽然实际可能没有重复读取磁盘,但日志输出和临时内存分配会导致性能下降,尤其是大文件
- 10.x的字体加载日志更详细,每一次字体请求都会打印加载信息,这也是日志里看起来反复加载的直接原因
恢复高效性能的方法
1. 用loadallfonts预加载字体
loadallfonts是Ghostscript的PostScript指令,能在处理PDF前把所有内置字体一次性加载到缓存,后续处理时直接调用,不会再触发加载流程。执行命令时要把指令放在PDF文件之前,格式如下:
gs -c "loadallfonts" -f -sOutputFile=page-%04d.png -dNOPAUSE -dBATCH -sDEVICE=png16m -r108 example.pdf
解释:-c用来执行PostScript代码,-f用来切换回处理输入文件的模式,必须放在PDF文件名前面。这个方法能彻底解决反复加载的问题,适合字体重复度高的大文件,但如果PDF用了很多特殊字体,预加载会占用更多内存,需要根据系统配置权衡。
2. 增大字体缓存上限
通过-dMaxFontCache参数设置更大的字体缓存,让Ghostscript保留已加载的字体,避免频繁释放和重新加载:
gs -dMaxFontCache=100000000 -sOutputFile=page-%04d.png -dNOPAUSE -dBATCH -sDEVICE=png16m -r108 example.pdf
数值单位是字节,这里设的是100MB,你可以根据系统内存调整大小,足够大的缓存能让Ghostscript把常用字体一直存在内存里。
3. 配置系统字体替代内置字体
如果PDF用的是标准字体(比如Helvetica、Times),可以让Ghostscript优先用系统安装的对应字体(比如Nimbus Sans、Liberation Fonts),减少替代字体的加载开销。编辑Ghostscript的配置文件(通常在/etc/ghostscript/10.00.0/fonts.conf),添加系统字体路径,或者直接指定字体映射规则。
关于loadallfonts的有效性
loadallfonts确实能解决你遇到的问题,它在初始化阶段就把所有Resource/Font目录下的字体加载到内存缓存,后续处理PDF时直接从缓存调用,不会再触发加载流程。唯一需要注意的是,如果你的PDF包含大量特殊字体,预加载会占用较多内存,需要根据自己的系统资源情况调整。
内容的提问来源于stack exchange,提问作者Lemming

