当我尝试压缩不同级别的pdf文件时,ITextSharp返回相同大小的pdf

我正在阅读pdf并使用itextsharp注入一些内容。 生成的byte[]与压缩级别一起传递给下面的方法。

 public static byte[] method(byte[] pdf,int compressionlevel) { using (MemoryStream outputPdfStream1 = new MemoryStream()) { //PdfReader reader1 = new PdfReader(pdf); //PdfStamper stamper1 = new PdfStamper(reader1, outputPdfStream1); //int level = (int)compressionlevel; //if (level <= 9) // stamper1.Writer.CompressionLevel = (int)compressionlevel; //else // stamper1.Writer.SetFullCompression(); //stamper1.SetFullCompression(); //stamper1.Close(); //byte[] newfile = outputPdfStream1.ToArray(); //return newfile; PdfReader reader = new PdfReader(pdf); PdfStamper stamper = new PdfStamper(reader, outputPdfStream1,PdfWriter.VERSION_1_5); int level = (int)compressionlevel; if (level <= 9) { stamper.Writer.CompressionLevel = level; } else stamper.Writer.SetFullCompression(); int total = reader.NumberOfPages + 1; for (int i = 1; i < total; i++) { reader.SetPageContent(i, reader.GetPageContent(i)); } stamper.SetFullCompression(); stamper.Close(); byte[] newfile = outputPdfStream1.ToArray(); return newfile; } } 

如果我评论stamper.SetFullCompression(); 然后这个方法返回相同大小的字节数组,而不管传递的压缩级别(在每种情况下从0传递到9)。

如果我取消注释stamper.SetFullCompression(); 无论压缩级别如何,此方法都返回输入字节的完全压缩版本!

stamper.SetFullCompression();的目的/区别是什么stamper.SetFullCompression();stamper.Writer.SetFullCompression();

使用不同压缩级别的正确方法是什么,以便在每种情况下都可以看到不同的大小?

你有几个问题,我会尽力回答。

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

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

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

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

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