iTextSharp处理PDF压缩吗?

J-m*_*man 5 c# compression pdf pdfsharp itextsharp

iTextSharp可以压缩PDF文件吗?我正在寻找可用于开发以压缩PDF文件的PDF库.基本上,我有一个包含许多PDF文件的文件夹列表,大小从1MB到10MB不等,这些文件夹的数量每天都在增长,所以为了节省磁盘空间,我希望能够在PDF文件中读取一次它已被处理,压缩,然后将其保存到指定的文件夹位置.

如果iTextSharp不支持压缩,是否有人可以获得其他.NET PDF库的建议?购买图书馆不是问题.我查看了许多免费的内容,例如PDFSharp,我认为它在制作PDF方面非常好,但无法渲染或压缩它们.

我在Chris Haas的stackoverflow上读到了一个很好的答案:

PdfStamper是一个帮助器类,它最终使用另一个名为PdfStamperImp的类来完成大部分工作.PdfStamperImp派生自PdfWriter,当你使用stamper.Writer时,实际上你正在回到这个实现类.PdfStamper上的许多属性也直接传递给实现类.所以这两个电话实际上做同样的事情.

stamper.SetFullCompression();
stamper.Writer.SetFullCompression();

另一个混淆点是SetFullCompression和CompressionLevel实际上并不相关."完全压缩"表示在PDF 1.5中添加的称为"对象流"的功能,该功能允许将PDF对象组合在一起以潜在地允许更大的压缩.实际上并没有要求我们所谓的"压缩"实际发生,但实际上我认为它总会发生.(可能一个超级简单的文档可能会变大,启用此功能,不确定并且不想测试.)

CompressionLevel实际上是您通常认为的压缩,0到9之间的数字或-1表示默认值(目前等于六我认为).这个属性实际上是PdfStream类的一部分,许多类最终都是从这个类派生出来的.但是,此设置不会"涓滴".由于您是通过GetPageContent()和SetPageContent()从其他位置导入流,因此特定流具有与Writer的压缩设置无关的压缩设置.实际上有第三个参数可以传递给SetPageContent()来设置你想要的特定压缩级别.

reader.SetPageContent(1, reader.GetPageContent(1), PdfStream.BEST_COMPRESSION);

/sf/answers/1541960591/

任何帮助或建议将不胜感激.

谢谢.

Bru*_*gie 5

是的,iText 和 iTextSharp 支持压缩。

  • 从 PDF 1.0 (1993) 到 PDF 1.1 (1994),存储在内容流中的 PDF 语法没有被压缩。
  • 从 PDF 1.2 (1996) 开始,可以压缩存储在内容流中的 PDF 语法。标准过滤器是/FlateDecode. 此算法类似于 ZIP 算法,您可以设置不同的压缩级别(从 0 到 9;其中选择 -1 将使用您的编程语言认为是默认值的任何内容)。
  • 从 PDF 1.5 (2003) 开始,间接对象可以存储在压缩对象流中。此外,交叉引用表可以压缩并存储在流中。在 PDF 1.5 之前,这是不可能的(仅支持 PDF 1.4 及更早版本的查看器无法打开“完全压缩”的 PDF)。

iText 支持以上所有内容,Chris 的回答已经完全回答了您的问题。由于 PDF 1.1 可追溯到很久以前(1994 年),我不会担心更改内容流的压缩级别,因此您可以放心地忘记:

reader.SetPageContent(1, reader.GetPageContent(1), PdfStream.BEST_COMPRESSION);
Run Code Online (Sandbox Code Playgroud)

使用这一行不会大大减少文件大小。

使用“完全压缩”(这将导致交叉引用表被压缩)应该会对具有许多间接对象的 PDF 的文件大小产生影响。使用“完全压缩”时,最小的“Hello World”文件可能会增加文件大小。

以上所有内容对您没有多大帮助,因为优秀的 PDF 创建者已经压缩了任何可以压缩的内容。然而,糟糕的 PDF 创建者(或错误地使用好的 PDF 创建者的人)可能包含多余的对象。例如:有些人不知道如何使用 iTextSharp 将徽标作为图像添加到 PDF 中的每个页面。由于他们的无知,他们添加了与页面一样多的图像。在这种情况下,PDF 压缩对您无济于事,但是如果您通过 iTextSharp 传递这样一个“坏”的 PDF PdfSmartCopyPdfSmartCopy则将检测冗余对象并重新组织文件,以便在文件中反复重复的对象(例如:每个页面都引用具有相同图像字节的不同对象),被重用(例如:

根据您使用的 iTextSharp 的版本,reader.RemoveUnusedObjects();也可以为您提供帮助(最近的版本默认删除未使用的对象)。