有没有办法从pdf文件中删除多次嵌入的字体?
这是我的情景:
1)程序生成多个单页pdf报告(查询数据库,将信息放在Excel模板上并以pdf格式导出格式化信息)
2)pdftk将单页pdf合并到一个文件中。
一切正常,但结果pdf的大小非常大:事实上,我注意到字体嵌入了多次(与页面数一样多的时间:所有页面都是从同一个excel开始生成的模板,字体嵌入在单个pdf文件中,pdftk只是粘贴pdf)。有没有办法只记录每个嵌入字体的一个副本?
我尝试将这些字体嵌入到第一页,同时从excel导出 - > pdf:文件大小急剧减少,但似乎其他页面无法访问嵌入字体。
谢谢, 的Alessandro
答案 0 :(得分:4)
您可以尝试使用Ghostscript“修复”pdftk连接的PDF(但使用最新版本,例如9.05)。在许多情况下,Ghostscript将能够将许多子集化字体合并为更少的字体。
命令如下所示:
gswin32c.exe ^
-o output.pdf ^
-sDEVICE=pdfwrite ^
-dPDFSETTINGS=/prepress ^
input.pdf
检查
pdffonts.exe output.pdf
pdffonts.exe input.pdf
每个文件中有多少个字体子集实例(pdffonts.exe
可用here作为小package of commandline tools的一部分。)
但是不要抱怨这个过程的“慢速”--Ghostscript会完全解释所有PDF输入文件来完成它的任务,而pdftk文件连接是一个更简单的过程......
<强>更新强>
您可以使用Ghostscript合并输入的PDF文件,而不是pdftk
。这可能可以避免您使用pdftk合并文件的后验Ghostscript'修复'看到的问题。注意,这将比'dumb'pdftk merge 慢得多。但是,结果可能会让您更好,尤其是字体处理和文件大小。
这可能是一个命令:
gswin32c.exe ^
-o output.pdf ^
-sDEVICE=pdfwrite ^
-dPDFSETTINGS=/prepress ^
input.pdf
您可以向Ghostscript CLI添加更多选项,以便对合并和优化过程进行更精细的控制。
最后,你必须在两个极端之间做出决定:
pdftk
生成大型输出文件,vs。gswin32c.exe
(Ghostscript)生成精益输出文件。如果您为多个合并流程发布两种方法的结果(执行时间和结果文件大小),我会感兴趣...
更新2:抱歉,我以前的版本包含了拼写错误
它不是-sPDFSETTINGS=...
,但必须是-dPDFSETTINGS=...
( d 代替 s )。
更新3:
由于您的源文件是由模板制作的Excel工作表(通常不使用大量不同的字体),您可以尝试使用技巧来确保Ghostscript具有所有所需字体的所有必需字形。 -be-merged-later PDF:
0123456789
,ABCD...XYZ
,abc...xyz
,:-_;°%&$§")({}[]
等。此方法有望确保每个PDF都使用相同的字形子集,从而避免在将文件与Ghostscript合并时遇到的问题。 (注意,如果你使用fe Arial和Arial-Italic,你必须创建2个这样的单元格:一个用标准Arial字体格式化,另一个用斜体字体格式化。)
答案 1 :(得分:3)
字体通常是创建PDF文件时的子集,因此它们只包含所需的字形。此外,编码被更改,以便使用的第一个字形分配字符代码1,第二个字符代码为2,依此类推。
因此,第一个PDF文件可能包含一个字体,其中0x01 = A,0x02 =空格,0x03 = t,0x04 = e和0x05 = s。第二个文件可能包含一个字体,其中0x01 = T,0x02 = e,0x03 = s,0x04 = t
为了不混淆,在文档中的字体名称中添加了一个前缀。显示字体嵌入时,Acrobat会删除此前缀,因此似乎就像您有多个相同字体的实例一样。然而,它们实际上是不同的字体,并且不能轻易组合。
假设是这种情况(我需要确定你的文件确实存在),可能有可能避免这种情况。如果您设置PDF生成软件使其不是子集字体,则pdftk可能能够合并文档而不会多次包含相同的字体。我没有明显地测试过这个,但它可能会起作用。您的另一个选择是修改工作流程,以便首先将报告生成为多页文档。