PDFBOX 生成非常大的 PDF/A 文件

Posted

技术标签:

【中文标题】PDFBOX 生成非常大的 PDF/A 文件【英文标题】:PDFBOX generates PDF/A file of very large size 【发布时间】:2018-01-22 08:11:07 【问题描述】:

我正在尝试使用 PDFBOX 创建 PDF/A 文件,并且文件生成已成功完成,但生成的文件非常大... 有时 500 MB 甚至更多。 有没有办法在生成时减小文件大小?

【问题讨论】:

取决于您如何创建这些大文件。 500MB 听起来相当大,因此您的代码很可能会得到改进。但是,由于您没有展示它,因此很难描述如何。 可能的想法:您多次创建了相同的 PDFont,并完全嵌入,而不是一次创建并进行子集化。或者多次创建相同的 PDXObjectImage(例如公司徽标)而不是再次使用它。 感谢@TilmanHausherr,我已经应用了您建议的更改,即删除 PDFont 的多个创建,这样做文件大小会大大减小....我的意思是相同数据从 200 MB 到 2 MB。 【参考方案1】:

正如 cmets 中所讨论的:特定字体的 PDFont 对象应该只构造一次,并且可以在一个 PDF 的不同页面中重复使用。

字体应该被子集化(即只嵌入使用的字形),为此使用PDType0Font.load()

这同样适用于 PDXObjectImage 对象,例如对于公司徽标:PDXObjectImage 应该创建一次,并在一个 PDF 的不同页面中重复使用。

PD 对象不应在不同的 PDF 中使用。

TrueTypeFont 字体对象可以在多个文档中重复使用:

TrueTypeFont ttf = new TTFParser().parse(file);
PDFont font1 = PDType0Font.load(document1, ttf, true); // last parameter should be false if used for acroForm fields
PDFont font2 = PDType0Font.load(document2, ttf, true);
PDFont font3 = PDType0Font.load(document3, ttf, true);

【讨论】:

您能否提供替代 PDType0Font.load(document,fontFile, false);所以它需要最小的文件大小。 @YogeshBombe 将最后一个参数设置为 true 或将其删除。但是,不应对 acroForm 字段中的字体进行子集化。 我想将 PDFont 用作静态对象,这样我就可以再次使用它。但是当我在 web 上下文中将嵌入标志设置为 true 时它第一次工作正常但第二次它给出了与字体相关的错误。这就是为什么我将它设置为 false 但它会创建沉重的文件。 收到错误 TrueType 字体 null 在将其设置为 true 时不包含“cmap”表 @YogeshBombe 字体绑定到 PDDocument。保存子集时进行。您不能在另一个 PDDocument 中重复使用它。你可以做的是首先创建一个 TrueTypeFont,然后使用那个。 TrueTypeFont 可以是静态的。使用TrueTypeFont ttf = new TTFParser().parse(file) 创建它。

以上是关于PDFBOX 生成非常大的 PDF/A 文件的主要内容,如果未能解决你的问题,请参考以下文章

非常强大的生成pdf的框架!

java 打印pdf文件

java中使用pdfbox对pdf文件进行操作时,如何实现插入文本的自动换行操作?

PDFBox 生成的 PDF 尺寸(高度和宽度)被交换

使用 PDFBOX 生成的 PDF 中未正确显示已保存的文本字段值

如何使用 iText 和 XMLWorker 生成有效的 PDF/A 文件(HTML 到 PDF/A 过程)