iTextSharp处理PDF压缩吗?

时间:2016-05-19 13:33:48

标签: c# pdf compression itextsharp pdfsharp

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(); {
{1}}   

另一个令人困惑的地方是SetFullCompression和CompressionLevel根本没有实际相关。 "完全压缩"表示在PDF 1.5中添加的一项称为" Object Streams"允许将PDF对象组合在一起以潜在地允许更大的压缩。实际上并没有要求我们认为"压缩"实际上发生但实际上我认为它总会发生。 (可能一个超级简单的文档可能会变大,启用此功能,不确定并且不喜欢测试。)   

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

stamper.Writer.SetFullCompression();

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

非常感谢任何帮助或建议。

谢谢。

2 个答案:

答案 0 :(得分:4)

是的,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);

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

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

时,文件可能会增加文件大小

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

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

答案 1 :(得分:0)

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

我对PDF文件的压缩进行了深入研究,主要是在其中的图像,并使用轻量级库完成,可以用作特定压缩案例的父文件。

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