我目前正在使用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?我是否在上面的例子中进行了任何压缩?
答案 0 :(得分:8)
答案似乎是您需要设置适当版本的PDF规范以进行定位,然后按如下方式设置压缩:
PdfWriter writer = PdfWriter.GetInstance(doc, ms);
PdfContentByte contentPlacer;
writer.SetPdfVersion(PdfWriter.PDF_VERSION_1_5);
writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
这大大降低了我的文件大小。我还发现PNG在文档的最终大小方面给了我最好的结果。
答案 1 :(得分:1)
今天早上我做了一些实验。保存为PNG时,我的测试图像为800x600,文件大小为100.69K。我将其插入PDF(使用iTextSharp和通常的GetInstance()方法),文件大小从301.71K增加到402.63K。然后我将测试图像重新保存为原始位图,文件大小为1,440,054。我将其插入到PDF中,文件大小下降到389.81K。有趣的!
我在网上做了一些研究以获得可能的解释,并且根据我的发现,看起来iTextSharp不会压缩图像,而是通过一些通用压缩来压缩所有内容。换句话说,BMP实际上并没有转换为另一种文件类型,它只是像压缩它一样压缩。无论他们做什么,它都必须是好的,因为它比PNG压缩的图像压缩得更好。我假设iTextSharp woudld尝试压缩PNG,但由于它已被压缩,因此将压缩为0%。 (这与原作者的观察结果不一致,但是......帕迪说他的PDF大小比PNG的大小增加得多......不知道该怎么做。我只能进行自己的实验。) / p>
结论:
1)我不需要在我的项目中添加一些花哨的库来将我的(最终动态创建的)图像转换为PNG;它实际上更好地保持完全未压缩,让iTextSharp完成所有的压缩工作。
2)我还在网上阅读有关iTextSharp在某个DPI上保存图像的内容。我没有看到这个问题...我使用ScalePercent()方法将位图缩放到1%,文件大小相同,位图中的位图像素没有“丢失”...这证实了iTextSharp正在做一个简单,漂亮,通用的无损压缩。
答案 2 :(得分:0)
似乎PDF要求将png转码为其他东西,jpeg,最有可能。
见这里:http://forums.adobe.com/message/2952201
我唯一能想到的是先将png转换为最小的jpeg,包括缩小75%,然后导入该文件而不进行缩放。
答案 3 :(得分:-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();