在iText v5中,可以选择对PDF文档进行“智能”连接:
public PdfConcatenate(OutputStream os, boolean smart) throws DocumentException创建连接类的实例。 参数: os -用于PDF文档智能的OutputStream -我们希望PdfCopy检测冗余内容吗?
我所做的初始化应该是这样的:
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中的冗余内容?
发布于 2019-07-26 19:59:34
首先,iText7为合并PDF提供了一个名为PdfMerger的方便类。
下面是一个如何使用它的示例:
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函数。
现在,当您希望生成的文件在文件大小上尽可能小时,您需要为输入到PdfDocument的目标PdfMerger指定一些设置。
首先,您可以调整流的压缩级别以使用更多的CPU和时间,但压缩更好:
PdfMerger resultDocument = new PdfMerger(new PdfDocument(
new PdfWriter(resultFile, new WriterProperties().setCompressionLevel(CompressionConstants.BEST_COMPRESSION))));要更好地压缩,可以使用完全压缩。这不仅会更好地压缩流(页面的内容、图像、字体),而且还会压缩PDF对象,这些对象通常占用了out文件大小中的许多位。这样做是可以的:
PdfMerger resultDocument = new PdfMerger(new PdfDocument(
new PdfWriter(resultFile, new WriterProperties().setFullCompressionMode(true))));在默认情况下,如果源文档具有相同的对象,则可能会有一些重复。所谓的“智能模式”提供了一种可能性,以避免这种重复,并优化文件大小的情况下,有许多重复的对象。这将是您在iText 5代码中引用的“智能”标志的关闭模拟。您可以通过以下方式在iText 7中启用智能模式:
PdfMerger resultDocument = new PdfMerger(new PdfDocument(
new PdfWriter(resultFile, new WriterProperties().useSmartMode())));https://stackoverflow.com/questions/57223168
复制相似问题