PDF压缩库/工具

4

我正在开展一个项目,旨在减小PDF文件的大小,压缩它们。我想知道市场上是否有一些非常好的工具/库(.NET),可以提供令人满意的结果。

我尝试过一些工具,比如Onstream Compression,但结果并不令人满意。


3
这是一个常见的误解,即“PDF是一个文件,文件可以压缩,因此PDF可以被压缩。”这并不总是正确的。1. PDF中最昂贵的数据——文本、图像、字体——默认情况下已经使用非常高效的zlib Flate算法进行了压缩。2. 图像可以被“更多地”压缩,但只能通过将它们转换为最便宜的颜色模型、降采样和/或降低它们的JPEG质量来实现。3. 您无法“降采样”纯文本和矢量图像数据。 - Jongware
可以重新压缩的“事后想法”项目包括:1.对象流本身(PDF 1.5;请参见“参考资料”中的“对象流”);2.未压缩或使用旧版LZW或RLE压缩的项目;3.过度嵌入的字体可能会被替换为子集版本;4.通过调整“/预测器”值,位图图像可以更有效地压缩;5.彻底的矢量数据检查可能能够丢弃不可见或双重渲染的对象。 - Jongware
4个回答

5

一些额外的(巨型)字节可以很容易地从PDF中挤出来。例如,众所周知的"PDF32000_2008.pdf"是否已经优化到足够的程度?文件大小为8,995,189字节。它使用对象和xref流,(几乎)没有图像,所有内容都紧密压缩。或者它还不够优化?

看看页面词典:

Dict:9 [1 0 R]
.   /Annots Array:3
.   /Contents Stream:3 [2 0 R]
.   /CropBox Array:4
.   /MediaBox Array:4
.   /Parent Dict:4 [124248 0 R]
.   /Resources Dict:4
.   /Rotate 0 (Number)
.   /StructParents 2 (Number)
.   /Type Page (Name)
Rotate 0 是默认值,它为什么存在?CropBox 是用来做什么的?它默认是 MediaBox,而且文档中除了 MediaBox 外没有带有 CropBox 的页面。那么 MediaBox 为什么存在呢?因为它可以被继承,所有页面大小都相同,所以将其移动到页面树根!这份文档共有 756 页,也就是冗余(或无用)信息被复制了 756 次。

请看典型的注释字典:

Dict:6 [3548 0 R]
.   /A Dict:2
.   .   /S URI (Name)
.   .   /URI http://www.iso.org/iso/iso_catalogue/... (String)
.   /Border Array:3
.   .   [0] 0 (Number)
.   .   [1] 0 (Number)
.   .   [2] 0 (Number)
.   /Rect Array:4
.   .   [0] 82.14 (Number)
.   .   [1] 576.8 (Number)
.   .   [2] 137.1 (Number)
.   .   [3] 587.18 (Number)
.   /StructParent 3 (Number)
.   /Subtype Link (Name)
.   /Type Annot (Name)

在这个文档中有成千上万的(可能 > 10'000?) 链接注释。 /Type 关键字是可选的,为什么要加上它呢?它们是看不见的矩形,你认为它们的放置精度除了整数点以外还有关���吗?将其舍入为整数。
看一下典型页面内容流片段,显示文本操作符:
[(w)7(ed)-6( b)21(u)1(t shal)-6(l no)-6(t b)-6(e)1( ed)-6(ite)-6(d)1( un)-6(less the typef)23(aces wh)-6(ich )]TJ

小于某个值的字距调整几乎是看不见的。对于这个“值”,有些人认为可以接受,而其他人则意见不一,就像JPEG压缩质量水平一样。我认为非常保守的估计(即保留大部分质量)是,绝对值小于10的字距调整可以省略(当然,必须注意保留对齐)。 (我甚至没有提到,在某些文件中存在具有3-6位小数精度的分数字距调整!但不在此文件中)
并且,通过上述优化,文件大小变为7,982,478字节。少了1MB。这肯定不是极限,可能还有其他更难察觉的优化来源。

2
我不反对你的观点,但是你的答案需要极大的注意。这种注意事项是指a)需要深入了解PDF规范才能进行优化,b)对一些文档来说效果明显要比其他文档好很多(对于大多数图形艺术类文档,你的优化效果会接近于零),c)(最重要的是)依赖于完美的PDF阅读器,能够百分之百准确地实现规范。如果执行此类优化,将需要非常彻底的测试。 - David van Driessche
1
@David:先生,省略默认或可选键或将“常见页面属性存储在页面对象中”(即使是来自参考文献 1.0 的建议,以及来源于那里的“省略默认值”)如何影响遵守规范?是否有文档阅读器足够聪明,可以理解压缩的xref表(来自其他答案不争的建议),但会因每个页面字典中缺少MediaBox而中断?当然,任何建议“对某些文档的效果要比其他文档好得多”。 - user2846289
@Vladimir,你不必相信我,但我已经看过足够多的PDF库实现(包括使用两个不同的PDF库的产品)来在涉及非平凡的PDF文件操作时变得非常保守。至于一些文档比其他文档更好-在这种情况下有相当大的差异,值得一提。 - David van Driessche

