2015-02-24 114 views
0
  • 我有多个使用多个记录填充的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(); 
    } 
+0

工作你说你的PDF文件进行填充*使用acroforms和PDFBOX *时,必须使用整个页面。 PDFBox为这些字段创建了外观流?如果没有,你可能想阅读Bruno的[这个答案](http://stackoverflow.com/a/20527155/1729265)。 – mkl 2015-02-24 13:54:59

+0

该文档说:设置选项以生成外观。不生成外观会加速表单填充,但在Acrobat中结果可能是意想不到的。除非你的环境得到很好的控制,否则不要使用它。默认值是true。 – 2015-02-24 14:04:02

回答

3

使用PdfStamper.setFormFlattening(true)摆脱字段并将它们写入内容。

+0

它不保存字段的内容。必须有一些我错过的步骤。你愿意详细说明吗? :) P.S.我是否应该使用pdfStamper.getOverContent(pageNum)获取内容,然后执行一些操作? – 2015-02-24 11:43:58

+0

你可以发表pdf吗? – 2015-02-24 13:35:26

+0

https://drive.google.com/file/d/0B3S4vhAbS0W2dUs0MWJOQ0gyb1E/view?usp=sharing – 2015-02-24 13:53:00

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(); 
} 
+0

所以这基本上是PDFBox使用的问题,而不是iText,不是吗?顺便说一句,这里显示的代码现在将两个不同的文档保存到相同的输出流。我假设你在该代码中的评论意味着不使用第一次保存,而是使用第二次保存。但是有这么多人在复制和粘贴代码时没有阅读评论... – mkl 2015-02-24 15:28:54

+0

Essentialy是的。我认为PDPage有任何需要的信息。我留下了错误的说明,使它们更加可读,我会在旁边添加一点评论。 – 2015-02-24 16:01:23