PDFBox 按钮执行 javascript 关闭文档

2023-12-20

我的用例是在 pdf 页面上有一个像这样的按钮(实际上是将它们添加到现有页面,但现在我只想看到它对任何东西都有效)。

----------
-  Back  -
----------

它所做的只是关闭当前的 pdf 页面。这个想法是打开多个选项卡,每个选项卡都是一个 pdf,然后当您点击“后退”按钮时,它会关闭当前的 pdf,然后将焦点返回到上一个 pdf。这是我迄今为止一直在尝试使用的。

        // Create a new empty document
        try {
            PDDocument document = new PDDocument();

            // Create a new blank page and add it to the document
            PDPage blankPage = new PDPage();
            document.addPage( blankPage );

            PDBorderStyleDictionary borderULine = new PDBorderStyleDictionary();
            borderULine.setStyle(PDBorderStyleDictionary.STYLE_UNDERLINE);
            PDColor green = new PDColor(new float[] { 0, 1, 0 }, PDDeviceRGB.INSTANCE);
//            PDAnnotationTextMarkup txtMark = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT);

//            textWidth = (font.getStringWidth("Click Here") / 1000) * 18;
            PDAnnotationLink txtLink = new PDAnnotationLink();
            txtLink.setBorderStyle(borderULine);

            // add an action
//            PDActionURI action = new PDActionURI();
//            action.setURI("www.google.com");
            PDActionJavaScript action = new PDActionJavaScript("this.closeDoc()");
            txtLink.setAction(action);
            txtLink.setContents("HI");
            txtLink.setColor(green);

            PDRectangle position = new PDRectangle();
            position.setLowerLeftX(10);
            position.setLowerLeftY(20);
            position.setUpperRightX(100);
            position.setUpperRightY(40);
            txtLink.setRectangle(position);
            txtLink.setInvisible(false);
            blankPage.getAnnotations().add(txtLink);

            // Save the newly created document
            document.save("C:\\Users\\jsmith\\Desktop\\demo\\BlankPage.pdf");
            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

我似乎看不到 pdf 页面上的任何内容(它只是全白色),我确实得到了以下代码,至少能够转到新页面而不是 javascript,但它仍然不可见。我只是能够将鼠标悬停在左下角,并注意到我可以单击一个链接。

            PDActionURI action = new PDActionURI();
            action.setURI("www.google.com");

OP 自己的答案的评论中讨论了改进的答案,它还包括来自后续问题 https://stackoverflow.com/questions/56267694/.

PDDocument doc = new PDDocument();
PDPage page = new PDPage();
doc.addPage(page);

COSDictionary acroFormDict = new COSDictionary();
PDAcroForm acroForm = new PDAcroForm(doc, acroFormDict);
doc.getDocumentCatalog().setAcroForm(acroForm);
acroForm.setFields(new ArrayList<>());

PDPushButton button = new PDPushButton(acroForm);
button.setPartialName("Btn1");

PDActionJavaScript actionJavaScript = new PDActionJavaScript("this.closeDoc();");
PDAnnotationAdditionalActions additionalActions = new PDAnnotationAdditionalActions();
additionalActions.setU(actionJavaScript);

// widget
PDAnnotationWidget widget = button.getWidgets().get(0);
widget.setActions(additionalActions);
widget.setRectangle(new PDRectangle(100, 700, 100, 50));

PDColor colourBlack = new PDColor(new float[] { 0, 0, 0 }, PDDeviceRGB.INSTANCE);
PDAppearanceCharacteristicsDictionary fieldAppearance
        = new PDAppearanceCharacteristicsDictionary(new COSDictionary());
fieldAppearance.setBorderColour(colourBlack);
widget.setAppearanceCharacteristics(fieldAppearance);

// Create appearance
PDAppearanceDictionary appearanceDictionary = new PDAppearanceDictionary();
PDAppearanceStream appearanceStream = new PDAppearanceStream(doc);
appearanceStream.setResources(new PDResources());
try (PDPageContentStream cs = new PDPageContentStream(doc, appearanceStream))
{
    PDRectangle bbox = new PDRectangle(widget.getRectangle().getWidth(), widget.getRectangle().getHeight());
    appearanceStream.setBBox(bbox);
    cs.setNonStrokingColor(0, 0, 0); // black
    cs.addRect(bbox.getLowerLeftX() + 0.5f, bbox.getLowerLeftY() + 0.5f, bbox.getWidth() - 1, bbox.getHeight() - 1);
    cs.stroke();

    // put some useful text
    cs.setFont(PDType1Font.HELVETICA, 20);
    cs.beginText();
    cs.newLineAtOffset(20, 20);
    cs.showText("Close");
    cs.endText();
}
appearanceDictionary.setNormalAppearance(appearanceStream);
widget.setAppearance(appearanceDictionary);

page.getAnnotations().add(widget);

acroForm.getFields().add(button);

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

PDFBox 按钮执行 javascript 关闭文档 的相关文章

  • 在 Java 中连接和使用 Cassandra

    我已经阅读了一些关于 Cassandra 是什么以及它可以做什么的教程 但我的问题是如何在 Java 中与 Cassandra 交互 教程会很好 如果可能的话 有人可以告诉我是否应该使用 Thrift 还是 Hector 哪一个更好以及为什
  • Spring Batch 多线程 - 如何使每个线程读取唯一的记录?

    这个问题在很多论坛上都被问过很多次了 但我没有看到适合我的答案 我正在尝试在我的 Spring Batch 实现中实现多线程步骤 有一个包含 100k 条记录的临时表 想要在 10 个线程中处理它 每个线程的提交间隔为 300 因此在任何时
  • 给定两个 SSH2 密钥,我如何检查它们是否属于 Java 中的同一密钥对?

    我正在尝试找到一种方法来验证两个 SSH2 密钥 一个私有密钥和一个公共密钥 是否属于同一密钥对 我用过JSch http www jcraft com jsch 用于加载和解析私钥 更新 可以显示如何从私钥 SSH2 RSA 重新生成公钥
  • 无法展开 RemoteViews - 错误通知

    最近 我收到越来越多的用户收到 RemoteServiceException 错误的报告 我每次给出的堆栈跟踪如下 android app RemoteServiceException Bad notification posted fro
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 磁模拟

    假设我在 n m 像素的 2D 表面上有 p 个节点 我希望这些节点相互吸引 使得它们相距越远吸引力就越强 但是 如果两个节点之间的距离 比如 d A B 小于某个阈值 比如 k 那么它们就会开始排斥 谁能让我开始编写一些关于如何随时间更新
  • 路径中 File.separator 和斜杠之间的区别

    使用有什么区别File separator和一个正常的 在 Java 路径字符串中 与双反斜杠相反 平台独立性似乎不是原因 因为两个版本都可以在 Windows 和 Unix 下运行 public class SlashTest Test
  • 无法解析插件 Java Spring

    我正在使用 IntelliJ IDEA 并且我尝试通过 maven 安装依赖项 但它给了我这些错误 Cannot resolve plugin org apache maven plugins maven clean plugin 3 0
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • AWS 无法从 START_OBJECT 中反序列化 java.lang.String 实例

    我创建了一个 Lambda 函数 我想在 API 网关的帮助下通过 URL 访问它 我已经把一切都设置好了 我还创建了一个application jsonAPI Gateway 中的正文映射模板如下所示 input input params
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 玩!框架:运行“h2-browser”可以运行,但网页不可用

    当我运行命令时activator h2 browser它会使用以下 url 打开浏览器 192 168 1 17 8082 但我得到 使用 Chrome 此网页无法使用 奇怪的是它以前确实有效 从那时起我唯一改变的是JAVA OPTS以启用
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Firebase 添加新节点

    如何将这些节点放入用户节点中 并创建另一个节点来存储帖子 我的数据库参考 databaseReference child user getUid setValue userInformations 您需要使用以下代码 databaseRef
  • 如何修复 JNLP 应用程序中的“缺少代码库、权限和应用程序名称清单属性”?

    随着最近的 Java 更新 许多人都遇到了缺少 Java Web Start 应用程序的问题Codebase Permissions and Application name体现属性 尽管有资源可以帮助您完成此任务 但我找不到任何资源综合的

随机推荐

  • 如何解决 MATLAB 中的名称冲突?

    我在 MATLAB 中创建了一个名为 stack 的 GUI 它有一个 m与其关联的文件 该 GUI 多次被同一文件夹中的另一个 GUI 调用 现在我发现 stack https mathworks com help matlab ref
  • 创建“新对象”和“类对象名”之间的区别

    举例来说 我有一个名为 电话 的课程 有什么区别 Phone p and Phone p new Phone 200 200 is the price of the phone and new Phone 200 我用谷歌搜索过 甚至在 E
  • Spring-ws 或 Axis2 或其他用于 WS 的“契约优先”方法

    大家都说 契约优先 的WS设计方法更倾向于SOA风格的设计 现在 如果我们采用可用的开源框架来实现我们的目标Spring ws并且Axis2 支持两种风格 我的任务是设计基于 SOA 的电子商务应用程序 其中松耦合 快速响应 安全性和可扩展
  • 对象类型的 Flowtype 数组不允许额外的属性

    我在流程方面遇到了一个奇怪的错误 我只是想有一个函数来接受带有一个对象的数组amount属性 但在提供具有更多属性的对象时出现错误 const sum items Array lt amount number gt gt something
  • Win32Exception 没有足够的存储空间来处理此命令

    通过我的自动崩溃收集MaxTo http www maxto net我收到以下崩溃报告 V8 12 0 0 System ComponentModel Win32Exception Void UpdateLayered 0 Version
  • 使用 less 将 css 文件导入为块级导入

    有没有办法通过使用将 css 文件的规则嵌套在选择器下 import就像导入 less 文件时一样吗 如果你有一个文件 x less x color 000 和文件 main less scope import x less 编译 main
  • NTFS $MFT 文件可以有子记录吗?

    我正在编写一些代码来解析 NTFS 卷中磁盘上的 MFT 这很简单 但一个特殊的极端情况引起了我的注意 我在互联网上的任何地方都找不到明确的答案 对于 NTFS 中的普通文件 如果文件具有的属性多于单个记录所能容纳的属性 则单个文件可能有多
  • 自动展开并输出C/C++代码

    我正在做一个实验 第一步是展开循环 从 C C 十几次 例如 10 50 等 并输出 C C 展开代码 我可以使用任何工具来自动展开此类展开吗 换句话说 我需要的是 C C source loop gt gt TOOL Unroll by
  • 如何通过键选择单个实体(低级java数据存储API)

    我对如何创建 Key 对象来精确选择实体 客户 的 1 行感到有点困惑 我的代码 Query query new Query Customer how do I have to create this key Key key KeyFact
  • AngularJS html5模式和硬404

    我有一个 AngularJS 应用程序正在使用html5mode set to true 目前 该应用程序显示一个软 404 页面 其中 otherwise路由器里设置 有没有一种方法可以在使用 html5 模式时提供实际的 404 HTT
  • `DateTime.Now - DateTimeNow.AddSecond(-1)` 如何为零

    我在控制台应用程序中运行以下代码 while true DateTime dt1 DateTime Now DateTime dt2 DateTime Now AddSeconds 1 if dt1 dt2 Seconds 1 Consol
  • 如何防止在输入字段中输入无效字符

    Onkeydown 我运行以下 JavaScript function ThisOnKeyDown el if el title textonly A Za z s i test el value el value el value rep
  • Python加权随机[重复]

    这个问题在这里已经有答案了 我需要根据加权循环返回不同的值 这样 20 人中有 1 人得到 A 20 人中有 1 人得到 B 其余的人得到 C So A gt 5 B gt 5 C gt 90 这是一个似乎有效的基本版本 import ra
  • 使用EventSource获取用户在线状态可靠吗?

    我使用了 EventSource 方法来获取网站上活跃用户的在线状态 下面的 JavaScript 代码被插入到每个页面中 var source new EventSource set online php 因此这段代码正在执行set on
  • 在 Python 中创建新字典

    我想用 Python 构建一本字典 但是 我看到的所有示例都是从列表实例化字典等 如何在 Python 中创建一个新的空字典 Call dict没有参数 new dict dict 或者简单地写 new dict
  • 裸仓库上的 git diff

    我想看看 gitlab 服务器端上个月 repo 发生了多少变化 cd path to my bare repo git git git dir diff shortstat 1 month ago fatal Unable to read
  • 用于教学的 Python 3 IDE [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 随着 Python 3 的日趋成熟并慢慢获得采用 我们正在尝试在面向 12 18 岁儿童的入门编程课程
  • Bash 循环遍历目录,包括隐藏文件

    我正在寻找一种方法 在 bash 中对我的目录包含的所有内容 即文件 目录和链接 包括隐藏的链接 进行简单循环 如果它可以专门在 bash 中 我会更喜欢 但它必须是最通用的 当然 文件名 和目录名 可以有空格 换行符 符号 除了 和 AS
  • IModelBinder 上的 BindProperty 和 SetProperty 有什么区别

    我正在 Mvc 应用程序中创建自定义模型绑定程序 我想将字符串解析为枚举值并将其分配给模型属性 我已经让它工作了BindProperty方法 但我也注意到有一个SetProperty方法 protected override void Bi
  • PDFBox 按钮执行 javascript 关闭文档

    我的用例是在 pdf 页面上有一个像这样的按钮 实际上是将它们添加到现有页面 但现在我只想看到它对任何东西都有效 Back 它所做的只是关闭当前的 pdf 页面 这个想法是打开多个选项卡 每个选项卡都是一个 pdf 然后当您点击 后退 按钮