如何将 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。