iTextSharp处理PDF压缩吗



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

如果iTextSharp不支持压缩,有人对其他.NET PDF库有什么建议吗?购买图书馆不会是个问题。我看了很多免费的,比如PDFSharp,在我看来,它在制作PDF方面非常好,但不能渲染或压缩它们。

我在stackoverflow上从Chris Haas那里读到了一个很棒的答案:

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

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

另一个混淆点是SetFullCompression和CompressionLevel实际上根本没有关联。"完全压缩"表示PDF 1.5中添加的一个名为"对象流"的功能,该功能允许将PDF对象分组在一起,从而可能实现更大的压缩。实际上,我们所认为的"压缩"并没有要求实际发生,但事实上,我认为它总是会发生。(启用此功能后,一个超级简单的文档可能会变得更大,不确定,也不想测试。)

CompressionLevel实际上是你通常认为的压缩,一个从0到9或-1的数字表示默认值(我认为目前等于6)。这个属性实际上是PdfStream类的一部分,许多类最终都是从该类派生的。然而,这种设置不会"涓涓细流"。由于您通过GetPageContent()和SetPageContent(。实际上,如果需要,您可以将第三个参数传递给SetPageContent()来设置特定的压缩级别

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

https://stackoverflow.com/a/22028008/2063134

如有任何帮助或建议,我们将不胜感激。

谢谢。

是的,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的回答已经完全回答了您的问题。由于PDF1.1可以追溯到很早以前(1994年),我不担心更改内容流的压缩级别,所以您可以放心地忘记:

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

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

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

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

根据iTextSharp的版本,您使用的reader.RemoveUnusedObjects();也会对您有所帮助(默认情况下,最新版本会删除未使用的对象)。

ITextSharp允许您浏览PDF页面并编辑其中的对象(以及许多其他功能)。流对象(主要是图像)的压缩可以帮助您减小PDF的整体大小。

我深入研究了PDF文件的压缩,主要是其中的图像,并完成了轻量级库,它可以用作特定压缩情况的父库。

https://github.com/rock-walker/PdfCompression

最新更新