使用 itext 7 将交互式复选框添加到 PDF
Add interactive checkbox to PDF using itext 7
我正在尝试向 iText7 pdfHTML 生成的 PDF 添加 AcroField 复选框。这在默认情况下不起作用,我看到有人建议使用自定义标签工作者,但尽管我尝试了很多,但我无法让它工作。有谁知道如何实现这个?或者举个例子?
我创建了一个非常简单的示例来向您展示如何在 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 的值时考虑它(在上面的示例中,我只是将其设置为 "Off")
2) 您需要创建不同的 acrofield 名称值(我刚刚使用 "checkbox")
3) 您可能希望在 html 到 pdf 处理之前预定义的某个位置不渲染 acrofield。您可能希望让 iText 根据放置 input
标签的位置动态定义其位置。
那样的话解决起来就比较困难了。您将需要创建自己的 CheckBox 元素(可能从 Paragraph
扩展)和它的渲染器(可能从 ParagraphRender
扩展)。然后您将需要重写它的 layout
方法(也许只需调用 super.layout()
来获取段落的坐标,然后才将 acrofield 添加到文档中)。这并不容易,但绝对值得一试!如果你没有成功,你可以随时问另一个 SO 问题 :)
我正在尝试向 iText7 pdfHTML 生成的 PDF 添加 AcroField 复选框。这在默认情况下不起作用,我看到有人建议使用自定义标签工作者,但尽管我尝试了很多,但我无法让它工作。有谁知道如何实现这个?或者举个例子?
我创建了一个非常简单的示例来向您展示如何在 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 的值时考虑它(在上面的示例中,我只是将其设置为 "Off")
2) 您需要创建不同的 acrofield 名称值(我刚刚使用 "checkbox")
3) 您可能希望在 html 到 pdf 处理之前预定义的某个位置不渲染 acrofield。您可能希望让 iText 根据放置 input
标签的位置动态定义其位置。
那样的话解决起来就比较困难了。您将需要创建自己的 CheckBox 元素(可能从 Paragraph
扩展)和它的渲染器(可能从 ParagraphRender
扩展)。然后您将需要重写它的 layout
方法(也许只需调用 super.layout()
来获取段落的坐标,然后才将 acrofield 添加到文档中)。这并不容易,但绝对值得一试!如果你没有成功,你可以随时问另一个 SO 问题 :)