如何在运行时间检测哪个签名字段链接到相应的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
)
我有一个文档 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
)