iText 7 中的 PdfConcatenate(智能)

PdfConcatenate (smart) in iText 7

在 iText v5 中,可以选择 'smart' 串联 PDF 文档:

public PdfConcatenate(OutputStream os, boolean smart) throws DocumentException

Creates an instance of the concatenation class.

Parameters:

os - the OutputStream for the PDF document
smart - do we want PdfCopy to detect redundant content?

我正在做的初始化是这样的:

PdfConcatenate concatenatedPdf = new PdfConcatenate(outputStream, true);

在我读到的 iText 7 中,我们应该使用 copyPages 函数。类似于:

[...]
PdfDocument concatenatedPdf = new PdfDocument(writer);
PdfDocument docToAdd = new PdfDocument(pdfReader);
docToAdd.copyPagesTo(1, docToAdd.getNumberOfPages(), concatenatedPdf);

我正在迁移将文档从 iText v5 合并到 v7 的逻辑。对于 v5 中使用 PdfConcatenate 和标志 'smart' 的示例测试,结果 PDF 为 177 KB,在 v7 中为 763 KB。有没有办法在 iText v7 中检测到这些冗余内容?

首先,iText7 提供了一个名为 PdfMerger 的方便的 class 用于合并 PDF。

这是一个如何使用它的示例:

PdfDocument sourceDocument = new PdfDocument(new PdfReader(filename));

PdfMerger resultDocument = new PdfMerger(new PdfDocument(new PdfWriter(resultFile)));
resultDocument.merge(sourceDocument, fromPage, toPage);
resultDocument.close();
sourceDocument.close();

当然,在示例中,只有源文档中的一组页面被添加到生成的文档中,但您可以根据需要多次调用 merge 函数。

现在,当您希望生成的文件在文件大小方面尽可能小时,您需要为提供给 PdfMerger 的目标 PdfDocument 指定一些设置。

首先,您可以调整流的压缩级别以使用更多 CPU 和时间但压缩得更好:

PdfMerger resultDocument = new PdfMerger(new PdfDocument(
            new PdfWriter(resultFile, new WriterProperties().setCompressionLevel(CompressionConstants.BEST_COMPRESSION))));

要压缩得更好,您可以使用完全压缩。这不仅可以更好地压缩流(页面内容、图像、字体),还可以压缩通常在输出文件大小中占用很多位的 PDF 对象。可以这样做:

PdfMerger resultDocument = new PdfMerger(new PdfDocument(
            new PdfWriter(resultFile, new WriterProperties().setFullCompressionMode(true))));

如果默认情况下源文档具有相同的对象,您可能会有一些重复。所谓的 "Smart Mode" 提供了避免此类重复的可能性,并在存在许多重复对象的情况下优化文件大小。这将是您在 iText 5 代码中引用的 "smart" 标志的关闭模拟。您可以通过以下方式在 iText 7 中启用智能模式:

PdfMerger resultDocument = new PdfMerger(new PdfDocument(
            new PdfWriter(resultFile, new WriterProperties().useSmartMode())));