1

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

我没有修改pdf的经验,我正试图用itext7它来做这件事。

我一直在阅读如何将文本添加到 pdf 中,甚至在这里我也看到了如何使用“密钥”来填写 Acrosfield

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

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

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 ) );
}

经过一番尝试,我一直在寻找更多信息,但如果可能的话,我找不到获得这些“钥匙”的方法......

- - - - 编辑 - - - -

我制作了这段代码是为了制作我的 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 执行此操作,并且成功了!

4

1 回答 1

3

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

当您参考如何以编程方式填写 pdf 文件时?(AcroForm技术),你参考iText 7版本的How to fill an pdf file in programmatically?(AcroForm 技术)这是同一问题的答案,但适用于使用 iText 5 的开发人员。如您所见,iText 5 和 iText 7 之间存在很大差异。

但是,当您参考如何使用 iText 从 PDF 文件中获取所有字段和值时?您会得到一个仅用于 iText 5 的答案。如果您使用的是 iText 7,则该代码将不起作用,因为它是 iText 5 代码。

您需要的代码可以在这里找到:如何从 AcroFields 中获取特定类型?像 PushButtonField、RadioCheckField 等

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 会告诉您缺少括号的位置。如果您没有立即找到该位置,请通过添加缩进和空格来清理您的代码。这应该清楚你忘记了一个).

于 2016-09-24T16:13:53.237 回答