You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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字符串中的标签是转义后的(如&lt;代替<),XMLParser直接解析这类字符串时,会将转义字符视为普通文本而非HTML标签,导致解析结构混乱。需先将转义的HTML还原为原始标签格式,再传入解析。
  • 严格验证HTML结构:XMLWorker对HTML的兼容性远低于浏览器,即使浏览器能正常渲染,也可能存在XMLWorker无法识别的嵌套问题。可使用HTML结构验证工具检查是否存在隐性语法错误。
  • 逐步简化排查:尝试移除部分HTML内容(如逐个删除表格),定位触发错误的具体模块,缩小问题范围。
  • 升级XMLWorker版本:旧版本XMLWorker存在表格解析的已知bug,升级到最新兼容版本可能解决问题。

内容的提问来源于stack exchange,提问作者Mikaelson Braz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:27:35