减小 pdf 文件大小

问题描述 投票:0回答:1

我在使用图像转换为文档时遇到问题,PDF的大小使图像的大小增加了一倍,我尝试了很多解决方案,但没有办法

找到我的代码

private static byte[] ConvertToPDF(byte[] imgeByte, string fileExtension)
{
    try
    {
        using (MemoryStream ExportFile = new MemoryStream())
        {
            using (PdfWriter writer = new PdfWriter(ExportFile, new WriterProperties().SetPdfVersion(PdfVersion.PDF_1_5)
                 .SetCompressionLevel(CompressionConstants.BEST_COMPRESSION).SetFullCompressionMode(true)))
            {
                using (PdfDocument pdfDoc = new PdfDocument(writer, new DocumentProperties()))
                {
                    using (Document document = new Document(pdfDoc, iText.Kernel.Geom.PageSize.A4, true))
                    {
                        iText.IO.Image.ImageData imageData = null;
                        iText.Layout.Element.Image img = null;

                        bool isTIFF = fileExtension.ToLower().Contains("tif");

                        if (isTIFF)
                        {
                            int PagesCount;
                            using (Bitmap currentImg = new Bitmap(new MemoryStream(imgeByte)))
                            {
                                PagesCount = currentImg.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page);

                                for (int i = 1; i <= PagesCount; i++)
                                {
                                    imageData = iText.IO.Image.ImageDataFactory.CreateTiff(imgeByte, false, i, true);
                                    img = new iText.Layout.Element.Image(imageData).SetHorizontalAlignment(HorizontalAlignment.CENTER);
                                    
                                    document.Add(img);

                                    if (i < PagesCount - 1)
                                    {
                                        document.Add(new iText.Layout.Element.AreaBreak(AreaBreakType.NEXT_PAGE));
                                        //pdfDoc.AddNewPage(i+1, iText.Kernel.Geom.PageSize.A4);
                                    }
                                }
                            }
                        }
                        else
                        {
                            if (fileExtension.ToLower().Contains("png"))
                            {
                                imageData = iText.IO.Image.ImageDataFactory.CreatePng(imgeByte);
                            }
                            else if (fileExtension.ToLower().Contains("jpg"))
                            {
                                imageData = iText.IO.Image.ImageDataFactory.CreateJpeg(imgeByte);
                            }
                            else if (fileExtension.ToLower().Contains("pdf"))
                            {
                                return imgeByte;
                            }
                            else
                            {
                                using (Bitmap currentImg = new Bitmap(new MemoryStream(imgeByte)))
                                {
                                    imageData = iText.IO.Image.ImageDataFactory.Create(currentImg, null);
                                }
                            }

                            img = new iText.Layout.Element.Image(imageData)
                                .SetTextAlignment(TextAlignment.JUSTIFIED_ALL);

                            document.Add(img);
                        }
                        writer.Flush();
                        document.Flush();
                        pdfDoc.SetFlushUnusedObjects(true);

                        document.Close();
                        writer.Close();
                        pdfDoc.Close();
                    }
                }
            }
            return ExportFile.ToArray();
        }
    }
    catch (Exception)
    {

        throw;
    }
}

更多详情: PDF文档大小:73.410 Tif 图像大小:36.930 Tif 页数:96 页

我需要将 PDF 文件大小减小到与图像大小相同或更小。

c# pdf tiff itext7
1个回答
0
投票

出现该问题的原因是输入的 TIFF 图像使用 JPEG 压缩,而 PDF 文件中的图像很可能使用 Flate 压缩。对于某些类型的内容,JPEG 的压缩比比 Flate 好得多。

检查 iText API,看看是否可以告诉库对图像使用 JPEG 压缩而不是 Flate。如果没有,您可以将 currentImg 的当前帧保存为 JPEG 到内存流,然后创建 JPEG 图像 (

iText.IO.Image.ImageDataFactory.CreateJpeg
) 并将其添加到文档中。

© www.soinside.com 2019 - 2024. All rights reserved.