首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PDF有损压缩

PDF有损压缩
EN

Stack Overflow用户
提问于 2012-10-18 23:13:39
回答 2查看 1.3K关注 0票数 5

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

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

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2012-10-19 04:30:50

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

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

  1. 设置较低的压缩分辨率(提取图像,将其重新调整为较低的分辨率,然后将其放回您的file)
  2. Combining中前两个分辨率。

下面是使用Amyuni PDF Creator .Net在C#中实现第一个选项的代码:

代码语言:javascript
复制
//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
EN

Stack Overflow用户

发布于 2012-10-19 05:07:51

您可能希望尝试使用Docotic.Pdf library完成您的任务。

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

代码语言:javascript
复制
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方法之一将图像调整到指定的宽度和高度。请注意,在后一种情况下,您需要考虑纵横比。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12957925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档