0

尝试使用 iText 进行简单的 PDF 生成,并在表格元素上遇到 NotImplementedException。

TableRowElement.type() 只是抛出新的 NotImplementedException()... 为什么叫它?

com.itextpdf.tool.xml.exceptions.NotImplementedException
at com.itextpdf.tool.xml.html.table.TableRowElement.type(TableRowElement.java:148)
at com.itextpdf.text.pdf.ColumnText.addElement(ColumnText.java:471)
at com.itextpdf.text.pdf.PdfPCell.addElement(PdfPCell.java:284)
at com.itextpdf.tool.xml.html.table.TableData.end(TableData.java:151)
at com.itextpdf.tool.xml.html.AbstractTagProcessor.endElement(AbstractTagProcessor.java:189)
at com.itextpdf.tool.xml.pipeline.html.HtmlPipeline.close(HtmlPipeline.java:206)
at com.itextpdf.tool.xml.XMLWorker.endElement(XMLWorker.java:141)
at com.itextpdf.tool.xml.parser.XMLParser.endElement(XMLParser.java:395)
at com.itextpdf.tool.xml.parser.state.ClosingTagState.process(ClosingTagState.java:70)
at com.itextpdf.tool.xml.parser.XMLParser.parseWithReader(XMLParser.java:235)
at com.itextpdf.tool.xml.parser.XMLParser.parse(XMLParser.java:213)
at com.itextpdf.tool.xml.XMLWorkerHelper.parseXHtml(XMLWorkerHelper.java:175)
at com.slim.pims.upload.ui.OwnerMainPDF.doPost(OwnerMainPDF.java:90)
at com.slim.pims.upload.ui.OwnerMainPDF.doGet(OwnerMainPDF.java:53)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)

来源:

//now, this is fun!
public boolean process(final ElementListener listener) {
    throw new NotImplementedException();
}

public int type() {
    throw new NotImplementedException();
}

public boolean isContent() {
    throw new NotImplementedException();
}

public boolean isNestable() {
    throw new NotImplementedException();
}

public List<Chunk> getChunks() {
    throw new NotImplementedException();
}

编辑以包含 html 源代码。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">


<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
    <head>
        <title></title>     
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    </head>

    <body>


    <table style="width: 100%; ">
        <tr>
        <td>



        <tr>
        <td align="left" width="40%" valign="top">
            <table id='tableRegionTotals' style='width: 100%;' border='0' cellpadding='0' cellspacing='1' bgcolor='#cccccc'><tr height='20'><td class='a5' align='center' width=40%;><stong>Schedule Status</stong></td><td class='a5' align='center' width=30%;><stong>No.</stong></td><td class='a5' align='center' width=30%;><stong>Total (for New Projects)</stong></td></tr><tr height='20'><td class='a0' align='left'><table><tr><td width=10%;>&nbsp;</td><td class='a0' width=90%;><div id='divOnTrack' style='width:10px;background-color:#336633;' >&nbsp;&nbsp;&nbsp;&nbsp;<a onclick='' name='nontrack'>On&nbsp;&nbsp;Track&nbsp;</a></div></td></tr></table></td><td class='a0' align='right'>1&nbsp;&nbsp;</td><td class='a0' align='right'>0.00&nbsp;&nbsp;</td></tr><tr height='20'><td class='a0' align='left'><table><tr><td width=10%;>&nbsp;</td><td class='a0' width=90%;><div id='divNeedsAttention' style='width:10px;background-color:#cccc33;' >&nbsp;&nbsp;&nbsp;&nbsp;<a onclick='' name='nontrack'>Needs&nbsp;&nbsp;Attention&nbsp;</a></div></td></tr></table></td><td class='a0' align='right'>1&nbsp;&nbsp;</td><td class='a0' align='right'>0.00&nbsp;&nbsp;</td></tr><tr height='20'><td class='a0' align='left'><table><tr><td width=10%;>&nbsp;</td><td class='a0' width=90%;><div id='divOffTrack' style='width:10px;background-color:#cc0000;' >&nbsp;&nbsp;&nbsp;&nbsp;<a onclick='' name='nontrack'>Off&nbsp;&nbsp;Track&nbsp;</a></div></td></tr></table></td><td class='a0' align='right'>20&nbsp;&nbsp;</td><td class='a0' align='right'>0&nbsp;&nbsp;</td></tr></table>
        </td>
        <td width="1%">&nbsp;</td>
        <td align="right" width="55%" valign="top">


        </td>
        </tr>

        </td>
        </tr>   
    </table>

    <table>
        <tr>
        <td>



        </td>
        </tr>

    </table>

        </body>
    </html>
4

1 回答 1

1

这是 iText 支持工程师的复制粘贴(我为此制作了付费支持票):

HTML 确实不正确。它充满了错误。

第一个表以<tr><td><tr>. 在 a 中嵌套 a 是非法<tr><td>。这会导致 XML Worker 抛出NonImplementedException. 当删除该表<tr><td>的开头和</td></tr>结尾时,XML Worker 能够处理 HTML。

由于 HTML 的其他问题,生成的 PDF 看起来不太好:

  • 必须引用属性值。示例:宽度=90%;应替换为 width="90%"。
  • 在表格的第一行中,文本被 包围<stong>,它不是有效的 (X)HTML 标记,并且被 XML Worker 忽略。替换为<strong>
  • 用于显示绿色、黄色和红色矩形的sdiv应替换为spans。
  • 需要对宽度属性进行一些调整以适应纸张大小(PDF 查看器不是浏览器)。
  • widthandheight不是 and 的有效属性<td><tr>但我们会处理它们)。
  • bgcolor不是 的有效属性<table>,这就是 PDF 中表格背景为白色的原因。

换句话说:您的问题与其说是 iText 和 XML Worker 的问题,不如说是 XHTML 的问题。

于 2013-11-07T15:18:55.167 回答