【问题标题】:PDF lossy compressionPDF有损压缩
【发布时间】:2012-10-09 02:30:25
【问题描述】:

我正在寻找可以压缩 PDF 的库或命令行程序。

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

PDF 包含非常大的打印质量图像。

Adobe Acrobat 可以进行高质量、快速的压缩,但不允许通过编程接口保存“缩小尺寸的 pdf”。

Ghostscript 高质量压缩是否需要太长时间(分钟)。

【问题讨论】:

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

标签: pdf compression size


【解决方案1】:

如果可以选择商业图书馆,您可以试试Amyuni PDF Creator。有 .net 版本(C#/VB.Net 等)和 ActiveX 版本(用于 C++/Delphi/VB/PHP 等)。

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

  1. 设置较低的压缩率。
  2. 下采样(提取图像,将其重新调整为较低的 分辨率,并将其放回您的文件中)
  3. 结合前两者。

这是使用 Amyuni PDF Creator .Net 的 C# 中第一个选项的代码外观:

//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;
        // (...)
    }
}

通常的免责声明适用

【讨论】:

    【解决方案2】:

    您可能想尝试Docotic.Pdf library 来完成您的任务。

    这是一个缩放所有宽度或高度大于或等于 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);
        }
    }
    

    您也可以使用RecompressWithJpeg 方法之一(或其他RecompressXXX 方法之一)重新压缩图像而不更改其大小。

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

    免责声明:我为图书馆的供应商工作。

    【讨论】:

      猜你喜欢
      • 2014-09-28
      • 1970-01-01
      • 1970-01-01
      • 2011-07-12
      • 1970-01-01
      • 2016-10-02
      • 2011-07-07
      • 2014-05-18
      • 1970-01-01
      相关资源
      最近更新 更多