使用iTextPDF的XMLParser转HTML到PDF时遇RuntimeWorkerException报错
iTextPDF XMLWorker转换HTML到PDF时的RuntimeWorkerException问题
使用iTextPDF的XMLWorker与XMLParser将HTML字符串转换为PDF时,触发RuntimeWorkerException,错误提示为**"Invalid nested tag tr found, expected closing tag td"**。检查提供的HTML代码未发现未闭合的td标签,长时间排查仍未定位问题。
错误详情
com.itextpdf.tool.xml.exceptions.RuntimeWorkerException: Invalid nested tag tr found, expected closing tag td. at com.itextpdf.tool.xml.XMLWorker.endElement(XMLWorker.java:135) at com.itextpdf.tool.xml.parser.XMLParser.endElement(XMLParser.java:396) at com.itextpdf.tool.xml.parser.state.ClosingTagState.process(ClosingTagState.java:71) at com.itextpdf.tool.xml.parser.XMLParser.parseWithReader(XMLParser.java:236) at com.itextpdf.tool.xml.parser.XMLParser.parse(XMLParser.java:214) at com.itextpdf.tool.xml.parser.XMLParser.parse(XMLParser.java:175) at com.lecom.workflow.robo.satelite.inmetro.balcao.RbINMETROGeraProcedimentoSeiBalcao.createPdfFromHtmlString(RbINMETROGeraProcedimentoSeiBalcao.java:1626) at com.lecom.workflow.robo.satelite.inmetro.balcao.RbINMETROGeraProcedimentoSeiBalcao.executar(RbINMETROGeraProcedimentoSeiBalcao.java:257) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at br.com.lecom.workflow.servicos.business.ServicoBuilderRobo.executar(ServicoBuilderRobo.java:80) at com.lecom.workflow.robo.ExecutaRobo.run(ExecutaRobo.java:32) at com.lecom.workflow.robo.CustomRobotExecute.execute(CustomRobotExecute.java:19) at org.quartz.core.JobRunShell.run(JobRunShell.java:202) at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573)
相关HTML代码
<body> <div id='container' style='width: 100%;'> <h2> XXXXXXXXXXX </h2> <p>Nº do Protocolo da Solicitação: XXXXXX </p> <hr /> <hr /> <h2>Dados do Solicitante</h2> <table> <col width='33%' /> <col width='34%' /> <col width='33%' /> <tr> <td>CNPJ: XXXXXXXX </td> </tr> <tr> <td>Nome da Empresa/Instituição: XXXXX </td> </tr> <tr> <td colspan='2'>CPF: XXXXXX </td> </tr> <tr> <td colspan='3'>Nome: XXXXXXX </td> </tr> <tr> <td colspan='3'>E-mail: XXXXXXX </td> </tr> <tr> <td>Telefone: XXXXXXXX </td> </tr> <tr> <td colspan='3'>UF: XX </td> </tr> </table> <hr /> <h2>Documentos anexos</h2> <table id='tblAnexos'> <thead> <tr> <th>Nome</th> <th>Arquivo</th> </tr> </thead> <tbody> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> </tbody> </table> <br /> <br /> <table> <tr> <td colspan='3'>Detalhameto da solicitação:</td> </tr> <tr> <td colspan='3'>XXXXXXXXXXX<br /><br />XXXX<br />XXXXX</td> </tr> </table> <h2>Documentos do Analista</h2> <table id='tblAnexosAna'> <thead> <tr> <th>Nome</th> <th>Arquivo</th> </tr> </thead> <tbody> <tr> <td>XXXXXXX</td> <td>XXXXXXX</td> </tr> </tbody> </table> <h2>Outras Informações</h2> <table> <tr> <td>Analista Responsável: XXXXXXX</td> </tr> <tr> <td>Data do envio da solicitação: XXXXXXX</td> </tr> </table> </div> </body>
使用的XMLParser代码片段
// XML Worker XMLWorker worker = new XMLWorker(css, true); XMLParser p = new XMLParser(worker); p.parse(new ByteArrayInputStream(htmlString.getBytes()));
排查建议
- 处理HTML转义问题:当前HTML字符串中的标签是转义后的(如
<代替<),XMLParser直接解析这类字符串时,会将转义字符视为普通文本而非HTML标签,导致解析结构混乱。需先将转义的HTML还原为原始标签格式,再传入解析。 - 严格验证HTML结构:XMLWorker对HTML的兼容性远低于浏览器,即使浏览器能正常渲染,也可能存在XMLWorker无法识别的嵌套问题。可使用HTML结构验证工具检查是否存在隐性语法错误。
- 逐步简化排查:尝试移除部分HTML内容(如逐个删除表格),定位触发错误的具体模块,缩小问题范围。
- 升级XMLWorker版本:旧版本XMLWorker存在表格解析的已知bug,升级到最新兼容版本可能解决问题。
内容的提问来源于stack exchange,提问作者Mikaelson Braz
相关产品推荐
相关产品推荐

