为啥合并 PDF 会产生文件大小气球?

Posted

技术标签:

【中文标题】为啥合并 PDF 会产生文件大小气球?【英文标题】:Why does combining PDFs make filesize balloon?为什么合并 PDF 会产生文件大小气球? 【发布时间】:2016-05-09 18:54:53 【问题描述】:

我正在尝试将各种 PDF 剥离。它们不是那么重的文字,偶尔会有图像。例如,我有两个 PDF,1.4Mb 和 740kb - 当我将它们组合在一起时,它们会膨胀到 6Mb!

我尝试了脚本组合和手动附加,结果相同,所以我猜这是一个潜在的问题。对它为什么发生的一些解释会很有用,所以我可以看看避免它的方法。是不是颜色模型不匹配?它们的字体很小。

【问题讨论】:

你用什么方法来组合它们? 【参考方案1】:

你没有告诉我们你是如何组合 PDF 的,这让你的问题变得相当理论化,所以我会给你一个理论上的答案:

第 1 部分

假设您有一个 10 页的 PDF 文件,总大小为 1200 KB。 假设每个页面的内容流大致由 100 KByte 组成。在此内容流中,存在对共享资源的引用。 假设这 10 个页面共享 200 KB 的资源:它们共享相同的字体、相同的图像等等。

如果您将此 PDF“分解”为 10 个单独的单页 PDF,则每个 PDF 将包含大约 300 KB:内容流中的 100 KB + 资源中的 200 KB(我忽略了拥有 10 个单独的外部参照表的开销和文件预告片)。

如果将这 10 个单独的单页 PDF 组合在一起,就好像这 10 个 PDF 没有任何共同点一样,总文件大小将为 10 x 300 KB。那是 3000 KB,是原始 1200 KB 的两倍多。 如果结合这 10 个单独的单页 PDF 并考虑到它们具有共同的资源(字体、资源等),总大小将为 (10 x 100 KByte) + 200 KByte。

如果您使用 iText 合并 PDF,那么使用 PdfCopy 将生成 3000 KB 的 PDF,因为 PdfCopy 只是尽可能快地复制文档而不查看文档的内容。如果您想要 1200 KB 的 PDF,则需要使用 PdfSmartCopy,在这种情况下,您将需要更多的内存和 CPU,因为 iText 将检查每个 PDF 并重用原本多余的对象。

第 2 部分

在您的问题中,您提到您有一个 1.4Mb 和一个 740kb 的 PDF,而 1.4Mb + 740kb 的 PDF 为 6Mb。我的理论示例的第一部分没有解释规模的极端增长,所以这里是第二部分。

在 PDF 1.0 中,PDF 语法没有被压缩。 从 PDF 1.2 开始,流被压缩,但间接对象和交叉引用流以 ASCII 格式存储。 从 PDF 1.5 开始,可以在对象流中压缩一系列对象,也可以压缩交叉引用表。

假设您的原始 PDF 具有压缩的对象流和压缩的交叉引用表。假设您将这些 PDF 组合成一个更像 PDF 1.4 文档的 PDF。在这种情况下,压缩的对象和压缩的交叉引用流将不再被压缩,从而导致文件更大。

第 3 部分?

可能还有其他原因,具体取决于原始 PDF 的性质以及您用于合并 PDF 的工具。如果以上都不适用,您应该澄清。

【讨论】:

以上是关于为啥合并 PDF 会产生文件大小气球?的主要内容,如果未能解决你的问题,请参考以下文章

为啥保存我用 fitz 打开的文件会改变它的大小?

创建一个空文件, 为啥文件大小是0kb?

itextsharp 合并调整大小并取消旋转 pdf

为啥PDF文件大小这么小? [关闭]

为啥同样的文件我压缩后和原来的文件大小差不多?

用Jasperirport导出的Excel文件中没有隐藏行,为啥排序时显示“要求合并单元格都具有相同大小“?