通过使用iText展平pdf,文本的不同位置

时间:2014-02-24 09:15:07

标签: java forms pdf itext

我在使用iText时遇到问题,并在pdfs中展平了表单字段。

我将在Acrobat中创建的表单字段的pdf提交到我的java方法。在网站上,我创建了一个表单来填写pdf中的表单字段。表单字段已正确填充,但只要我将文档展平,文本就会移动到稍微不同的位置。最大的区别在于多行表单字段。文本位于左上角字段的边界。在Acrobat中,在展平前,文本的顶部有一个填充。

这是我调用iText方法的java代码:

PdfReader template = new PdfReader(templ);
XfdfReader xfdfReader = new XfdfReader(xfdf);
OutputStream outputStream = new FileOutputStream(output);
PdfStamper stamper = new PdfStamper(template, outputStream, '\0');

AcroFields form = stamper.getAcroFields();                                            

Set<String> fields = form.getFields().keySet();

form.setFields(xfdfReader);

stamper.setFreeTextFlattening(true);            
stamper.setFormFlattening(true);    
stamper.close();
template.close();

当我压缩pdf时,任何人都知道为什么文本会移动?我怎么能避免这个?

我已经尝试过iText的不同版本。从版本4.X到5.X.差异出现在所有版本中。

虽然我试图在iText的代码中移动表单字段,但随后整个字段都在移动,并且位置的差异更大且不可预测。

在我的项目中,文本必须与Acrobat中的文本完全相同,因此我必须找到解决这种不当行为的方法。我希望有人可以帮助我。

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

多年来,PDF文件中字段基线的位置已发生变化。您甚至会看到差异,具体取决于您使用的Acrobat版本。

除非您知道确切的偏移,否则没有解决方案。如果这样做,您可以使用setExtraMargin()方法在展平文档时更改所有字段的偏移量。

我们创建了此方法来处理具有与预期不同的基线的特定表单。对于不同的表单,您选择的值可能会有所不同。