我正在做一个项目来减小 PDF 的大小,压缩它们。我想知道市场上是否有任何非常好的工具/库(.NET)。我确实尝试了一些像 Onstream Compression 这样的工具,但结果并不令人满意。
4 回答
一些额外的(兆)字节可以很容易地从 PDF 中挤出。例如,一个众所周知的“PDF32000_2008.pdf”是否优化得足够好?文件大小为8,995,189
字节。它使用对象和外部参照流,(几乎)没有图像,一切都紧凑。或者不是吗?
看一个页面字典:
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
,并且本文档中没有CropBox
除 之外的页面MediaBox
。为什么MediaBox
会有?它是可继承的,所有页面的大小都相同,所以将它移动到页面树根!有756 页,即重复756 次冗余(或无用)信息。
查看典型的 Annotation 字典:
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
字节。一兆字节被剃掉了。这当然不是限制,也许还有其他隐藏得更好的优化来源。
为了给已经很好的答案添加更多注释,有一系列应用程序/库可以减小 PDF 文件的文件大小。第一个问题,与@Jongware 的回答一起,是一开始是否可以做任何事情。
如果您的 PDF 文件来自任何地方(您无法控制源),请收集文件样本并确定您对生成的 PDF 的要求。例如,如果您只想在屏幕上显示它们,您可以选择将图像重新采样到低得多的分辨率(请注意,移动使用不再是这种情况)。如果 PDF 都是内部的,您会更容易,因为您可以检查它们并查看可以保存的位置。
使用 Adobe Acrobat 的“空间审核”功能。Adobe 似乎对隐藏这个好工具并在 Acrobat 版本之间移动它感到满意,但在 Acrobat Pro XI 中,可以通过打开 PDF 文件然后选择“文件 > 另存为其他 > 优化的 PDF...”来找到它(不是您想的“缩小尺寸的 PDF”)。在显示的对话框窗口中,有一个“审核空间使用”按钮,该按钮将打开一个信息窗口,显示 PDF 中的空间元素正在使用多少。
根据您在那里找到的内容,您可以做很多事情,大多数已经提到过,但这里有一个不完整的列表:
- 下采样图像。
- 将图像的色彩空间从 CMYK 更改为 RGB。对此要小心,因为它 a) 不会提供您可能认为的空间节省(因为压缩),并且 b) 如果您不走运(因为索引和其他巧妙的图像技巧),实际上可能会适得其反。
- 删除文档和对象级别的元数据(我拥有的一些杂志页面文件示例集包含的元数据比实际内容更多)。
- 删除专有应用程序数据(如果您不小心,Illustrator 有将完整的 Illustrator 文档嵌入到 PDF 文件中的坏习惯)。
- 如果您确定您使用的所有阅读器都能够处理,请压缩对象流和外部参照表。
- 如果您的目标读者能够处理(JBIG2、JPEG2000...),请使用最佳压缩
- 优化文件结构(一些糟糕的 PDF 文件不会优化字体和其他对象,并且会在整个文件中散布多个副本)。
- 子集文档中的所有字体。
- 如果不需要,请删除 ICC 配置文件。
如果您想执行这些任务,有许多工具可以提供帮助。让您自己实现此功能的库或商业(可能还有其他)工具,它们将通过命令行使用预定义的操作来工作。callas pdfToolbox 是这些工具之一(我与这家公司有联系!),Enfocus PitStop 在这方面有功能,Apago 在这里也有功能(虽然我不确定他们是否有我的顶部的命令行版本头)。
@Jongware 是对的。您不可能显着减小正确创建的PDF 文件的大小。
但是可以更好地压缩野外的许多 PDF 。这是因为许多 PDF 不使用新版本 PDF 规范中引入的对象和交叉引用流。此外,PDF 通常包含可以安全删除的未使用对象。是的,PDF 中的图像可以调整大小/重新压缩以进一步减小 PDF 的大小。
如果您对商业解决方案感到满意,那么您可能会对我对类似问题的回答感兴趣。答案包含显示如何使用 Docotic.Pdf 库压缩 PDF 的代码(我是该库的开发人员之一)。
有一个 PDFBeads Ruby gem。
它适用于带有 DevKit 的 RubyInstaller 2.3.3 32 位。(更高版本需要不必要的大型 MSYS2 DevKit。)
对于 Windows,需要这些程序:
- ImageMagick 6.9.x 32 位 dll 版本,带有 C/C++ 开发头文件(http://ftp.icm.edu.pl/pub/graphics/ImageMagick/binaries或https://yadi.sk/d/4DGwC9Ie3Lkkgo)
- jbig2 ( http://soft.rubypdf.com/software/windows-version-jbig2-encoder-jbig2-exe 或https://yadi.sk/d/4DGwC9Ie3Lkkgo )
- libiconv ( http://gnuwin32.sourceforge.net/packages/libiconv.htm )
iconv gem 需要单独安装
gem install iconv -- --with-iconv-include="<path>" --with-iconv-lib="<path>"
(适用于简单、短路径)