您可以尝试使用Ghostscript(但要使用最新版本,如9.05)“修复”您的pdftk合并PDF。在许多情况下,Ghostscript将能够将许多子集字体合并为较少数量的字体。
命令如下:
gswin32c.exe ^
-o output.pdf ^
-sDEVICE=pdfwrite ^
-dPDFSETTINGS=/prepress ^
input.pdf
请检查
pdffonts.exe output.pdf
pdffonts.exe input.pdf
每个文件中各种字体子集的实例数(
pdffonts.exe
可在
此处作为一小部分
命令行工具包中获得)。
但是不要抱怨这个过程的“缓慢”——Ghostscript需要完全解释所有PDF输入文件以完成其任务,而pdftk文件连接则是一个更简单的过程...
更新:
您可以使用Ghostscript代替
pdftk
来合并输入的PDF文件。这可能可以避免您在后期使用Ghostscript对您的pdftk合并文件进行“修复”时所看到的问题。请注意,
这会比“愚蠢的” pdftk 合并慢得多。但是,结果可能更加令人满意,特别是涉及字体处理和文件大小方面。
下面是一个可能的命令:
gswin32c.exe ^
-o output.pdf ^
-sDEVICE=pdfwrite ^
-dPDFSETTINGS=/prepress ^
input.pdf
您可以在Ghostscript CLI中添加更多选项,以更精细地控制合并和优化过程。最终,您将不得不在以下极端之间做出决定:
- '快速'的
pdftk
生成大型输出文件,与
- '缓慢'的
gswin32c.exe
(Ghostscript)生成瘦身的输出文件。
如果您能为一些合并过程的两种方法发布一些结果(执行时间和生成的文件大小),我会很感兴趣...
更新2:抱歉,我的先前版本中有一个错别字。不是
-sPDFSETTINGS=...
,而是必须是
-dPDFSETTINGS=...
(在
s的位置上使用
d)。
更新3:由于您的源文件是从模板创建的Excel表格(通常不使用许多不同的字体),因此您可以尝试使用一个技巧,以确保Ghostscript具有稍后要合并的所有PDF中使用的字体的所有所需字形:
- 对于每个字体和字形(标准、斜体、粗体、粗斜体),在您的模板工作表的左上角添加一个表单元格,该单元格位于您的打印区域的左上角。
- 使用ASCII字母表中的所有可打印字符和标点符号填写此表单元格:
0123456789
、
ABCD...XYZ
、
abc...xyz
、
:-_;°%&$§")({}[]
等。
- 将单元格(和字体大小)缩小到您需要的任何大小,以便不会干扰整体布局。使用白色来格式化单元格中的字符(这样它们在最终PDF中看起来是不可见的)。
这种方法有望确保每个PDF都使用相同的字形子集,从而避免您在使用Ghostscript合并文件时观察到的问题。(
请注意,如果您使用Arial和Arial-Italic等,则必须创建2个这样的单元格:一个用标准Arial字体格式化,另一个用斜体格式化。)
pdffonts input.pdf
的输出结果,以及为pdftk
从相同的输入集创建的文件添加pdffonts output.pdf
的输出结果? - Kurt Pfeifle