我有一个 pdf 表单,我正在使用 iText 和 Java 通过代码将一些数据写入 pdf 字段。我想获取字段的自定义格式脚本,以便了解 pdf 字段的有效输入。谢谢
1 回答
更新:
糟糕,我误解了你的问题。我假设您想将 JavaScript 添加到现有 PDF 中,以便用户可以添加有效数据。
您正在寻找的是一种从现有 PDF 中提取 JavaScript 的方法。在我之前的回答中提到的答案中,您已经对如何做到这一点有了印象。对于添加到特定字段的 JavaScript,您需要检查 Additional Actions:
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
不为空,则需要检查该字典中的不同值。例如:条目(如果存在)将为您提供在 blur/Bl
上触发的动作,条目(如果存在)将为您提供在 focus 上触发的动作,依此类推。/Fo
如果要获取文档级 JavaScript,则需要从 PDF 文档目录中的名称树中获取相应的条目。很难用语言来解释,但是如果您下载RUPS并检查 PDF,您应该能够找到不同的 JavaScript 片段。如果我们查看使用我的错误答案创建的文件(见下文),我们会得到:
这表明你需要这样的东西:
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
isyes
而 没有值为partner
,则显示警报,否则表单为提交。根据表单的性质和要检查的字段,您必须编写类似的 JavaScript。
AddJavaScriptToForm示例向您展示了如何将这些 JavaScript 方法添加到现有 PDF 中,从而生成文件form_with_js.pdf。
这是通过PdfReader
and完成的PdfStamper
:
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 作为附加操作的情况。您还将看到我们如何添加具有特定操作的新按钮。由您决定在您的特定情况下需要什么。
额外更新:我没有否决这个问题:
如果我对这个问题投了反对票,那么向下的箭头会是橙色的;-)