如何使用 iText 获取 Pdf 表单字段的自定义格式脚本?
Posted
技术标签:
【中文标题】如何使用 iText 获取 Pdf 表单字段的自定义格式脚本?【英文标题】:How do I get Custom Format Script of Pdf form fields using iText? 【发布时间】:2014-04-02 12:42:01 【问题描述】:我有一个 pdf 表单,我正在使用 iText 和 Java 通过代码将一些数据写入 pdf 字段。我想获取字段的自定义格式脚本,以便了解 pdf 字段的有效输入。谢谢
【问题讨论】:
我不明白你为什么使用 [xpages-ssjs] 标签。 PDF 中的 javascript 与 PDF ECMAScript 完全无关。可以去掉那个标签吗? @BrunoLowagie 我使用了那个标签,因为最后我将在 xpages 中实现它,所以想如果有 xpage 背景的人已经这样做了,那么它可能会有所帮助。谢谢 @BrunoLowagie 我不明白你为什么把这个问题评为-ve,你能解释一下吗?这将有助于我以后不再犯同样的错误。谢谢 我没有否决这个问题,是其他人投了反对票。我不知道为什么。 【参考方案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
不为空,您需要检查该字典中的不同值。例如:/Bl
条目(如果存在)将为您提供在模糊时触发的动作,/Fo
条目(如果存在)将为您提供被触发的动作在焦点上,等等。
如果您想获取文档级 JavaScript,您需要从 PDF 文档目录中的名称树中获取相应的条目。很难用语言解释,但如果你下载RUPS 并检查 PDF,你应该能够找到不同的 JavaScript sn-ps。如果我们查看使用我的错误答案创建的文件(见下文),我们会得到:
这表明你需要这样的东西:
PdfDictionary catalog = reader.getCatalog();
PdfDictionary names = catalog.getAsDict(PdfName.NAMES);
PdfDictionary javascript = names.getAsDict(PdfName.JAVASCRIPT);
一旦你有了这个javascript
字典,你就可以提取所有的Javascript sn-ps。
错误答案:
我假设您知道如何编写 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。
这是通过PdfReader
和PdfStamper
完成的:
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
// do stuff
stamper.close();
reader.close();
上面写着// do stuff
,你需要做两件事:
[1.] 你需要像这样添加 JavaScript sn-p:
PdfWriter writer = stamper.getWriter();
writer.addJavaScript(Utilities.readFileToString(RESOURCE));
[2.] 您需要向特定字段添加一些 JavaScript 以调用您添加的自定义方法。 在示例中,您会看到我们添加 JavaScript 作为附加操作的情况。您还将看到我们如何添加具有特定操作的新按钮。由您决定在您的具体情况下需要什么。
额外更新:我没有否决这个问题:
如果我对这个问题投了反对票,向下箭头会是橙色的 ;-)
【讨论】:
非常感谢,非常有帮助。 抱歉,这是我的错误。我相信你,不需要截图:)以上是关于如何使用 iText 获取 Pdf 表单字段的自定义格式脚本?的主要内容,如果未能解决你的问题,请参考以下文章
使用Java和IText,如何从PDF中提取AcroForm字段名称?