PDFBox LayerUtility - 将图层导入现有PDF

时间:2013-07-22 07:32:37

标签: java pdf pdfbox

我正在使用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]);
...
...

1 个答案:

答案 0 :(得分:4)

使用如下代码,我看不到任何预期的大小增长:

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以重现您的问题。)