gpt4 book ai didi

java - 如何将pdf文件拆分一页并删除未使用的对象(优化)

转载 作者:行者123 更新时间:2023-12-02 10:02:19 30 4
gpt4 key购买 nike

我需要使用 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 的重量更轻。

最佳答案

您的文档的问题如下:每个页面共享文档的许多(甚至可能是全部)字体/xobjects。在复制页面时,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。

关于java - 如何将pdf文件拆分一页并删除未使用的对象(优化),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55538694/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com