iTextPDF XMLWorker中PdfPageEventHelper.onGenericTag触发时机咨询
首先先确认你用的Maven依赖是正确的,就是你给出的这个:
<dependency> <groupId>com.itextpdf.tool</groupId> <artifactId>xmlworker</artifactId> <version>5.5.6</version> </dependency>
接下来针对你问的onGenericTag触发时机,结合你要实现的自定义/通用标签需求,给你详细说明:
场景1:处理自定义HTML标签
当你在HTML里使用了XML Worker没有内置处理逻辑的自定义标签(比如<custom-highlight>、<my-section>这类),并且你为这个标签注册了GenericTagWorker作为处理类时,解析器在遇到这个自定义标签的瞬间,就会触发onGenericTag方法。这个时候你可以在方法里拿到标签的名称、属性,以及它包含的子元素,自定义处理逻辑(比如修改Chunk样式、添加额外元素等)。场景2:给标准HTML元素添加通用标记属性
如果你不想自定义标签,而是想给现有的标准HTML标签(比如<p>、<span>、<div>)附加自定义逻辑,可以给这些标签加上data-tag属性(5.5.6版本用这个属性)。比如:
<p data-tag="important-paragraph">这段文本需要特殊处理</p> <span data-tag="highlight-text">高亮显示这段</span>
当解析器处理这些带data-tag的标准标签时,除了会正常调用对应标签的回调方法(比如<p>触发onParagraph),还会额外触发onGenericTag方法,把你设置的data-tag值和标签信息传递进来,方便你做额外的自定义处理。
和onParagraph这类针对特定标准标签的回调不同,onGenericTag是一个通用的“兜底”或“扩展”回调入口——不管是自定义标签还是带标记属性的标准标签,只要匹配到你配置的处理规则,就会触发它。你可以在这个方法里灵活地操作Chunk或其他PDF元素,实现你需要的自定义样式或行为。
举个简单的代码示例,自定义一个处理器来使用onGenericTag:
public class MyCustomTagHandler extends AbstractElementHandler { @Override public void onGenericTag(Tag tag, List<IElement> elements) { // 获取标签名称和自定义属性值 String tagName = tag.getName(); String customTagValue = tag.getAttribute("data-tag"); // 遍历子元素,给Chunk添加样式 for (IElement element : elements) { if (element instanceof Chunk) { Chunk chunk = (Chunk) element; // 根据自定义标记设置不同样式 if ("important-paragraph".equals(customTagValue)) { chunk.setFontSize(14); chunk.setBold(); } else if ("highlight-text".equals(customTagValue)) { chunk.setBackgroundColor(BaseColor.YELLOW); } } } } }
之后你只需要把这个处理器注册到XML Worker的解析器中,就能让对应的标签触发onGenericTag逻辑了。
内容的提问来源于stack exchange,提问作者Niranjan Kumar

