PDFBox LayerUtility – 将图层导入现有PDF

我使用pdfbox来操作PDF内容。 我有一个很大的PDF文件(比如500页)。 我还有一些其他单页PDF文件只包含一个图像,最大每个文件大约8-15kb。 我需要做的是将这些单页pdf导入到大PDF文件的某些页面上。

我已经尝试了pdfbox的LayerUtility,我已经成功了但是它创建了一个非常大的文件作为输出。 在处理之前,源pdf大约是1MB,当添加较小的pdf文件时,大小达到64MB。 有时我需要将两个较小的PDF包含在较大的PDF中。

有没有更好的方法来做到这一点,还是我只是做错了? 在下面发布代码,尝试在单个页面上添加两个图层:

... ... .. overlayDoc[pCounter] = PDDocument.load("data\\" + overlay + ".pdf"); outputPage[pCounter] = (PDPage) overlayDoc[pCounter].getDocumentCatalog().getAllPages().get(0); LayerUtility lu = new LayerUtility( overlayDoc[pCounter] ); form[pCounter] = lu.importPageAsForm( bigPDFDoc, Integer.parseInt(pageNo)-1); lu.appendFormAsLayer( outputPage[pCounter], form[pCounter], aTrans, "OVERLAY_"+pCounter ); outputDoc.addPage(outputPage[pCounter]); mOverlayDoc[pCounter] = PDDocument.load("data\\" + overlay2 + ".pdf"); mOutputPage[pCounter] = (PDPage) mOverlayDoc[pCounter].getDocumentCatalog().getAllPages().get(0); LayerUtility lu2 = new LayerUtility( mOverlayDoc[pCounter] ); mForm[pCounter] = lu2.importPageAsForm(outputDoc, outputDoc.getNumberOfPages()-1); lu.appendFormAsLayer( mOutputPage[pCounter], mForm[pCounter], aTrans, "OVERLAY_2"+pCounter ); outputDoc.removePage(outputPage[pCounter]); outputDoc.addPage(mOutputPage[pCounter]); ... ... 

使用以下代码我没有看到任何未预期的大小增长:

 PDDocument bigDocument = PDDocument.load(BIG_SOURCE_FILE); LayerUtility layerUtility = new LayerUtility(bigDocument); List bigPages = bigDocument.getDocumentCatalog().getAllPages(); // import each page to superimpose only once PDDocument firstSuperDocument = PDDocument.load(FIRST_SUPER_FILE); PDXObjectForm firstForm = layerUtility.importPageAsForm(firstSuperDocument, 0); PDDocument secondSuperDocument = PDDocument.load(SECOND_SUPER_FILE); PDXObjectForm secondForm = layerUtility.importPageAsForm(secondSuperDocument, 0); // These things can easily be done in a loop, too AffineTransform affineTransform = new AffineTransform(); // Identity... your requirements may differ layerUtility.appendFormAsLayer((PDPage) bigPages.get(0), firstForm, affineTransform, "Superimposed0"); layerUtility.appendFormAsLayer((PDPage) bigPages.get(1), secondForm, affineTransform, "Superimposed1"); layerUtility.appendFormAsLayer((PDPage) bigPages.get(2), firstForm, affineTransform, "Superimposed2"); bigDocument.save(BIG_TARGET_FILE); 

如您所见,我 FIRST_SUPER_FILE的第一页叠加在目标文件的两个页面上,但我只导入了一次页面 。 因此,导入页面的资源也只导入一次。

这种方法也是循环开放的,但不要多次导入同一页面 ! 而是先将所有必需的模板页面作为表单导入,然后在后面的循环中一次又一次地引用这些表单。

(我希望这可以解决您的问题。如果没有,请提供更多代码和示例PDF以重现您的问题。)