有没有办法从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 添加更多选项,以便对合并和优化过程进行更精细的控制。

最后,您必须在两个极端之间做出决定:
  • 'Fast' pdftk 生成大型输出文件,与
  • 对比
  • '慢' gswin32c.exe (Ghostscript) 生成精益输出文件。

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

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

    更新 3:

    由于您的源文件是由模板制作的 Excel 工作表(通常不使用很多不同的字体),您可以尝试使用一个技巧来确保 Ghostscript 具有所有需要使用的字体的所有字形 -合并后的 PDF:
  • 对于每种字体和外观(标准、斜体、粗体、粗斜体),在打印区域左上角的模板表中添加一个表格单元格。
  • 使用 ASCII 字母表中的所有可打印字符和标点符号填充此表格单元格: 0123456789ABCD...XYZabc...xyz:-_;°%&$§")({}[] 等。
  • 使单元格(和字体大小)尽可能小,以免打扰您的整体布局。使用白色来格式化单元格中的字符(因此它们在最终的 PDF 中不可见)。

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

    10-05 20:19
    查看更多