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

时间:2016-09-24 15:55:02

标签: java pdf itext itext7

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

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

我一直在阅读如何将文本添加到pdf甚至是here我看到如果使用"键存在Acrosfield"

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

我看到了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 ) );
}

尝试一下后,我一直在寻找更多信息,但我无法找到一种方法来获取这些&#34;键&#34;如果有可能......

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

我已制作此代码,以便制作我的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来做它并且它工作了!

1 个答案:

答案 0 :(得分:1)

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

当你引用How to fill out a pdf file programmatically? (AcroForm technology)时,你会参考How to fill out a pdf file programmatically? (AcroForm technology)的iText 7版本,这是同一个问题的答案,但是对于使用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会告诉您指示缺少括号的位置。如果您没有立即找到该位置,可以通过添加缩进和空格来清理代码。这应该清楚地表明您忘记了)