PdfStamper只能在不保存内容的情况下删除字段,但我发现了一些对PdfContentByte的引用,以此作为保存内容的方法。唉,文档太简短,无法理解我应该怎么做。
作为最后的手段,我可以使用FieldPosition直接在PDF上书写。有没有人遇到过这样的问题?我该如何解决?
更新:保存单页b.pdf会产生有效的bfilled.pdf,但空白的bflattened.pdf 。保存整个文档解决了这个问题。
populateB();
try (PDDocument doc = new PDDocument(); FileOutputStream stream = new FileOutputStream("bfilled.pdf")) {
//importing the page will corrupt the fields
/*wrong approach*/doc.importPage((PDPage)pdfDocuments.get(0).getDocumentCatalog().getAllPages().get(0));
/*wrong approach*/doc.save(stream);
//save the whole document instead
pdfDocuments.get(0).save(stream);//<---right approach
}
try (FileOutputStream stream = new FileOutputStream("bflattened.pdf")) {
PdfStamper stamper = new PdfStamper(new PdfReader("bfilled.pdf"), stream);
stamper.setFormFlattening(true);
stamper.close();
}
答案 0 :(得分:3)
使用PdfStamper.setFormFlattening(true)
删除字段并将其作为内容写入。
答案 1 :(得分:1)
使用acroforms时始终使用整个页面
populateB();
try (PDDocument doc = new PDDocument(); FileOutputStream stream = new FileOutputStream("bfilled.pdf")) {
//importing the page will corrupt the fields
doc.importPage((PDPage) pdfDocuments.get(0).getDocumentCatalog().getAllPages().get(0));
doc.save(stream);
//save the whole document instead
pdfDocuments.get(0).save(stream);
}
try (FileOutputStream stream = new FileOutputStream("bflattened.pdf")) {
PdfStamper stamper = new PdfStamper(new PdfReader("bfilled.pdf"), stream);
stamper.setFormFlattening(true);
stamper.close();
}