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

use*_*507 4 c# compression pdf itextsharp

我正在阅读 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;
            }
        } 
Run Code Online (Sandbox Code Playgroud)

如果我发表评论,stamper.SetFullCompression();那么无论我通过的压缩级别如何(在每种情况下都从 0 到 9),此方法将返回相同大小的字节数组。

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

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

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

Chr*_*aas 6

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

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

stamper.SetFullCompression();
stamper.Writer.SetFullCompression();
Run Code Online (Sandbox Code Playgroud)

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

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

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