如何使用itext提交PDF表单

如何使用itext提交PDF表单,itext,pdf-generation,Itext,Pdf Generation,在阅读了许多stackoverflow并尝试了许多解决方案后,我发现: 我收到一份PDF,我无法更改,需要自动处理。 PDF是一个PDF表单,包含两个字段和提交按钮。 以下代码是我需要做的事情: public static final String SRC = "C:\\Dev\\test.pdf"; public static final String DEST = "C:\\Dev\\test_result.pdf"; public static final String DATA = "C

在阅读了许多stackoverflow并尝试了许多解决方案后,我发现:

我收到一份PDF,我无法更改,需要自动处理。 PDF是一个PDF表单,包含两个字段和提交按钮。 以下代码是我需要做的事情:

public static final String SRC = "C:\\Dev\\test.pdf";
public static final String DEST = "C:\\Dev\\test_result.pdf";
public static final String DATA = "C:\\Dev\\data.xml";

File file = new File(DEST);
PdfReader reader = new PdfReader(SRC);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(DEST));
AcroFields form = stamper.getAcroFields();
XfaForm xfa = form.getXfa();
xfa.fillXfaForm(new FileInputStream(DATA));
这将提供一个空指针:

Exception in thread "main" java.lang.NullPointerException
at com.itextpdf.text.pdf.XfaForm.fillXfaForm(XfaForm.java:1168)
at com.itextpdf.text.pdf.XfaForm.fillXfaForm(XfaForm.java:1146)
at com.itextpdf.text.pdf.XfaForm.fillXfaForm(XfaForm.java:1134)
at com.itextpdf.text.pdf.XfaForm.fillXfaForm(XfaForm.java:1131)
我可以使用以下代码获取并设置表单上的字段:

AcroFields fields = reader.getAcroFields();
fields.setField("pdfForm.loginUser", "myemail@domain.com");
fields.setField("pdfForm.loginPass", "mypassword");

如何将Acrofields转换为XfaForm?

您会问:“如何将Acrofields转换为XfaForm?”答案是:“您不需要!”AcroForm技术和XFA彼此太不一样了。它们有时以混合形式彼此并排使用,但将一个转换为另一个是没有用的。查看字段名
pdfForm.logiuser
,我假设您有一个纯AcroForm表单。如果它是一个混合表单,那么字段名将类似于
pdfForm[0].logiuser[0]
,而事实并非如此。获得NPE是因为
xfa
null
。PDF中没有XFA。为什么需要XFA?XFA在PDF 2.0中被弃用!另外:你文章主题中的问题与你文章正文中的问题完全不同。在主题中,您询问提交数据的问题;在正文中,您已经有了数据,并且您正在询问如何填写数据。提交表单和填写表单之间存在巨大差异,请澄清。我需要XFA表单才能提交表单。我上网提交PDF表单的唯一方法(即通过编程方式单击按钮)是使用XFA表单。这是一个非常奇怪的说法。你是说提交一个基于AcroForm技术的表单是不可能的——这是荒谬的——或者是不可取的——这很奇怪,因为如果它是你想要的XML,为什么不将AcroForm字段作为XFDF提交呢?那么,请回答第二个问题。标题是相关的。我试图通过编程完成表单,而不是将其保存为PDF格式,而是启动表单上的按钮。此按钮HTTP将表单字段值发布到URL。