【发布时间】:2014-02-17 20:45:53
【问题描述】:
我开始在我的 android 应用程序中使用新功能,这将有助于填写某些 PDF 表单。
我发现最好的解决方案是使用 iText 库。
我可以读取文件,并从文档中读取 AcroFields,但有没有可能发现特定字段被标记为必填项?
我试图在 API 文档和 Internet 上找到这个选项,但没有任何东西可以帮助解决这个问题。
【问题讨论】:
我开始在我的 android 应用程序中使用新功能,这将有助于填写某些 PDF 表单。
我发现最好的解决方案是使用 iText 库。
我可以读取文件,并从文档中读取 AcroFields,但有没有可能发现特定字段被标记为必填项?
我试图在 API 文档和 Internet 上找到这个选项,但没有任何东西可以帮助解决这个问题。
【问题讨论】:
请查看my book 的第 13.3.4 节,标题为“AcroForms revisited”。清单 13.15 显示了来自 InspectForm 示例的代码 sn-p,它检查字段是密码还是多行字段。
通过一些小的更改,您可以调整该示例以检查必填字段:
for (Map.Entry<String,AcroFields.Item> entry : fields.entrySet()) {
out.write(entry.getKey());
item = entry.getValue();
dict = item.getMerged(0);
flags = dict.getAsNumber(PdfName.FF);
if (flags != null && (flags.intValue() & BaseField.REQUIRED) > 0)
out.write(" -> required\n");
}
【讨论】:
检查必填字段而不循环 itext5。
String src = "yourpath/pdf1.pdf";
String dest = "yourpath/pdf2.pdf";
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(this.reader, new FileOutputStream(dest));
AcroFields form = this.stamper.getAcroFields();
Map<String,AcroFields.Item> fields = form.getFields();
AcroFields.Item item;
PdfDictionary dict;
PdfNumber flags;
item=fields.get("fieldName");
dict = item.getMerged(0);
flags = dict.getAsNumber(PdfName.FF);
if (flags != null && (flags.intValue() & BaseField.REQUIRED) > 0)
{
System.out.println("flag has set");
}
【讨论】: