在pdf文档itext7中获取所有acrosfields avalibles

get all acrosfields avalibles in a pdf document itext7

我正在尝试根据一些数据计算(使用Java)自动修改pdf模板

我没有修改 pdf 的经验,我正在尝试使用 itext7 来执行此操作。

我一直在阅读如何向 pdf 添加文本,甚至 here 我看到了如何使用 "key"

然而,我没有制作我正在使用的 pdf 模板(可以修改)所以我不知道你可以手动填写的字段是用 Acrosfields 还是其他技术制作的,我不知道键或每个字段是什么 如果他们有一个...

我看到了this问题;它在哪里说如何获取所有字段及其值但是当我尝试出现在我得到的唯一答案中的代码时;

main.java:[40,0] error: illegal start of type
main.java:[40,19] error: ')' expected
main.java:[40,30] error: <identifier> expected
3 errors 

本部分:

for (String fldName : fldNames) {
    System.out.println( fldName + ": " + fields.getField( fldName ) );
}

经过一番尝试,我一直在寻找更多信息,但我找不到获取这些信息的方法 "keys" 如果可能...

--------编辑------

我制作这段代码是为了复制我的 pdf 模板,它在每个字段中都有 Acrosfield 的密钥名称:

package novgenrs;


import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Set;
public class MakePDF {

public static void MakePDF(String[] args) throws IOException, DocumentException{


PdfReader reader = new PdfReader("template.pdf");

PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("result.pdf"));

//AcroFields form = stamper.getAcroFields();

AcroFields fields = reader.getAcroFields();

AcroFields wrt = stamper.getAcroFields(); 

Set<String> fldNames = fields.getFields().keySet();

for (String fldName : fldNames) {
  wrt.setField(fldName, fldName) ; 
}

stamper.close();
reader.close(); 

}


}

注意:这仅适用于 itext5。出于某种原因,当我尝试使用 itext7 执行此操作时,我无法使其正常工作,因此我尝试使用 itext5 执行此操作并且成功了!

如果您想要问题的完整答案,您必须提供 PDF 以便我们进行检查,但这些已经是一些可以帮助您朝着正确方向前进的答案。

当您参考 How to fill out a pdf file programmatically? (AcroForm technology), you refer to the iText 7 version of How to fill out a pdf file programmatically? (AcroForm technology) 时,这是同一问题的答案,但对于使用 iText 5 的开发人员而言。如您所见,iText 5 和 iText 7 之间存在很大差异。

但是,当您参考 How do I get all the fields and value from a PDF file using iText? 时,您会得到一个仅适用于 iText 5 的答案。如果您使用的是 iText 7,该代码将不起作用,因为它是 iText 5 代码。

您需要的代码可以在这里找到:How to get specific types from AcroFields? Like PushButtonField, RadioCheckField, etc

PdfReader reader = new PdfReader(src);
PdfDocument pdfDoc = new PdfDocument(reader);
// Get the fields from the reader (read-only!!!)
PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);
// Loop over the fields and get info about them
Set<String> fields = form.getFormFields().keySet();
for (String key : fields) {
    writer.print(key + ": ");
    PdfName type = form.getField(key).getFormType();
    if (0 == PdfName.Btn.compareTo(type)) {
        if(((PdfButtonFormField)form.getField(key)).isPushButton()){
            writer.println("Pushbutton");
        } else {
            if(((PdfButtonFormField)form.getField(key)).isRadio()){
                writer.println("Radiobutton");                   
            }else {
                writer.println("Checkbox");
            }
        }
    } else if (0 == PdfName.Ch.compareTo(type)) {
        writer.println("Choicebox");
    } else if (0 == PdfName.Sig.compareTo(type)) {
        writer.println("Signature");
    } else if (0 == PdfName.Tx.compareTo(type)) {
        writer.println("Text");
    }else {
        writer.println("?");
    }
}

这段代码会遍历所有字段,并将key写入System.out,以及与该键对应的字段类型。您还可以使用 RUPS 检查您的 PDF。

你提到:

main.java:[40,0] error: illegal start of type
main.java:[40,19] error: ')' expected
main.java:[40,30] error: <identifier> expected

我不清楚这是编译器错误还是 运行 时错误。

  • 如果是编译器错误,你只是在某处遗漏了一个 ),在这种情况下,你的问题与 iText 完全无关(我怀疑的是:你只是有一个 非常简单 编程错误)。
  • 如果是 运行 次错误,则说明您的 PDF 有问题。在 PDF 中,字符串由括号分隔。也许您的 PDF 中某处缺少一个括号(但我怀疑:您会遇到不同类型的错误)。

简而言之:尝试一个好的 IDE,IDE 会告诉您括号缺失的位置。如果您没有立即找到该位置,通过添加缩进和空格来清理您的代码。那应该清楚你在哪里忘记了 ).