【发布时间】:2017-09-27 22:38:21
【问题描述】:
我正在尝试根据一些数据计算(使用Java)自动修改pdf模板
我没有修改 pdf 的经验,我正在尝试使用 itext7 来执行此操作。
我一直在阅读如何将文本添加到 pdf 甚至 here 我看到了如何使用“键”来填写 Acrosfield 字段
不过,我没有制作我正在使用的 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 ) );
}
经过一番尝试,我一直在寻找更多信息,但如果可能的话,我找不到获得这些“钥匙”的方法......
------- 编辑 -------
我编写此代码是为了复制我的 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 执行此操作,并且成功了!
【问题讨论】:
-
如果
fields的类型为AcroFields并且 fldNames 是字符串集合,则该循环看起来没问题。您可能需要在该循环之前发布您的代码 -
:/ 我找到了为什么会出现这个错误...我已经将代码编写为主体类的一部分,而不是作为方法,因此编译器无法理解 for 循环。我以前在 C++ 上编码,但我不知道!!!