有没有办法从pdf文件中删除多次嵌入的字体?
这是我的场景:
1)一个程序生成几个单页pdf报告(查询数据库,将信息放在excel模板上并以pdf格式导出格式化信息)
2) pdftk 将单页 pdf 合并到一个文件中。
一切正常,但生成的pdf的大小非常大:实际上,我注意到字体被多次嵌入(与页面数量一样多:所有页面都是从同一个excel模板开始生成的,字体嵌入在单个 pdf 文件中,而 pdftk 只是粘合 pdf)。有没有办法只保留每个嵌入字体的一个副本?
我试图在从 excel->pdf 导出时仅在第一页中嵌入字体:文件的大小急剧减小,但其他页面似乎无法访问嵌入的字体。
谢谢,
亚历山德罗
最佳答案
您可以尝试使用 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
可用作 here 作为小 package of commandline tools 的一部分)。但是不要提示这个过程的“速度慢”——Ghostscript 确实完全解释了所有的 PDF 输入文件来完成它的任务,而 pdftk 文件连接是一个更简单的过程......
更新:
您可以使用 Ghostscript 来合并输入的 PDF 文件,而不是
pdftk
。这可能可以避免您在 pdftk 合并文件的后验 Ghostscript '修复' 中看到的问题。请注意,这将比“哑巴”pdftk 合并慢得多。但是,结果可能会让您更满意,尤其是在字体处理和文件大小方面。这将是一个可能的命令:
gswin32c.exe ^
-o output.pdf ^
-sDEVICE=pdfwrite ^
-dPDFSETTINGS=/prepress ^
input.pdf
您可以向 Ghostscript CLI 添加更多选项,以便对合并和优化过程进行更精细的控制。
最后,您必须在两个极端之间做出决定:
pdftk
生成大型输出文件,与 gswin32c.exe
(Ghostscript) 生成精益输出文件。 如果您会为您的许多合并过程发布这两种方法的一些结果(执行时间和生成的文件大小),我会很感兴趣......
更新 2: 抱歉,我之前的版本包含一个错字。
它不是
-sPDFSETTINGS=...
但它必须是 -dPDFSETTINGS=...
( d 代替 s)。更新 3:
由于您的源文件是由模板制作的 Excel 工作表(通常不使用很多不同的字体),您可以尝试使用一个技巧来确保 Ghostscript 具有所有需要使用的字体的所有字形 -合并后的 PDF:
0123456789
、 ABCD...XYZ
、 abc...xyz
、 :-_;°%&$§")({}[]
等。 这种方法有望确保您的每个 PDF 都使用相同的字形子集,从而避免您在将文件与 Ghostscript 合并时观察到的问题。 (请注意,如果您使用 f.e. Arial 和 Arial-Italic,则必须创建 2 个这样的单元格:一个使用标准 Arial 字体格式化,另一个使用斜体字体。)