liujunjieonline 2024-05-28 11:02 采纳率: 62.5%
浏览 12
已结题

pdf如何压缩保持清晰度不变

pdf压缩问题:一个pdf大小492kb,压缩之后只有83kb,清晰度什么的都没变,但是通过其他网站压缩之后只有7kb了,清晰度也一样的没变,这是怎么做到的,找了好多资料都做不到,我用的是itextsharp

  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-28 11:02
    关注

    引自免费微信小程序:皆我百晓生

    为了实现PDF文件的压缩并保持清晰度,我们可以尝试优化图片质量和减少PDF中的冗余数据。这里有一个使用iTextSharp库的C#示例,展示如何进行有损压缩和无损压缩。首先确保已经安装了iTextSharp库,如果没有,可以通过NuGet包管理器安装。

    1. 安装iTextSharp库:

      Install-Package iTextSharp
      
    2. 下面是一个简单的C#代码片段,演示如何使用iTextSharp进行PDF压缩:

    using System.IO;
    using iTextSharp.text.pdf;
    
    namespace PdfCompressionExample
    {
        class Program
        {
            static void Main(string[] args)
            {
                string sourcePdf = "source_file_path.pdf";
                string targetPdf = "compressed_file_path.pdf";
    
                CompressPdf(sourcePdf, targetPdf);
            }
    
            public static void CompressPdf(string sourcePath, string targetPath)
            {
                using (var reader = new PdfReader(sourcePath))
                using (var writer = new PdfStamper(reader, new FileStream(targetPath, FileMode.Create)))
                {
                    for (int i = 1; i <= reader.NumberOfPages; i++)
                    {
                        var page = writer.GetImportedPage(reader, i);
                        var stamper = writer.GetOverContent(i);
    
                        // 图片压缩配置
                        int quality = 85; // 压缩质量,范围0-100,值越大质量越高
                        int maxImageSize = 1024 * 1024; // 图片最大尺寸(字节),根据实际情况调整
    
                        foreach (var image in GetImagesOnPage(stamper))
                        {
                            if (image.Length > maxImageSize)
                            {
                                var imgStream = new MemoryStream(image);
                                var img = Image.GetInstance(imgStream);
                                img.SetAbsolutePosition(0, 0); // 设置图像位置
                                img.ScaleToFit(page.Width, page.Height); // 调整图像尺寸以适应页面大小
                                img.SetResolution(300, 300); // 设置分辨率
                                imgCompressed = img.CompressImage(quality);
                                stamper.AddImage(imgCompressed, page.Width, page.Height, 0, 0);
                            }
                        }
                    }
                }
            }
    
            private static byte[][] GetImagesOnPage(PdfStamper stamper)
            {
                List<byte[]> images = new List<byte[]>();
                PdfDictionary pageDict = stamper.GetUnderlyingWriter().GetCurrentPage();
                PdfArray resources = pageDict.GetAsArray(PdfName.RESOURCES);
                if (resources != null)
                {
                    PdfDictionary xObject = resources.GetAsDict(PdfName.XOBJECT);
                    if (xObject != null)
                    {
                        foreach (PdfName key in xObject.Keys)
                        {
                            PdfObject obj = xObject.Get(key);
                            if (obj.IsIndirect())
                            {
                                PdfDictionary xObjectDict = stamper.GetPdfObject(obj).AsDictionary();
                                PdfName type = xObjectDict.GetAsName(PdfName.TYPE);
                                if (type == PdfName.IMAGE)
                                {
                                    byte[] imageData = stamper.GetPdfObject(xObjectDict.Get(PdfName.BITMAP)).AsStream().ToArray();
                                    images.Add(imageData);
                                }
                            }
                        }
                    }
                }
                return images.ToArray();
            }
        }
    }
    

    这段代码会遍历PDF中的每一页,并检查其中的图片。如果图片的大小超过指定的最大尺寸,它将对图片进行压缩。这个过程包括读取图片、设置其在页面上的位置和尺寸、以及设置分辨率。然后,它会替换原来的图片为压缩后的版本。

    要达到像其他网站那样小的文件大小,可能还需要进一步的优化,比如合并多个PDF或删除不必要的元数据。这可能涉及到更复杂的处理,例如解析PDF结构,识别和删除不需要的部分。如果你需要这样的高级功能,可能需要考虑使用更专业的PDF处理库,例如PDFTron SDK。

    注意:此代码仅针对嵌入式位图图像进行压缩,对于矢量图形和其他类型的图像,可能需要额外的处理方法。此外,压缩效果还取决于原始PDF内容,不同的PDF可能需要不同的参数来获得最佳压缩效果。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月22日
  • 已采纳回答 8月14日
  • 创建了问题 5月28日

悬赏问题

  • ¥100 需要跳转番茄畅听app的adb命令
  • ¥50 寻找一位有逆向游戏盾sdk 应用程序经验的技术
  • ¥15 请问有用MZmine处理 “Waters SYNAPT G2-Si QTOF质谱仪在MSE模式下采集的非靶向数据” 的分析教程吗
  • ¥50 opencv4nodejs 如何安装
  • ¥15 adb push异常 adb: error: 1409-byte write failed: Invalid argument
  • ¥15 nginx反向代理获取ip,java获取真实ip
  • ¥15 eda:门禁系统设计
  • ¥50 如何使用js去调用vscode-js-debugger的方法去调试网页
  • ¥15 376.1电表主站通信协议下发指令全被否认问题
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证