如何将 pdf 文件拆分为一页并删除未使用的对象(优化)
How to split pdf file by one page and remove unused objects (optimize)
我需要使用 itext 7
拆分大型文档(数千页和 1-2 Gb)
我已经尝试使用此参考拆分 pdf
https://itextpdf.com/en/resources/examples/itext-7/splitting-pdf-file
并且还做这样的事情:
try (PdfDocument pdfDoc = new PdfDocument(new PdfReader(outputPdfPath.toString()))) {
Files.createDirectories(Paths.get(destFolder));
int numberOfPages = pdfDoc.getNumberOfPages();
int pageNumber = 0;
while (pageNumber < numberOfPages) {
try (PdfDocument document = new PdfDocument(
new PdfWriter(destFolder + pages.get(pageNumber++).id + ".pdf"))) {
pdfDoc.copyPagesTo(pageNumber, pageNumber, document);
}
}
log.info("Provided PDF has been split into multiple.");
}
这两个示例都运行良好,但创建的文档很大并且包含许多未使用的字体、图像和对象。
我怎样才能删除所有这些未使用的对象以减轻新创建的一页 pdf 的重量。
您文档的问题如下:每个页面共享文档的很多(甚至全部)fonts/xobjets。在处理页面时,iText 不知道页面上是否需要资源:它只是复制它们,这就是为什么您会得到如此巨大的结果 pdf。
您要查找的选项是 iText 的pdfSweep
。
它的一般用途是编辑某些页面的内容,但除此之外 pdfSweep
还会在编辑时优化页面。
那么如何解决你的问题呢?
a) 指定密文区域为退化矩形
b) 清理页面(拆分文档或原始文档):
PdfCleanUpLocation dummyLocation = new PdfCleanUpLocation(1, new Rectangle(0, 0, 0, 0), null);
PdfDocument pdfDocument = new PdfDocument(new PdfReader(input), new PdfWriter(output));
PdfCleanUpTool cleaner = (cleanUpLocations == null)
? new PdfCleanUpTool(pdfDocument, true)
: new PdfCleanUpTool(pdfDocument, cleanUpLocations);
cleaner.cleanUp();
pdfDocument.close();
我已经尝试过这种方法来处理您生成的第一个文档(代表第一页)。
文档大小之前pdfSweep
处理:9282 KB。
pdfSweep
处理后的文档大小:549 KB。
我需要使用 itext 7
拆分大型文档(数千页和 1-2 Gb)我已经尝试使用此参考拆分 pdf https://itextpdf.com/en/resources/examples/itext-7/splitting-pdf-file 并且还做这样的事情:
try (PdfDocument pdfDoc = new PdfDocument(new PdfReader(outputPdfPath.toString()))) {
Files.createDirectories(Paths.get(destFolder));
int numberOfPages = pdfDoc.getNumberOfPages();
int pageNumber = 0;
while (pageNumber < numberOfPages) {
try (PdfDocument document = new PdfDocument(
new PdfWriter(destFolder + pages.get(pageNumber++).id + ".pdf"))) {
pdfDoc.copyPagesTo(pageNumber, pageNumber, document);
}
}
log.info("Provided PDF has been split into multiple.");
}
这两个示例都运行良好,但创建的文档很大并且包含许多未使用的字体、图像和对象。 我怎样才能删除所有这些未使用的对象以减轻新创建的一页 pdf 的重量。
您文档的问题如下:每个页面共享文档的很多(甚至全部)fonts/xobjets。在处理页面时,iText 不知道页面上是否需要资源:它只是复制它们,这就是为什么您会得到如此巨大的结果 pdf。
您要查找的选项是 iText 的pdfSweep
。
它的一般用途是编辑某些页面的内容,但除此之外 pdfSweep
还会在编辑时优化页面。
那么如何解决你的问题呢?
a) 指定密文区域为退化矩形
b) 清理页面(拆分文档或原始文档):
PdfCleanUpLocation dummyLocation = new PdfCleanUpLocation(1, new Rectangle(0, 0, 0, 0), null);
PdfDocument pdfDocument = new PdfDocument(new PdfReader(input), new PdfWriter(output));
PdfCleanUpTool cleaner = (cleanUpLocations == null)
? new PdfCleanUpTool(pdfDocument, true)
: new PdfCleanUpTool(pdfDocument, cleanUpLocations);
cleaner.cleanUp();
pdfDocument.close();
我已经尝试过这种方法来处理您生成的第一个文档(代表第一页)。
文档大小之前pdfSweep
处理:9282 KB。
pdfSweep
处理后的文档大小:549 KB。