【问题标题】:Remove multiple embedded font in pdf created with pdfTk删除使用 pdfTk 创建的 pdf 中的多个嵌入字体
【发布时间】:2012-05-24 12:19:51
【问题描述】:

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

这是我的场景:

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

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

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

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

谢谢, 亚历山德罗

【问题讨论】:

  • 您能否提供 2-3 个单页 PDF 示例? (如果原始数据太敏感,也许使用虚拟数据?)
  • 您能否为一些输入文件添加pdffonts input.pdf 的输出,以及为pdftk 从同一组输入创建的文件添加pdffonts output.pdf
  • 对不起,我没有在这里看到你的 cmets。我在下面写了如何使用虚拟单词文件重现我的问题。是否可以通过某种方式上传文件?我会尽快下载我电脑上没有安装的 pdffonts,我会告诉你的。
  • 我在dropbox.com/sh/l3nmw23ycfs2s8e/W5bdqjXOik上传了我的虚拟示例文件

标签: excel pdf ghostscript embedded-fonts pdftk


【解决方案1】:

您可以尝试使用 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“修复”时看到的问题。请注意,这将比 'dumb' 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 合并文件时观察到的问题。 (注意,如果您使用 fe Arial 和 Arial-Italic,您必须创建 2 个这样的单元格:一个使用标准 Arial 字体格式化,另一个使用斜体格式化。

【讨论】:

  • 感谢 pipitas:您的解决方案似乎工作得很好,但是:1)在生成过程中收到几个警告(**** 警告:考虑 '0000000000 XXXXX n' 作为免费条目。) 2 ) 最后我得到这个评论:**** 这个文件有错误被修复或忽略。 **** 该文件由以下人员生成:**** >>>> itext-paulo (lowagie.com)[JDK1.1] - build 132
  • 再次感谢 pipitas:我尝试使用 gs 而不是 pdftk 来合并 pdf,但结果是一样的:文件很小(如在 excel->pdftk->gs 过程中)但是缺少某些字符(更好的是,它们存在但未呈现)。我使用了以下命令:gswin64 -sPDFSETTINGS=prepress -dBATCH -sDEVICE=pdfwrite -sOutputFile=output.pdf pdffile1.pdf pdffile2.pdf。我还尝试在第一页添加缺少的字符,然后它们出现在所有文档中。我认为这个问题与 KenS 解释的字体被子集化(而不是嵌入)有关。
  • 我可以用这种方式复制我的问题:我创建了2个新的word文档(word 2010,win7 64bit),第一个带有字母“a”,第二个带有字符“%”并保存它们为 a.pdf 和 b.pdf。运行命令“gswin64 -sPDFSETTINGS=prepress -dBATCH -sDEVICE=pdfwrite -sOutputFile=output_gs.pdf a.pdf b.pdf”。我得到一个文件,在第二页中,“%”未呈现。
  • pipitas,尝试使用“gswin64 -dPDFSETTINGS=/prepress -dBATCH -sDEVICE=pdfwrite -sOutputFile=output_gs.pdf a.pdf b.pdf”和“gswin64 -sPDFSETTINGS=prepress -dBATCH -sDEVICE= pdfwrite -sOutputFile=output_gs.pdf a.pdf b.pdf”:相同的结果(顺便说一句,“-sPDFSETTINGS=prepress”和“-dPDFSETTINGS=/prepress”有什么区别?)。你看过我上传的文件吗(我在dropbox.com/sh/l3nmw23ycfs2s8e/W5bdqjXOik上传了我的虚拟示例文件)?
  • @AleV: -sPDFSET... 是错误的语法,不会产生想要的效果。它必须-dPDFSET...。还有必须=/prepress处有前导斜线。
【解决方案2】:

创建 PDF 文件时,字体通常是子集,因此它们只包含所需的字形。此外,编码被更改,因此使用的第一个字形被分配字符代码 1,第二个被分配字符代码 2,依此类推。

因此,第一个 PDF 文件可能包含 0x01 = A、0x02 = 空格、0x03 = t、0x04 = e 和 0x05 = s 的字体。第二个文件可能包含一个字体,其中 0x01 = T, 0x02 = e, 0x03 =s, 0x04 = t

为了不混淆,在文档中的字体名称中添加了前缀。 Acrobat 在显示嵌入的字体时会删除此前缀,因此 似乎 您有多个相同字体的实例。但实际上它们是不同的字体,不能轻易组合。

假设是这种情况(我需要查看您的文件以确定),“可能”可以避免这种情况。如果您将 PDF 生成软件设置为不使用子集字体,那么 pdftk 可能能够合并文档而无需多次包含相同的字体。我显然没有对此进行过测试,但它可能会起作用。您的另一个选择是修改您的工作流程,以便首先将报告生成为多页文档。

【讨论】:

  • 谢谢肯斯。选项 2 对我的场景不切实际:我尝试 1)将 excel 单个报告合并到具有多个工作表的单个 excel 文件中-> 由于存在数据透视表、表格、命名范围和链接图表,其名称和引用是一场噩梦制造冲突或迷失方向。 2)将范围粘贴到word文档中->它可以工作,但是复制粘贴操作并不令人满意。选项 1 似乎很有希望,但我不知道如何在创建 pdf 时嵌入(而不是子集)字体:我在 excel saveas pdf 选项中没有找到这个选项(我没有蒸馏器)。
猜你喜欢
  • 1970-01-01
  • 2013-07-16
  • 2014-05-28
  • 2012-08-13
  • 2011-11-23
  • 2016-08-29
  • 2021-11-10
  • 2013-01-02
  • 1970-01-01
相关资源
最近更新 更多