PDF有损压缩

时间:2012-10-18 15:13:39

标签: pdf compression size

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

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

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

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

Ghostscript执行高质量压缩需要花费太长时间(分钟)。

2 个答案:

答案 0 :(得分:1)

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

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

  1. 设置较低的压缩率。
  2. 下采样(提取图像,将其重新调整为较低的尺寸 分辨率,并将其放回文件中)
  3. 结合前两个。
  4. 以下是使用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;
            // (...)
        }
    }
    

    通常的免责声明适用

答案 1 :(得分:0)

您可能想尝试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方法之一将图像调整为指定的宽度和高度。请注意,在后一种情况下,您需要考虑宽高比。

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