4
为已经很好的答案添加一些注释,有许多应用程序/库可以减小PDF文件的文件大小。第一个问题是,是否可以开始处理。
如果您的PDF文件来自各个方面(您无法控制来源),请收集样品文件并确定所需结果PDF的需求。例如,如果您只想在屏幕上显示它们,则可以选择将图像重新采样为更低的分辨率(要小心,这对于移动使用不再适用)。
使用Adobe Acrobat的“空间审核”功能。 Adobe似乎很满意隐藏这个不错的工具,并在Acrobat的不同版本之间移动,但在Acrobat Pro XI中,可以通过打开PDF文件,然后选择“文件>另存为其他>优化PDF …”(而不是“缩小PDF大小”)找到它。在显示出现的对话框窗口中,有一个“审核空间使用情况”的按钮,可弹出信息窗口,显示PDF中元素使用了多少空间。
根据发现的情况,有多种事情可以做,大多数已经提到,但以下是不完整列表:
- 降低图像采样率。 - 将图像的颜色空间从CMYK更改为RGB。要小心,因为它会a)不提供您可能认为的空间节省(因为压缩)并且b)如果运气不好,可能实际上是适得其反(因为索引和其他花哨的图像技巧)。 - Remove document and object level metadata(我拥有的一些杂志页面文件包含的一些元数据比实际内容还多)。 - Remove proprietary application data(如果不小心,Illustrator会将完整的Illustrator文档嵌入PDF文件中)。 - 如果您确定您使用的所有读取器都能够处理,则压缩对象流和XRef表。 - 使用最优压缩(如果您的目标读者将处理JBIG2,JPEG2000等)。 - 优化文件结构(某些糟糕的PDF文件不会优化字体和其他对象,并且在文件中散布了多个副本)。 - 子集文档中的所有字体。 - 删除不需要的ICC配置文件。
如果要执行这些任务,则有许多工具可用。要么是库,让您自己实现它,要么是商业(以及可能是其他)工具,可以通过预定义操作通过命令行工作。callas pdfToolbox就是其中之一(我与该公司有联系!),Enfocus PitStop在此领域具有功能,Apago在此处也具有功能(尽管我头脑中没有顶部的命令行版本)。

1

@Jongware是正确的。如果一个PDF文件被正确创建,那么它的大小不太可能被显著减小。

但是很多PDF文件在网上可以更好地压缩。这是因为许多PDF文件没有使用较新版本PDF规范中引入的对象和交叉引用流。此外,PDF文件通常包含可以安全删除的未使用对象。是的,PDF中的图像可以调整大小/重新压缩以进一步减少PDF的大小。

如果您接受商业解决方案,那么您可能会对我对类似问题的回答感兴趣。该答案包含了使用Docotic.Pdf库如何压缩PDF的代码(我是该库的开发人员之一)。


0

有一个名为PDFBeads的Ruby宝石。

它适用于带有DevKit的RubyInstaller 2.3.3 32位。(更高版本需要过大的MSYS2 DevKit。)

对于Windows,这些程序是必需的:

需要单独安装iconv gem。

gem install iconv -- --with-iconv-include="<path>" --with-iconv-lib="<path>" 

(适用于简单、短路径)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接