9

我正在使用 iTextSharp v.4 来合并一大堆 html 文件。在我需要升级到 iTextSharp v.5 之前,它运行良好。

当我将流读取器(读取 html 文件的内容)传递给 HTMLWorker 对象的 ParseToList 方法时,问题就出现了。它抛出一个空引用异常。在调试它时,我可以访问 streamReader 并可以确认读取了文件的正确内容。

这是代码:

List<IElement> objects;
try
{
    objects = HTMLWorker.ParseToList(new StringReader(htmlString), null);
}
catch (Exception e)
{
    htmlString = "<html><head></head><body><br/><br/><h2 style='color:#FF0000'>ERROR READING FILE!</h2><h3>File Excluded From Stitched Document!</h3><br/><br/><p>There was an error while trying to read the following file:</p><p><span style='color:#FF0000'>" + fileName + "</span></p></body></html>";
    objects = HTMLWorker.ParseToList(new StringReader(htmlString), null);
}

在 catch 块中,您将看到我随后使用几乎相同的代码向 pdf 添加文本以说明存在问题。这段代码工作正常。这当然让我认为问题在于原始 html 字符串的内容,所以这里是字符串的内容,因为它是在传递到解析器之前的样子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    <meta http-equiv="Pragma" content="no-cache" />
    <meta http-equiv="cache-control" content="no-cache" />
</head>
<body style="font-family: Arial, Helvetica, sans-serif; font-size: 1em; margin: 0;
    padding: 0;">
    <div style="font-size: 1em; line-height: 1.25em; width: 190mm;">
        <h1 style="font-size: 1.5em; font-weight: bold; margin: 0 0 1.5em 0; text-align: center;">
            Advice Item 1</h1>
        <table border="0" style="width: 190mm; border-collapse: collapse; margin: 0 0 1.5em 0;
            width: 100%;">
            <tbody>
                <tr>
                    <td style="width: 35mm; height: 1px; line-height: 1px; font-size: 1px;">
                        &nbsp;
                    </td>
                    <td>
                    </td>
                    <td style="width: 30mm; height: 1px; line-height: 1px; font-size: 1px;">
                        &nbsp;
                    </td>
                    <td>
                    </td>
                </tr>
                <tr>
                    <td colspan="4" style="font-weight: bold;">
                        <span id="litPatchedToCC" style="text-align: right; font-weight: bold;"></span>
                    </td>
                </tr>
                <tr>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        By:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        ABC
                    </td>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        From:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        CC
                    </td>
                </tr>
                <tr>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Date:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        29/03/2011 13:35
                    </td>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        To:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        Member Practice
                    </td>
                </tr>
                <tr>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Folder:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        A15-123456
                    </td>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Individual:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        Miss A B Test
                    </td>
                </tr>
                <tr>
                    <td colspan="2">
                        <hr width="100%" />
                    </td>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Of:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        Lorem &amp; Ipsum
                    </td>
                </tr>
                <tr>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Species:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        Bovine
                    </td>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Position:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        Member
                    </td>
                </tr>
                <tr>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Item Type:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                    </td>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Tel:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                        0123 01234
                    </td>
                </tr>
                <tr>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                    </td>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Other Nos:
                    </th>
                    <td style="font-weight: bold; padding: 2px 5px;">
                    </td>
                </tr>
                <tr>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Reason For Call:
                    </th>
                    <td colspan="3" style="font-weight: bold; padding: 2px 5px;">
                        Some Reason
                    </td>
                </tr>
                <tr>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                        Subject:
                    </th>
                    <td colspan="3" style="font-weight: bold; padding: 2px 5px;">
                        Some problem.
                    </td>
                </tr>
                <tr>
                    <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                    </th>
                    <td>
                    </td>
                    <th scope="row" colspan="2" style="text-align: right; font-weight: normal; padding: 2px 5px;">
                    </th>
                    <td colspan="2">
                    </td>
                </tr>
                <tr>
                    <td style="font-size: 1.5em; font-weight: bold; text-align: center;" colspan="4">
                        Internal
                    </td>
                </tr>
                <tr>
                    <td colspan="4" style="text-align: center; padding: 2px 5px;">
                        <hr width="100%" />
                    </td>
                </tr>
            </tbody>
        </table>
        <div style="padding: 2px 5px;">
            <p>
                Here we start the discussion.</p>
            <br />
            <p>
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
            <br />
            <p>
                Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p>
        </div>
    </div>
</body>
</html>

谢谢你的帮助。霍夫纳威利

4

1 回答 1

7

看来HTMLWorker两人都快哽咽了<hr width="100%" />。既然您说您正在升级到 V5.XX,那么开始使用XMLWorker开始解析您的 HTML 也可能会很好——开发团队正在推荐它。(最新的HTMLWorker源代码甚至有一个小的参考指出这一点)

使用您的扩展 HTML 进行测试,它可以工作,并且实施起来还不错:)

using (Document document = new Document()) {
  PdfWriter writer = PdfWriter.GetInstance(document, Response.OutputStream);
  document.Open();
  try {
    StringReader sr = new StringReader(htmlString);
    XMLWorkerHelper.GetInstance().ParseXHtml(
      writer, document, sr
    );          
  }
  catch (Exception e) {
    throw;
  }
}

在 Web 环境中测试,因此请替换Response.OutputStreamStream您选择的。

于 2011-12-20T13:56:29.760 回答