在java中使用itext填写pdf表单有问题

在java中使用itext填写pdf表单有问题,java,pdf,itext,pdf-form,Java,Pdf,Itext,Pdf Form,我正在使用iText填写pdf表单,控制台中没有错误,但当我打开输出pdf时,它给出了“预期的dict对象”,之后它给出了另一条消息,说“此文档在Adobe reader中启用了扩展功能。文档自创建以来已更改,扩展功能的使用不再可用。” 此外,输出的pdf文件有我所做的更改,但它没有原始pdf文件的功能,如上面的消息所示 我用了下面的代码 PdfReader reader = new PdfReader("C:\\Users\\asfs\\Downloads\\1013-Form22.pdf")

我正在使用iText填写pdf表单,控制台中没有错误,但当我打开输出pdf时,它给出了“预期的dict对象”,之后它给出了另一条消息,说“此文档在Adobe reader中启用了扩展功能。文档自创建以来已更改,扩展功能的使用不再可用。”

此外,输出的pdf文件有我所做的更改,但它没有原始pdf文件的功能,如上面的消息所示

我用了下面的代码

PdfReader reader = new PdfReader("C:\\Users\\asfs\\Downloads\\1013-Form22.pdf");
String name = "C:\\Users\\asfs\\Downloads\\Temp.pdf";

PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(name));
AcroFields form = stamp.getAcroFields();

String last = "Form22_Dtls[0].Page1[0].Country_C[0]";

form.setField(last, "Sample Country name");

HashMap map = new HashMap();
map = form.getFields();
Iterator iterator = map.keySet().iterator();
while(iterator.hasNext())
    System.out.println("Field is >>>"+iterator.next());
// close pdf stamper
stamp.setFormFlattening(true);
stamp.close();
请帮帮我

谢谢

试试:

// open the pdf stamper in edit mode
stamp = new PdfStamper(reader, new FileOutputStream(name), '\0', true);

PdfStamper需要处于append模式。

如果您想要Java代码,下面是我从博客中获得的一个片段。但它使用pdf硝基,以防这有帮助或让我知道

private ByteArrayOutputStream editPdfDocument() throws Exception {
PdfReader reader = null;
PdfStamper stamper = null;
ByteArrayOutputStream baosPDF = new ByteArrayOutputStream();
HashMap fieldsWithValues = new HashMap();
int user_id = 1234; // unique key for the object
String dirPath = “D:/abc”;// directory path
String fileName = “def.pdf”;// name of the file
try {
reader = new PdfReader(dirPath + “/” + fileName);
stamper = new PdfStamper(reader, baosPDF);
AcroFields form = stamper.getAcroFields();
HashMap fields = form.getFields();
Set keys = fields.keySet();   // keys represents the names of all the form fields
fieldsWithValues = fetchFieldValuesForObject(user_id, keys);
// fetchFieldValuesForObject(user_id, keys) method will fetch the values of the fields from Database for object identified by user_id
Iterator itr = keys.iterator();
while (itr.hasNext()) {
String fieldName = (String) itr.next();
String fieldValue = fieldsWithValues.get(fieldName) != null ? (String)(fieldsWithValues.get(fieldName)) : “”;
form.setField(fieldName, fieldValue);
}
stamper.setFormFlattening(true);
} catch (Exception dex) {
if (stamper != null)
stamper.close();
if (reader != null)
reader.close();
throw dex;
}
return baosPDF;
}`enter code here`
这是使用Java直接从数据库中检索数据的Pdf表单填充,希望它能工作

据我所知,stamp.setformflatting(true);您正在调用,删除字段并将其替换为内容,这就是新文档不保留字段的原因

谢谢Jasper。现在“Expected a dict object”消息没有出现,但主要问题仍然存在,这是旧pdf文档的扩展功能。新文档类似于普通pdf文档,它不包含任何表单字段和按钮。原始pdf表单/文件是如何创建的?我更新了答案,您可能还需要在编辑模式下打开pdfstamper。更多信息在此链接:pdf文件的创建我不知道。如果它使用的是Adobe LifeCycle或Reader。在这两种情况下,填写表格是否有任何变化?我可以推荐这本书,第8.7.1节确实解释了这里发生的事情。你试过追加模式吗?这实际上解决了我的问题。我在填写字段,但在我明确打开表单字段之前,它们不会显示在修改后的文本中。不知道为什么我没有在任何地方看到这个。。。非常感谢:P