7

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

这是我的场景:

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

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

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

我尝试在从 excel->pdf 导出时仅在第一页中嵌入字体:文件的大小显着减小,但其他页面似乎无法访问嵌入的字体。

谢谢,亚历山德罗

4

2 回答 2

7

您可以尝试使用 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 文件连接是一个更简单的过程......


更新:

而不是pdftk您可以使用 Ghostscript 来合并您的输入 PDF 文件。这可能会避免您在对 pdftk 合并文件进行后验 Ghostscript“修复”时看到的问题。请注意,这将比 'dumb' pdftk merge 慢得多。但是,结果可能会让您更满意,尤其是在字体处理和文件大小方面。

这将是一个可能的命令:

gswin32c.exe ^
    -o output.pdf ^
    -sDEVICE=pdfwrite ^
    -dPDFSETTINGS=/prepress ^
     input.pdf

您可以向 Ghostscript CLI 添加更多选项,以便对合并和优化过程进行更精细的控制。

最后,您必须在两个极端之间做出决定:

  • '快速'pdftk产生大的输出文件,与
  • 'Slow' gswin32c.exe(Ghostscript) 生成精益输出文件。

如果您为您的许多合并过程发布这两种方法的一些结果(执行时间和生成的文件大小),我会很感兴趣......


更新 2: 对不起,我以前的版本包含一个错字。
不是-sPDFSETTINGS=...,但必须是-dPDFSETTINGS=...d代替s)。


更新 3:

由于您的源文件是由模板制作的 Excel 工作表(通常不会使用很多不同的字体),您可以尝试使用一种技巧来确保 Ghostscript 具有所有将要使用的字体的所有必需字形合并后的 PDF:

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

这种方法有望确保您的每个 PDF 将使用相同的字形子集,从而避免您在使用 Ghostscript 合并文件时观察到的问题。(请注意,如果您使用 fe Arial 和 Arial-Italic,则必须创建 2 个这样的单元格:一个使用标准 Arial 字体格式化,另一个使用斜体字体。

于 2012-05-17T09:28:32.070 回答
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 可能能够在不多次包含相同字体的情况下合并文档。我显然没有对此进行过测试,但它可能会起作用。您的另一个选择是修改您的工作流程,以便首先将报告生成为多页文档。

于 2012-05-17T07:25:30.080 回答