java - 使用 itext 7 将交互式复选框添加到 PDF
问题描述
我正在尝试将 AcroField 复选框添加到由 iText7 pdfHTML 生成的 PDF 中。这在默认情况下不起作用,我看到有人建议使用自定义标签工作者,但尽管我尝试了很多,但我无法让它工作。有谁知道如何实现这个?还是一个例子?
解决方案
我创建了一个非常简单的示例来向您展示如何创建自定义标签工作者并在处理 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 元素(可能从 a 扩展Paragraph
)和它的渲染器(可能从 a 扩展ParagraphRender
)。然后你需要重写它的layout
方法(也许只是调用super.layout()
来获取段落的坐标,然后才将 acrofield 添加到文档中)。这并不容易,但绝对值得一试!如果你不成功,你可以随时问另一个 SO 问题:)
推荐阅读
- php - 合并两个表查询
- docker - 为什么两个 docker 镜像具有相同的镜像 ID 和相同的标签,但摘要不同?
- python - TypeError: (): 不兼容的函数参数。支持以下参数类型: 1. (self: fasttext_pybind.args, arg0: float) -> None
- python - python sklearn中的导入错误。无法加载引用的库
- javascript - 从 popup.html 和 popup.js 打开两个新标签
- reactjs - 反应组件忽略
- javascript - JavaScript 全局变量和 HTML 按钮功能
- java - 如何在自己的程序中使用下载的 Github 库?
- c - 尝试使用 sigusr1 停止并继续程序
- batch-file - 宏中的命令重定向返回语法错误