有没有办法从 pdf 文件中删除多次嵌入的字体?
这是我的场景:
1) 一个程序生成多个单页 pdf 报告(查询数据库、将信息放在 Excel 模板上并以 pdf 格式导出格式化信息)
2) pdftk 将单页 pdf 合并到一个文件中。
一切正常,但生成的 pdf 的大小非常大:事实上,我注意到字体被嵌入多次(与页面数一样多:所有页面都是从同一个 excel 开始生成的)模板,字体嵌入在单个 pdf 文件中,而 pdftk 只是粘合 pdf)。有没有办法只保留每种嵌入字体的一份副本?
我尝试在从 excel->pdf 导出时将字体仅嵌入到第一页中:文件的大小急剧减小,但其他页面似乎无法访问嵌入的字体。
谢谢, 亚历山德罗
最佳答案
您可以尝试使用 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“修复”时遇到的问题。请注意,这将比“哑”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 字母表中的所有可打印字符和标点符号填充此表格单元格:
0123456789
、ABCD...XYZ
、abc...xyz
、:-_;°%&$§")({}[]
等。 - 将单元格(和字体大小)设置为您想要或需要的小值,以免干扰您的整体布局。使用白色设置单元格中字符的格式(以便它们在最终的 PDF 中不可见)。
此方法有望确保您的每个 PDF 都使用相同的字形子集,从而避免您在使用 Ghostscript 合并文件时遇到的问题。 (请注意,如果您使用 Arial 和 Arial-Italic,则必须创建 2 个这样的单元格:一个使用标准 Arial 字体格式化,另一个使用斜体字体。)
关于excel - 删除使用 pdfTk 创建的 pdf 中的多个嵌入字体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10626977/