gpt4 book ai didi

java - PDFBox LayerUtility - 将图层导入现有 PDF

转载 作者:搜寻专家 更新时间:2023-11-01 02:47:55 25 4
gpt4 key购买 nike

我正在使用 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 以重现您的问题。)

关于java - PDFBox LayerUtility - 将图层导入现有 PDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17782153/

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