iText7 图像质量优化器不能作为文档工作

Posted

技术标签:

【中文标题】iText7 图像质量优化器不能作为文档工作【英文标题】:iText7 Image Quality Optimizer not working as document 【发布时间】:2021-10-13 03:57:44 【问题描述】:

我正在使用iText7PDF Optimizer 产品。它使用起来非常简单,但它根本不会降低我的 PDF 的图像质量和大小。我使用的代码与他们产品的实时 LIVE DEMO 中给出的代码完全相同,但它没有按文档说明工作。我使用的是C# 版本。 我尝试按照代码中给出的方式切换 image_scalar_levelcompression_level,但它没有产生任何影响。如果我上传相同的 PDF 文件来测试他们的演示,它工作正常。 我究竟做错了什么?任何帮助/指南将不胜感激。

编辑: (根据要求添加我正在使用的代码)

        LicenseKey.LoadLicenseFile("license-key-path.xml");

        PdfOptimizer optimizer = new PdfOptimizer();

        /* Here we instantiate a FileReportBuilder which we can use as a log of the efficacy of
            our optimization.  Security level configuration possible.                          */

        FileReportPublisher publisher = new FileReportPublisher(new FileInfo("report.txt"));
        FileReportBuilder builder = new FileReportBuilder(SeverityLevel.INFO, publisher);
        optimizer.SetReportBuilder(builder);

        optimizer.AddOptimizationHandler(new FontDuplicationOptimizer());
        optimizer.AddOptimizationHandler(new FontSubsettingOptimizer());

        /* Scales down and compresses Image objects. In this case, we scale and compress a
             Tiff image by 50% */
        ImageQualityOptimizer tiff_optimizer = new ImageQualityOptimizer();
        tiff_optimizer.SetTiffProcessor(new BitmapCompressor(.05f, .05f));
        optimizer.AddOptimizationHandler(new ImageQualityOptimizer());
        optimizer.AddOptimizationHandler(new CompressionOptimizer());

        ColorSpaceConverter RGB_to_CMYK_Converter = new ColorSpaceConverter();
        CsConverterProperties csConversionProperties = new CsConverterProperties(ColorConversionMode.NORMAL);
        RGB_to_CMYK_Converter.SetCsConverter(new RgbToCmykCsConverter(csConversionProperties));
        optimizer.AddOptimizationHandler(RGB_to_CMYK_Converter);

        // Document is optimized according to defined handlers and written out to file.
        optimizer.Optimize(
                new FileInfo(@"D:\sample-input\ImageQuality_Optimization_Input.pdf"),
                new FileInfo(@"D:\sample-input\ImageQuality_Optimization_Input_OPT.pdf"));

以下是代码执行后report.txt的内容:

[INFO] PdfOptimizer/FontDuplicationOptimizer: No font duplication found
[INFO] PdfOptimizer/FontSubsettingOptimizer: Glyphs in document were found successfully.
[INFO] PdfOptimizer/ColorSpaceConverter: Color space of the content stream with reference 5 0 R was converted.
[INFO] PdfOptimizer/ColorSpaceConverter: Color space of the content stream resources was converted.

我使用的 pdf 文件来自他们的 KB 文章 HERE 中的 Image Quality Compressor Demo。 知识库文章的链接是HERE

【问题讨论】:

你能分享你正在使用的代码吗?您是在尝试沙盒,还是“LIVE DEMO”上的“应用程序”? @AndréLemos 我已经添加了我正在使用的代码。它几乎是演示版的复制粘贴。我还包含了针对执行生成的result.txt 文件。对文件完全没有影响。它保持相同的大小。而在他们的知识库文章中,它减少了很多。 @AndréLemos 我正在尝试在他们的 LIVE DEMO 左侧上传。 您可以尝试添加 System.Drawing.Common Version="4.7.0" 作为依赖项吗? 嗨!首先,在您添加的代码示例中,您没有添加 tiff_optimizer 作为优化处理程序。在report.txt 中没有来自ImageQualityOptimizer 的日志记录。这意味着没有图像质量优化。但据我了解,如果您添加tiff_optimizer,您将在report.txt 中看到以下行:[ERROR] PdfOptimizer/ImageQualityOptimizer: Unable to optimize image with reference 7 0 R of type TIFF,是吗? 【参考方案1】:

    在您的示例中,您没有添加 tiff_optimizer 作为优化处理程序。在report.txt 中没有来自ImageQualityOptimizer 的日志记录。这意味着,没有图像质量优化。但据我了解,如果您添加tiff_optimizer,您将在report.txt 中看到以下行:

    [ERROR] PdfOptimizer/ImageQualityOptimizer: Unable to optimize image with reference 7 0 R of type TIFF
    

    PdfOptimizer 不抛出任何异常,如果在优化过程中抛出任何异常,则 handlers 链中的当前 handler 完成并写入 log 表明它无法执行指定的操作。

    为了了解问题的根源,我调试了PdfOptimizer#Optimize方法,发现ImageQualityOptimizer#optimizePdf中抛出了异常

    System.IO.FileNotFoundException: Could not load file or assembly 'System.Drawing.Common, Version=4.0.0.1, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'
    

    ImageQualityOptimizer 捕获并写入日志。

总而言之,解决方案是:

    tiff_optimizer 添加为优化处理程序:

    optimizer.AddOptimizationHandler(tiff_optimizer);
    

    System.Drawing.Common 添加为依赖项

【讨论】:

以上是关于iText7 图像质量优化器不能作为文档工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 itext7 Java 将多个图像添加到 PDF?

如何在 iPhone 中以高质量调整图像大小

基于人眼视觉模型,实现码率质量成本的最优均衡

基于人眼视觉模型,实现码率质量成本的最优均衡

iText7 & C# 从存储在 MSSQL DB 中的 PDF 中提取页面

text 图像优化 - 质量