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

Java 如何使用iText获取Pdf表单字段的自定义格式脚本?,java,pdf,itext,xpages-ssjs,pdf-form,Java,Pdf,Itext,Xpages Ssjs,Pdf Form,我有一个pdf表单,我正在使用iText和Java通过代码将一些数据写入pdf字段。我想获得字段的自定义格式脚本,以便了解pdf字段的有效输入。谢谢更新: 哎呀,, 我误解了你的问题。我假设您希望将JavaScript添加到现有PDF中,以便用户可以添加有效数据 您正在寻找的是一种从现有PDF中提取JavaScript的方法。在我之前的回答中提到的答案中,你已经对如何做到这一点有了印象。对于添加到特定字段的JavaScript,您需要检查其他操作: AcroFields form = stamp

我有一个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文档目录中的名称树中获取适当的条目。很难用语言来解释,但是如果您下载并检查PDF,您应该能够找到不同的JavaScript片段。如果我们查看使用我的错误答案创建的文件(见下文),我们会得到以下结果:

这表明您需要以下内容:

PdfDictionary catalog = reader.getCatalog();
PdfDictionary names = catalog.getAsDict(PdfName.NAMES);
PdfDictionary javascript = names.getAsDict(PdfName.JAVASCRIPT);
PdfWriter writer = stamper.getWriter();
writer.addJavaScript(Utilities.readFileToString(RESOURCE));
一旦有了这个
javascript
字典,就可以提取所有javascript片段

回答不正确:

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

如果是这样,您只需要知道如何将JavaScript添加到现有的PDF文件中。例如,我有一个名为的PDF文件,我想在其中添加一些javascript。在中,您将找到一个将字段设置为只读的方法以及一个验证字段的方法:如果
married
的值为
yes
,而
partner
没有值,则会显示警报,否则会提交表单。您必须根据表单的性质和要检查的字段编写类似的JavaScript

该示例演示如何将这些JavaScript方法添加到现有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代码段:

PdfDictionary catalog = reader.getCatalog();
PdfDictionary names = catalog.getAsDict(PdfName.NAMES);
PdfDictionary javascript = names.getAsDict(PdfName.JAVASCRIPT);
PdfWriter writer = stamper.getWriter();
writer.addJavaScript(Utilities.readFileToString(RESOURCE));
[2.]您需要向特定字段添加一些JavaScript来调用您添加的自定义方法。 在这个示例中,您可以看到一个案例,其中我们添加JavaScript作为附加操作。您还可以看到我们如何添加具有特定操作的新按钮。这取决于你决定在你的具体情况下需要什么

额外更新:我没有否决这个问题:


如果我对这个问题投了反对票,向下的箭头应该是橙色;-)

我不明白你为什么要使用[xpages ssjs]标记。PDF中的JavaScript与PDF ECMAScript完全无关。这个标签可以被删除吗?@BrunoLowagie我使用了这个标签,因为最后我将在xpages中实现它,所以我想如果有人有xpage背景,那么它可能会有所帮助。Thanks@BrunoLowagie我不明白你为什么把这个问题评为-ve,你能解释一下吗?这将有助于我今后不再犯同样的错误。谢谢我没有否决这个问题,是别人否决了。我不知道为什么。非常感谢,这很有帮助。抱歉,这是我的错误。我相信你,不需要截图:)