如何在运行时间检测哪个签名字段链接到相应的btn?

How to detect which signature field is linked to the corresponding btn at run time?

我有一个文档 document.pdf,其中有一些签名字段及其相应的 btn 在文档上可见。使用 iText7,在遍历字段时我可以看到符号 btns 和签名字段。我如何在 运行 时间检测到哪个签名字段链接到相应的符号 btn?

How I can detect that which signature field is linked to corresponding sign btn at run time?

按钮和签名字段之间没有link按钮字典中简单和指定条目的意义。

只有 Java单击按钮时执行的脚本代码,例如btn_sign:

//Make sure the form is valid and then allow the signature.
if (ValidateForm() == true)
{
    if (this.dirty == true)
    {
        app.alert("Please save the form before signing, to ensure the proper saved name!");
    }
    else
    {
        app.alert("Please click anywhere in signature field to sign the form!\nThis will automatically save the form!", 3);
    
        //Enable the field
        this.getField("signature1").readonly = false;
        this.getField("signature1").display = display.visible;

        //Set focus
        this.getField("signature1").setFocus();

        //Disable the save button
        this.getField("btn_sign").readonly = true;
    }
}

在这里您可以看到,经过一些完整性检查后,字段 signature1 被激活(不再是 read-only)、可见并且 in-focus。同时,按钮本身处于非活动状态 (read-only)。

类似地,当单击 btn_sign2 时执行的 Java 脚本代码使 signature2 活动、可见,并且 in-focus 和 btn_sign2 本身不活动。

要确定文档中按钮字段和签名字段之间的这种交互,您必须分析关联的 Java 脚本代码。

您可以使用 iText 7/Java 从按钮字段中检索 Java 脚本代码,如下所示:

try (
    InputStream resource = getClass().getResourceAsStream("form_field_document.pdf");
    PdfReader pdfReader = new PdfReader(resource);
    PdfDocument pdfDocument = new PdfDocument(pdfReader);
) {
    PdfAcroForm pdfAcroForm = PdfAcroForm.getAcroForm(pdfDocument, false);
    PdfFormField btnSignField = pdfAcroForm.getField("btn_sign");
    PdfDictionary actionDictionary = btnSignField.getWidgets().get(0).getAction();
    if (PdfName.JavaScript.equals(actionDictionary.getAsName(PdfName.S))) {
        PdfObject jsObject = actionDictionary.get(PdfName.JS, true);
        if (jsObject instanceof PdfString) {
            System.out.print(((PdfString)jsObject).getValue());
        } else if (jsObject instanceof PdfStream) {
            PdfStream jsStream = (PdfStream)jsObject;
            System.out.print(new String(jsStream.getBytes()));
        }
    }
}

(ReadButtonAction 测试 testReadSignButtonAction)