我试图根据一些数据计算(使用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来做它并且它工作了!
答案 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完全无关(我怀疑这是:你只是有一个非常简单编程错误)。简而言之:尝试使用一个好的IDE,IDE会告诉您指示缺少括号的位置。如果您没有立即找到该位置,可以通过添加缩进和空格来清理代码。这应该清楚地表明您忘记了)
。