【问题标题】:iTextsharp - PDF file size after inserting imageiTextsharp - 插入图像后的 PDF 文件大小
【发布时间】:2011-04-01 15:12:33
【问题描述】:

我目前正在转换一些旧代码以使用 iTextSharp 创建 PDF 文件。我们正在创建一个包含许多图像的大型 PDF 文件,我将其插入如下:

Document doc = new Document(PageSize.A4, 50, 50, 25, 25);
PdfWriter writer = PdfWriter.GetInstance(doc, myStream);

writer.SetFullCompression();

doc.Open();

Image frontCover = iTextSharp.text.Image.GetInstance(@"C:\MyImage.png");

//Scale down from a 96 dpi image to standard itextsharp 72 dpi
frontCover.ScalePercent(75f);

frontCover.SetAbsolutePosition(0, 0);

doc.Add(frontCover);

doc.Close();

插入图像(20.8 KB png 文件)似乎会使 PDF 文件大小增加近 100 KB。

有没有办法在输入之前压缩图像(记住这需要具有合理的打印质量),或者进一步压缩整个 PDF?我什至在上面的例子中执行了任何压缩吗?

【问题讨论】:

    标签: c# pdf-generation itextsharp


    【解决方案1】:

    使用:

    var image = iTextSharp.text.Image.GetInstance(srcImage, ImageFormat.Jpeg);
    
    image.ScaleToFit(document.PageSize.Width, document.PageSize.Height);
    //image.ScalePercent(75f);
    image.SetAbsolutePosition(0, 0);
    document.Add(image);
    document.NewPage();
    

    【讨论】:

      【解决方案2】:

      今天早上我做了一些实验。我的测试图像为 800x600,保存为 PNG 时文件大小为 100.69K。我将它插入 PDF(使用 iTextSharp 和通常的 GetInstance() 方法),文件大小从 301.71K 增加到 402.63K。然后我将我的测试图像重新保存为文件大小为 1,440,054 的原始位图。我将它插入到 PDF 中,文件大小下降到 389.81K。有趣!

      我在网上做了一些研究以寻求可能的解释,根据我的发现,iTextSharp 似乎不压缩图像,而是使用一些通用压缩来压缩所有内容。因此,换句话说,BMP 实际上并没有转换为另一种文件类型,它只是非常像通过 ZIPping 压缩它。不管他们在做什么,它一定是好的,因为它的压缩比使用 PNG 压缩的图像更好。我假设 iTextSharp 会尝试压缩 PNG,但会压缩到 0%,因为它已经被压缩了。 (虽然这与原作者的观察不一致...... Paddy 说他的 PDF 大小比 PNG 的大小增加了很多......不知道该怎么做。我只能继续我自己的实验)。

      结论:

      1) 我不需要在我的项目中添加一些花哨的库来将我的(最终动态创建的)图像转换为 PNG;实际上最好让它完全未压缩并让 iTextSharp 完成所有压缩工作。

      2) 我还在网上阅读了有关 iTextSharp 以特定 DPI 保存图像的内容。我没有看到这个问题...我使用 ScalePercent() 方法将位图缩放到 1% 并且文件大小相同并且位图中的位图像素没有“丢失”...这证实了 iTextSharp正在做一个简单、漂亮、通用的无损压缩。

      【讨论】:

        【解决方案3】:

        答案似乎是您需要为目标设置适当版本的 PDF 规范,然后按如下方式设置压缩:

        PdfWriter writer = PdfWriter.GetInstance(doc, ms);
        PdfContentByte contentPlacer;
        
        writer.SetPdfVersion(PdfWriter.PDF_VERSION_1_5);
        
        writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
        

        这大大降低了我的文件大小。我还发现 PNG 在最终文档大小方面给了我最好的结果。

        【讨论】:

          【解决方案4】:

          似乎 PDF 需要将 png 转码为其他格式,很可能是 jpeg。

          请看这里:http://forums.adobe.com/message/2952201

          我唯一能想到的就是先将 png 转换为最小的 jpeg,包括缩小 75%,然后在不缩放的情况下导入该文件。

          【讨论】:

          • 我认为不一定是这样。我发现许多页面都推荐使用 PNG,因为它们可以更好地缩放和缩小。我自己的实验发现 JPEG 可以生成更大的 PDF。
          猜你喜欢
          • 1970-01-01
          • 2012-02-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多