删除使用pdfTk创建的pdf中的多个嵌入字体

时间:2012-05-16 21:28:30

标签: excel pdf ghostscript embedded-fonts pdftk

有没有办法从pdf文件中删除多次嵌入的字体?

这是我的情景:

1)程序生成多个单页pdf报告(查询数据库,将信息放在Excel模板上并以pdf格式导出格式化信息)

2)pdftk将单页pdf合并到一个文件中。

一切正常,但结果pdf的大小非常大:事实上,我注意到字体嵌入了多次(与页面数一样多的时间:所有页面都是从同一个excel开始生成的模板,字体嵌入在单个pdf文件中,pdftk只是粘贴pdf)。有没有办法只记录每个嵌入字体的一个副本?

我尝试将这些字体嵌入到第一页,同时从excel导出 - > pdf:文件大小急剧减少,但似乎其他页面无法访问嵌入字体。

谢谢, 的Alessandro

2 个答案:

答案 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:

  • 对于每种字体和面(标准,斜体,粗体,粗体斜体),将表格单元格添加到打印区域左上角的模板页
  • 中。
  • 使用ASCII字母表中的所有可打印字符和标点符号填写此表格单元格:0123456789ABCD...XYZabc...xyz:-_;°%&$§")({}[]等。
  • 使单元格(和字体大小)尽可能小,以免干扰整体布局。使用白色可以格式化单元格中的字符(因此它们在最终PDF中看起来不可见)。

此方法有望确保每个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可能能够合并文档而不会多次包含相同的字体。我没有明显地测试过这个,但它可能会起作用。您的另一个选择是修改工作流程,以便首先将报告生成为多页文档。