PDFBox LayerUtility - 将图层导入现有 PDF

2023-12-03

我正在使用 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 两页目标文件的但我只导入页面一次。因此,该导入页面的资源也仅被导入once.

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PDFBox LayerUtility - 将图层导入现有 PDF 的相关文章

随机推荐

  • Google Analytics 出站链接事件跟踪

    我正在尝试设置事件跟踪 以便我可以跟踪某人何时访问我的 关于 页面并单击指向我的 LinkedIn 个人资料的链接 下面是我想要跟踪的链接 正如您所看到的 我尝试添加一些代码来进行跟踪工作 我尝试了几种不同的技术 但到目前为止没有任何效果
  • 使用此列中的数据时排除“dplyr”“mutate_at”中的列

    我想重新调整所有变量 但是year and gender in a df由一个具体的year 分组依据gender set seed 1 df lt data frame gender c rep m 5 rep f 5 year rep
  • 将字符串截断为空格或点之前的最大长度以避免破坏单词

    我发现以下由 webbiedave 创建的 PHP 脚本 strip tags to avoid breaking any html string strip tags string if strlen string gt 500 trun
  • 获取机器的 MAC 地址——好的解决方案吗?

    我听说我当前的 winpcap 库不可能实现这一点 这是真的吗 我在网上看到很多例子 但随后评论说 这不起作用 获取本地计算机的 MAC 地址的最佳方法是什么 一种常见的方法是使用 UUID 中的位 但这并不完全可靠 例如 即使在没有网络适
  • 使用 ShellExecute 打开不带“.exe”扩展名的可执行文件

    我想使用 ShellExecute 打开一个没有 exe 扩展名的可执行文件 我可以使用 CreateProcess 但我更喜欢使用 ShellExecute 有什么办法可以做到吗 我使用 C 和 win32api 函数 谢谢 You us
  • Firestore serverTimestamp() 未定义

    Problem 我设置了一个可调用的云函数 它使用 Admin SDK node js 写入 Firestore const admin require firebase admin const functions require fire
  • 在集群环境中使用 Quartz

    我希望在我的应用程序中使用quartz调度程序 因为我有一个集群环境 并且希望保证每小时只运行一个作业实例 我的问题是 我是否必须使用 JDBC 作业存储或某种作业数据的 外部 存储来保证集群中的实例在任何给定时间仅运行一次作业 或者 Qu
  • 比较不同的“使用参数启动 Cocoa 应用程序”方法

    我发现至少有三种方法可以从应用程序启动 Mac OS X 上的应用程序 NSTask 我可以给出参数 但似乎它不是针对 Cocoa 应用程序 而是针对 UNIX 风格的二进制文件 系统函数 system 与 C 的方式相同 我不知道为什么
  • Python 线程和 PySimpleGUI

    根据 MikeyB 的解决方案进行了修改 感谢 Mikey 指出了一个简单的解决方案 我觉得有时候解决方案需要考虑太多 而一个简单的开销解决方案就可以解决问题 我添加了一个小函数 该函数循环遍历我想要监视的目录 并将变量设置为 True 或
  • ListView onItemClick 从数据库获取行?

    我对 Android 开发相当陌生 我有一个自定义 ListView 其中填充了数据库表中的数据 ListView 项目由类别 日期 标题和金额组成 private class lvIncomeListener implements Ada
  • dyld:未加载库:@rpath/libswiftCore.dylib

    我正在尝试在我的 iPhone 4s 上运行 Swift 应用程序 在模拟器上运行得很好 我朋友在他的iPhone 4s上也能成功运行 我有 iOS 8 和 Xcode 6 的正式版本 我努力了 重新启动 Xcode iPhone 电脑 清
  • 如何为 Amazon EC2 创建 IAM 角色?

    我正在探索 IAM 角色 我想知道如何代表 EC2 上的用户访问角色 非常感谢任何帮助 Thanks 在使用以下命令启动 EC2 实例后 您通常不需要执行任何特殊操作 Amazon EC2 的 IAM 角色 我从你重复的问题中发现 你已经这
  • SyntaxError:NextJS 身份验证集成中出现意外的令牌“导出”

    我一直在使用 Next js 使用 next auth 和 Prisma 开发一个网站 一切都工作正常 但是今天代码不再工作了 我刚刚从以下任何页面收到此错误 nextauth js Server Error SyntaxError Une
  • 如何从地理编码地址查找 lat lng?

    我正在尝试创建一个 Gmap 来允许人们对地址进行地理编码并找到相应的经纬度 我希望在我已经创建的表单中看到这一点 另外 我希望能够在拖动标记时更改坐标
  • 如何从不同线程绘制opengl图形?

    我想制作一个 opengl 应用程序来显示一些 3d 图形和命令行 我想让它们分开线程 因为它们都是繁重的进程 我认为我可以用 2 个不同的视口来解决这个问题 但我想知道如何处理 opengl 中的线程 根据我读到的内容 Opengl 是异
  • 撤消 TFS 取消搁置

    我使用的是 Visual Studio 2015 TFS 的版本是 2012 版本 11 0 51106 1 有没有办法撤消取消搁置 其他人的用户搁置集 以达到以前取消搁置命令的情况 不 没有这个命令 Unshelving这是将搁架组恢复到
  • Android 轮播图库

    我怎样才能轮播图片库 它永远不会结束 在最后一张图片之后和第一张最后一张图片之前 我通过创建自己的列表适配器 继承自 基础适配器 我以 getCount 方法的方式编写了自己的列表适配器 返回一个 HUUUUGE 数字 如果选择 x 项 则
  • 没有 CocoaPods 的 Google 登录

    我正在尝试将 iOS 版 Google 登录与此处找到的文档集成 https developers google com identity sign in ios start integrating 在不使用 Cocoapods 的情况下如
  • 从 List 到数组 T[] 的转换

    有没有一种简单的方法来转换强类型List
  • PDFBox LayerUtility - 将图层导入现有 PDF

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