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
非常感谢任何帮助或建议。
谢谢。
答案 0 :(得分:4)
是的,iText和iTextSharp支持压缩。
/FlateDecode
。此算法类似于ZIP算法,您可以设置不同的压缩级别(从0到9;选择-1将使用您的编程语言认为是默认值)。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文件的压缩进行了深入研究,主要是在其中的图像,并使用轻量级库完成,可以用作特定压缩案例的父文件。