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())));
在 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())));