删除使用pdfTk创build的pdf中的多个embedded字体

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

这是我的场景:

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

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

一切工作正常,但由此产生的PDF的大小是非常大的:事实上,我注意到,字体是embedded多次(尽可能多的时间作为页面的数量:所有页面生成从相同的Excel模板开始,字体被embedded在单个pdf文件中,pdftk只是粘合了pdf文件)。 有没有办法只keet每个embedded的字体的一个副本?

我尝试从excel-> pdf导出时只是在第一页中embedded字体:文件的大小急剧下降,但似乎其他页面不能访问embedded的字体。

谢谢,亚历山德罗

您可以尝试使用Ghostscript“修复”您的pdftk-concatenated PDF(但使用最新版本,如9.05)。 在许多情况下,Ghostscript将能够将许多子集字体合并成更less的字体。

该命令将如下所示:

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

检查

 pdffonts.exe output.pdf pdffonts.exe input.pdf 

每个文件中有多less个不同的字体子集实例( pdffonts.exe 在这里可以作为一pdffonts.exe 命令行工具的一部分 )。

但不要抱怨这个过程的“慢速”–Ghostscript确实解释了所有的PDFinput文件来完成它的任务,而pdftk文件连接是一个更简单的过程…


更新:

您可以使用Ghostscript来合并您的inputPDF文件,而不是使用pdftk 。 这可能可以避免你看到一个后天Ghostscript“修复”你的pdftk合并文件的问题。 请注意, 这将比“愚蠢的”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文件:

  • 对于每种字体和面孔(标准,斜体,粗体,粗斜体),在打印区域左上方的模板表格中添加一个表格单元格。
  • 使用ASCII字母表中的所有可打印字符和标点符号填充此表格单元格: 0123456789ABCD...XYZabc...xyz:-_;°%&$§")({}[]
  • 使单元格(和字体大小)尽可能小,只要你想要或不需要,以免扰乱你的整体布局。 使用白色来格式化单元格中的字符(使其在最终PDF中显示为不可见)。

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

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

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

为了避免混淆,在文档中的字体名称中添加了一个前缀。 在显示字体embedded时,Acrobat会删除此前缀,因此您似乎有多个相同字体的实例。 然而,他们实际上是不同的字体,并不容易组合。

假设情况是这样的(我需要看到你的文件是肯定的),可能有可能避免这种情况。 如果您将PDF生成软件设置为不包含字体子集,则pdftk可能能够合并多个文件而不包含相同的字体。 我没有明确地testing过这个,但是可能会起作用。 您的其他select是修改您的工作stream程,以便首先将报告生成为多个页面文档。