我正在尝试将AcroField复选框添加到由iText7 pdfHTML生成的PDF中。默认情况下,这是不起作用的,我看到有人建议使用自定义标签工作器,但是我尝试了很多却无法使它起作用。有谁知道如何实现这一目标?还是一个例子?
答案 0 :(得分:1)
我创建了一个非常简单的示例,向您展示如何创建自定义标签工作程序并在将HTML转换为pdf时将acrofield添加到文档中。
查看下一个代码段:
class CustomTagWorkerFactory extends DefaultTagWorkerFactory {
@Override
public ITagWorker getCustomTagWorker(IElementNode tag, ProcessorContext context) {
if (tag.name().equals("input")) {
if (AttributeConstants.CHECKBOX.equals(tag.getAttribute(AttributeConstants.TYPE))) {
return new AcroInputTagWorker(tag, context);
}
}
return null;
}
在这里,我介绍了一个自定义标签工作器工厂,它将为除我指定的标签(<input type="checkbox">
)之外的所有标签创建默认标签工作器。
现在让我们在<input type="checkbox">
处理中向文档添加一个acrofield:
class AcroInputTagWorker extends InputTagWorker {
public AcroInputTagWorker(IElementNode element, ProcessorContext context) {
super(element, context);
PdfAcroForm.getAcroForm(context.getPdfDocument(), true)
.addField(PdfFormField.createCheckBox(context.getPdfDocument(), new Rectangle(100, 700, 30, 30), "checkbox", "Off"));
}
基本上就是这样。生成的非常简单的html文件pdf(基本上,只有一行:<input type="checkbox">
)看起来像这样:
现在让我们简要讨论可以改进的地方:
1)您可能想要检查是否设置了CHECKED属性,并在设置acrofield的值时考虑它(在上面的示例中,我只是将其设置为“关”)
2)您需要创建其他acrofield的名称值(我刚刚使用了“复选框”)
3)您可能希望将acrofield呈现在html到pdf处理之前未预定义的特定位置。您可能想让iText根据放置input
标签的位置动态地定义其位置。
在这种情况下,解决方案将更加困难。您将需要创建自己的CheckBox元素(可能从Paragraph
扩展)和渲染器(可能从ParagraphRender
扩展)。然后,您将需要重写其layout
方法(也许只需调用super.layout()
即可获取段落的坐标,然后将acrofield添加到文档中)。这并不容易,但是绝对值得一试!而且,如果您不成功,则可以随时提出另一个SO问题:)