2012-09-04 59 views
2

我有一个PDF模板(使用Adobe Livecycle designer设计),它有一个子窗体和一个文本框。这两个对象的属性设置为float。这些对象的高度设置为Autofit。所有这些对象的父母高度都被设置为AutoFit如何根据文本内容显示浮动文本字段?

我的意图是根据我们输入文本字段的文本内容来增加文本字段的高度。

当我从Adobe设计人员预览模板时,生成的预览PDF将文本字段显示为浮动(基于我输入的测试数据)。

对于我们的应用目的,我们使用iText。

基本上,我们加载这些预定义的模板,并使用iText API将数据填入这些字段。

的iText的当前版本中,我们使用的是iText的5.1.3

... 

Document document = new Document(); 
document.open(); 
PdfReader reader = new PdfReader(<inputTemplate>); 
ByteArrayOutputStream aStream2 = new ByteArrayOutputStream(); 
PdfStamper stamper2 = new PdfStamper(reader, aStream2); 
AcroFields form = stamper2.getAcroFields(); 
form.setField("<fieldname>", "<fieldvalue>"); 

... 

等。

这样生成的PDF只显示符合文本框大小的文本,基本上忽略溢出。

希望我已经给出了我遇到的问题的足够的描述。我想动态地嵌入内容并使PDF的其余部分可浮动。我想知道如何使用iText达到这个目标?

回答

1

你在混合不同的东西。

PDF中有两种类型的表单技术: - AcroForm技术:使用PDF语法描述表单,例如使用键/值对描述字段的PDF字典,以及用于存储坐标的PDF数组一个领域,等等。如果您使用AcroForm技术,则无法满足您的要求。你正在使用错误的技术。通常,这些表单使用Adobe Acrobat,LibreOffice,... - XML Forms Architecture(XFA):使用XML描述表单。 PDF充当XML的容器。通常,这些表单是使用Adobe LiveCycle Designer创建的。

有时,表单使用这两种技术(混合形式),在这种情况下,表单使用PDF语法以及XML语法进行定义。

实现您想要的唯一方法是使用纯粹的动态XFA表单。在这种情况下,你不能使用setField()方法。相反,您必须像在此示例中那样使用fillXfaForm():http://itextpdf.com/examples/iia.php?id=165 或者您必须使用XFA Worker,您可以在其中找到演示:http://demo.itextsupport.com/xfademo/

+0

非常感谢您的回复。我的要求是一个30页的文档,其中大部分是静态文本,其中包含数据元素(如checkfields,$ amount字段等)。因此我们一直使用AcroFields.setField(...)方法。在某些地方,我需要嵌入(内联)动态数据(如NOTES)(如果可用)。传统上,我们将这些笔记作为展品附加到文档的末尾,但是我正在探索是否可以嵌入内嵌,仍然保留静态文本的其余部分。感谢您对我如何实现这一目标的想法?我还需要为页码/ totalPages添加邮票。 – user1646972

+0

为什么不在注释中使用注释? (如果您要将纸币打印在纸上,这可能不是一个选项。) –

+0

对不起,我应该更具体。NOTES的意思是我从数据库中获取的一些文本,并将其呈现为PDF上的特定部分。现在,这些数据可能存在,可能不存在,并且可能有任何长度。所以提交的PDF应该有标题的部分,并应显示文本(如果存在),否则继续下一节。我正在使用一种替代方法,将整个30页文档分成多个模板。这使我可以动态生成包含这些文本字段占位符的整个页面。并将合并此页与其余。 – user1646972