- 我有多个使用多个记录填充的PDF(a.pdf,b.pdf,c [0-9] .pdf, d [0-9] .pdf,ez.pdf)使用acroforms和pdfbox。
- 生成的文件(aflat.pdf,bflat.pdf,c [0-9] flat.pdf,d [0-9] flat.pdf,ezflat.pdf)应该有它们的形式(字典和任何adobe使用的)删除,但填充为原始文本保存在pdf(setReadOnly不是我想要的!)。
PdfStamper只能删除字段而不保存它们的内容,但我发现一些对PdfContentByte的引用作为保存内容的一种方式。唉,文件太简单了解我应该如何做到这一点。使用iText将PDF格式转换为PDF格式(保留数据)
作为最后的手段,我可以使用FieldPosition直接在PDF上书写。有没有人遇到过这样的问题?我如何解决它?
UPDATE:保存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();
}
工作你说你的PDF文件进行填充*使用acroforms和PDFBOX *时,必须使用整个页面。 PDFBox为这些字段创建了外观流?如果没有,你可能想阅读Bruno的[这个答案](http://stackoverflow.com/a/20527155/1729265)。 – mkl 2015-02-24 13:54:59
该文档说:设置选项以生成外观。不生成外观会加速表单填充,但在Acrobat中结果可能是意想不到的。除非你的环境得到很好的控制,否则不要使用它。默认值是true。 – 2015-02-24 14:04:02