java - 如何使用 iText 获取 Pdf 表单字段的自定义格式脚本?

标签 java pdf itext xpages-ssjs pdf-form

我有一个 pdf 表单,我正在使用 iText 和 Java 通过代码将一些数据写入 pdf 字段。我想获取字段的自定义格式脚本,以便我了解 pdf 字段的有效输入。谢谢

最佳答案

更新:

哎呀, 我误解了你的问题。我假设您想将 JavaScript 添加到现有 PDF 中,以便用户可以添加有效数据。

您正在寻找一种从现有 PDF 中提取 JavaScript 的方法。在我之前的答案中提到的答案中,您已经对如何做到这一点有了印象。对于添加到特定字段的 JavaScript,您需要检查附加操作:

AcroFields form = stamper.getAcroFields();
AcroFields.Item fd = form.getFieldItem("married");
// Get the PDF dictionary of the YES radio button and add an additional action
PdfDictionary dictYes =
    (PdfDictionary) PdfReader.getPdfObject(fd.getWidgetRef(0));
PdfDictionary yesAction = dictYes.getAsDict(PdfName.AA);
if (yesAction == null) yesAction = new PdfDictionary();
yesAction.put(new PdfName("Fo"),
        PdfAction.javaScript("setReadOnly(false);", stamper.getWriter()));
dictYes.put(PdfName.AA, yesAction);
// Get the PDF dictionary of the NO radio button and add an additional action
PdfDictionary dictNo =
    (PdfDictionary) PdfReader.getPdfObject(fd.getWidgetRef(1));
PdfDictionary noAction = dictNo.getAsDict(PdfName.AA);

如果 noAction 不为 null,则您需要检查该字典中的不同值。例如:/Bl 条目(如果存在)将为您提供在模糊时触发的操作,/Fo 条目(如果存在) )将为您提供在焦点上触发的操作,等等。

如果您想获取文档级 JavaScript,您需要从 PDF 文档目录的名称树中获取适当的条目。这很难用语言解释,但如果你下载RUPS并检查 PDF,您应该能够找到不同的 JavaScript 片段。如果我们查看使用我的错误答案创建的文件(见下文),我们会得到:

JavaScript viewed in RUPS

这表明您需要这样的东西:

PdfDictionary catalog = reader.getCatalog();
PdfDictionary names = catalog.getAsDict(PdfName.NAMES);
PdfDictionary javascript = names.getAsDict(PdfName.JAVASCRIPT);

一旦有了这个 javascript 字典,您就可以提取所有 Javascript 片段。

错误答案:

我假设您知道如何编写 JavaScript(或更准确地说是 ECMAScript)。 PDF 中的 JavaScript 与 HTML 中的 JavaScript 非常相似。我假设您不需要帮助来编写一些 JavaScript 方法来检查输入是否有效。

如果是这种情况,您只需知道如何将 JavaScript 添加到现有 PDF 文件即可。例如:我有一个名为form_without_js.pdf的PDF文件我想添加一些javascript,例如extra.js 。在 extra.js ,您会发现一个将字段设置为只读的方法以及一个验证字段的方法:如果 married 的值为 yes 并且没有partner 的值,则会显示警报,否则会提交表单。您必须根据表单的性质以及要检查的字段编写类似的 JavaScript。

AddJavaScriptToForm示例向您展示如何将这些 JavaScript 方法添加到现有 PDF,从而生成文件 form_with_js.pdf .

这是通过 PdfReaderPdfStamper 完成的:

PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
// do stuff
stamper.close();
reader.close();

在上面写着//do stuff的地方,你需要做两件事:

[1.]您需要添加如下 JavaScript 代码段:

PdfWriter writer = stamper.getWriter();
writer.addJavaScript(Utilities.readFileToString(RESOURCE));

[2.] 您需要向特定字段添加一些 JavaScript 来调用您添加的自定义方法。 在示例中,您会看到我们添加 JavaScript 作为附加操作的情况。您还可以看到我们如何添加具有特定操作的新按钮。您可以根据自己的具体情况决定需要什么。

关于java - 如何使用 iText 获取 Pdf 表单字段的自定义格式脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22811851/

相关文章:

java - Android 下拉设置菜单

java - 方法调用后结果错误

html - 使用 itextsharp 将文本放在图像 html 到 pdf 旁边

java - iText Flying Saucer 如何更改最后一页的背景

php - 阿拉伯语检索数据

java - iText 嵌套表 - 第一行未呈现

java - org.springframework.web.HttpRequestMethodNotSupportedException : Request method 'GET' not supported

java - 你能为viewpager2设置OnClickListener吗?

java - 表格的绝对位置用什么度量单位表示?我可以用厘米来表达这个位置吗?

c# - 如何使用 itext7 在固定矩形内缩放文本?