代码之家  ›  专栏  ›  技术社区  ›  Paddy

iTextsharp-插入图像后的PDF文件大小

  •  5
  • Paddy  · 技术社区  · 14 年前

    我目前正在使用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.8kbpng文件)似乎可以将PDF文件的大小增加近100kb。

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

    3 回复  |  直到 14 年前
        1
  •  8
  •   Paddy    14 年前

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

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

    这使我的文件大大缩小了。我还发现,PNG的是给我最好的结果,就最终大小的文件。

        2
  •  1
  •   Paddy    9 年前

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

    我在网上做了一些研究,寻找一个可能的解释,根据我的发现,iTextSharp似乎不压缩图像,而是用一些通用的压缩方法压缩一切。所以换句话说,BMP实际上并没有转换成另一种文件类型,它只是像压缩它一样被压缩。不管他们在做什么,它一定是好的,因为它比PNG压缩的图像压缩得更好。我假设iTextSharp会尝试压缩PNG,但是会压缩0%,因为它已经被压缩了。(这与原作者的意见不一致,不过。。。帕迪说他的PDF文件比PNG文件大很多。。。不知道该怎么解释。我只能自己做实验)。

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

        3
  •  0
  •   mosheb    14 年前

    似乎PDF需要将png转码成其他格式,最有可能是jpeg格式。

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

    我唯一能想到的就是先将png转换成最小的jpeg格式,包括缩小75%,然后导入该文件而不进行缩放。

        4
  •  -1
  •   Danoram    4 年前

    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();