Itext 7-梳字段-填写表格
[编辑]我来这里是想问是否有人能帮我 在Itext 7中,我无法理解在获得这些字段后如何设置“字段梳”Itext 7-梳字段-填写表格,itext,itext7,Itext,Itext7,[编辑]我来这里是想问是否有人能帮我 在Itext 7中,我无法理解在获得这些字段后如何设置“字段梳” PdfWriter writer = new PdfWriter(out); InputStream stream = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream("/resources/pdf/test.pdf"); Pdf
PdfWriter writer = new PdfWriter(out);
InputStream stream = ((ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext()).getResourceAsStream("/resources/pdf/test.pdf");
PdfDocument pdf = new PdfDocument(new PdfReader(stream), writer);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
Map<String, PdfFormField> fields = form.getFormFields();
PdfFormField field = fields.get("ENTREPRISE");
if(field instanceof PdfTextFormField){
((PdfTextFormField) field).setMaxLen(30);
((PdfTextFormField) field).setComb(true);
((PdfTextFormField) field).setMultiline(false);
((PdfTextFormField) field).setPassword(false);
((PdfTextFormField) field).setFileSelect(false);
field.setValue(vo.getNomEntreprise());
}
奇怪的是,对于生成的表单(使用展平字段),一切都是完美的,但是如果我将表单设置为true#展平字段,字段中的文本显示为简单字符串,没有梳…首先,一个小提示:使用友好的
PdfTextFormField#setComb
API比使用低级标志设置API更好。低级标志并不总是有意义的,例如,组合字段标志应应用于文本字段,而不仅仅是任意字段
因此,您应该执行此检查并相应地设置标志:
PdfFormField field = form.getField("ENTREPRISE");
if (field instanceof PdfTextFormField) {
((PdfTextFormField) field).setComb(true);
}
除此之外,阅读setComb
方法的文档很有意义,其中说明了以下内容:
因此,您应该注意,您不能对字段进行梳理,例如,如果它是密码字段或多行字段,并且在任何情况下,您必须设置字段的最大长度,以便PDF查看器知道如何显示字段。您可以使用PdfTextFormField#setMaxLen
实现这一点。因此,完整的代码:
if (field instanceof PdfTextFormField) {
((PdfTextFormField) field).setComb(true);
((PdfTextFormField) field).setMaxLen(20);
}
另外,这些只是代码中明显缺少的东西,但可能还有更多,附加您有问题的特定PDF总是很有价值的。Hello@Alexey Subach!谢谢你们的回答:)我编辑了我的文章,做了一些小改动,但并没有效果。。我添加了如何关闭表单。。。以及生成的pdf(没有展平字段)。。事实上,当你点击一个字段时,你可以看到它们是梳子,但除此之外没有…:(:(我编辑了我的帖子!现在,当我将needApparences设置为true时,它是完美的,所有字段都是comb。不需要设置comb,maxlen,…已经由Adobe完成(当我创建pdf时)。但是现在,当我将FlattedFields设置为true时,所有comb都丢失了..):((我找到了解决方案!我使用的是旧版本的itext…需要使用更新版本^^再次感谢!
* Meaningful only if the MaxLen entry is present in the text field dictionary
* and if the Multiline, Password, and FileSelect flags are clear.
* If true, the field is automatically divided into as many equally spaced positions,
* or combs, as the value of MaxLen, and the text is laid out into those combs.
if (field instanceof PdfTextFormField) {
((PdfTextFormField) field).setComb(true);
((PdfTextFormField) field).setMaxLen(20);
}