4

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

1 回答 1

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

于 2013-07-22T10:33:01.883 回答