PDF有损压缩

PDF有损压缩,pdf,compression,size,Pdf,Compression,Size,我正在寻找一个库或命令行程序,可以压缩PDF 压缩速度和文件大小非常重要 PDF中充满了非常大的打印质量图像 Adobe Acrobat提供高质量、快速的压缩,但不允许通过编程接口保存“缩小尺寸的PDF” Ghostscript的高质量压缩时间太长(分钟)。如果可以选择商业库,您可以尝试一下。有.net版本(C#/VB.net等)和ActiveX版本(用于C++/Delphi/VB/PHP等) 您可以遍历每个页面的所有对象,选择那些是图像的对象,并减小它们的大小。你有几种可能: 设置较低的压缩率

我正在寻找一个库或命令行程序,可以压缩PDF

压缩速度和文件大小非常重要

PDF中充满了非常大的打印质量图像

Adobe Acrobat提供高质量、快速的压缩,但不允许通过编程接口保存“缩小尺寸的PDF”


Ghostscript的高质量压缩时间太长(分钟)。

如果可以选择商业库,您可以尝试一下。有.net版本(C#/VB.net等)和ActiveX版本(用于C++/Delphi/VB/PHP等)

您可以遍历每个页面的所有对象,选择那些是图像的对象,并减小它们的大小。你有几种可能:

  • 设置较低的压缩率
  • 向下采样(提取图像,将其大小重新调整为较低 解析,并将其放回您的文件中)
  • 将前两者结合起来
  • 下面是第一个选项的代码,在C#中,使用Amyuni PDF Creator.Net:

    //open a pdf document
    document.Open("c:\\temp\\myfile.pdf","");
    IacPage page1 = document.GetPage (1);
    Amyuni.PDFCreator.IacAttribute attribute = page1.AttributeByName ("Objects");
    // listobj is an array list of graphic objects
    System.Collections.ArrayList listobj = (System.Collections.ArrayList) attribute.Value;
    foreach ( object pdfObj in listobj )
    {
        if ((IacObjectType)pdfObj.AttributeByName("ObjectType").Value == IacObjectType.acObjectTypePicture)
        {
            if ((IacImageCompressionConstants)pdfObj.AttributeByName("Compression").Value == IacImageCompressionConstants.acCompressionJPegMedium)
                pdfObj.AttributeByName("Compression").Value = IacImageCompressionConstants.acCompressionJPegLow;
    
            if ((IacImageCompressionConstants)pdfObj.AttributeByName("Compression").Value == IacImageCompressionConstants.acCompressionJPegHigh)
                pdfObj.AttributeByName("Compression").Value = IacImageCompressionConstants.acCompressionJPegMedium;
            // (...)
        }
    }
    
    通常的免责声明适用于您可能想要尝试执行任务的情况

    下面是一个代码,用于缩放宽度或高度大于或等于256的所有图像。然后使用JPEG压缩对缩放图像进行编码,质量设置为65

    public static void RecompressToJpeg(string path, string outputPath)
    {
        using (PdfDocument doc = new PdfDocument(path))
        {
            foreach (PdfImage image in doc.Images)
            {
                // image that is used as mask or image with attached mask are
                // not good candidates for recompression
                if (!image.IsMask && image.Mask == null && (image.Width >= 256 || image.Height >= 256))
                    image.Scale(0.5, PdfImageCompression.Jpeg, 65);
            }
    
            doc.Save(outputPath);
        }
    }
    
    您也可以使用其中一种方法(或另一种
    RecompressXXX
    方法)重新压缩图像,而不更改其大小

    可以使用其中一种方法将图像调整到指定的宽度和高度。请注意,在后一种情况下,您需要考虑纵横比


    免责声明:我为该库的供应商工作。

    这是迄今为止我找到的最好的解决方案:
    gswin64c.exe-dQUIET-dBATCH-dNOPAUSE-dNOGC-dPDFSETTINGS=/screen-sDEVICE=pdfwrite-sOutputFile=compressed.pdf input.pdf
    。将126 MB的文件转换为3.2 MB大约需要20秒。谢谢用户1359680。这很简单也很好,只是在我的系统中已经找到了一个
    gswin32c.exe
    。我将把它包装成一个.cmd单行脚本,并放入我的SendTo文件夹中,以便右键单击应用。更新:我用Neevia CompressPDF购买了99美元。它不会压缩字体或弄乱文本。Ghostscript有时会从可搜索文本层中删除字母。另一个解决方案是使用IDR Solutions的jpdf2html.jar将PDF转换为HTML5,但许可证价格昂贵(2500美元)