当前位置: 首页 > 知识库问答 >
问题:

PDFBox LayerUtility-将层导入现有PDF

东方琪
2023-03-14

我正在使用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个答案

金何平
2023-03-14

使用下面这样的代码,我看不到任何未受影响的大小增长:

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

 类似资料:
  • 我有一张印度的基本地图,其中有邦和边界,一些标签,以及一些其他规范,作为gg对象存储。我想用一个地区层生成一些地图,这些地图将承载来自不同变量的数据。 为了防止地区地图覆盖州和国家边界,它必须在所有之前的代码之前,我想避免重复。 我想我可以通过根据这个答案调用 gg 对象的来做到这一点。但是,它会引发错误。Reprex 如下: 任何帮助都将不胜感激!

  • 我有一个由openssl以以下方式生成的密钥对 openssl genrsa-out private_key.pem 2048 所以我的问题是如何使用KeyTool将现有密钥导入到BKS密钥库中? 谢谢

  • 我已经在Android Studio中创建了一段时间的应用程序,并决定将增强现实添加到我的应用程序中。我在Unity中创建了一个AR项目,并将该文件作为ADT和gradle导出,但不知道如何将其导入到现有项目中。我发现的所有东西都在导入到一个新项目中。如果我不能将它导入到我的Android Studio项目中,那么我可以以某种方式合并这两个项目吗?

  • 我正在基于本文开发一个模型,由于层不支持掩蔽,我遇到了一个异常。 我有一个层,参数设置为。但是,由于后续的层不支持掩蔽,我得到了一个异常。预期会出现例外情况,因为嵌入层的文档中实际说明了

  • 问题内容: 我想在我的AWS Lambda中导入jsonschema库,以执行请求验证。我希望通过Lambda Layers来实现,而不是将依赖项与我的应用程序捆绑在一起。我压缩了所有依赖项。我将其作为lambda层上传,并分别使用和命令将其添加到aws lambda中。zip文件夹的名称为“ lambda-dep.zip”,所有文件都在其下面。但是,当我尝试在lambda_function中导入

  • 问题内容: 在我的android studio项目中要使用现有的Java项目代码 我这样尝试: 单击文件>新建模块。选择Java库,然后单击下一步。 填写必填字段,然后单击完成。 在我的Android项目中创建了一个新的空Java项目库。 我需要在Android Studio项目中使用现有的(java项目)代码,该怎么办? 问题答案: 无法使用gradle文件进行访问 , 如果您的Java项目在e