C# 为什么我的PDF被生成为空白?

C# 为什么我的PDF被生成为空白?,c#,pdf,itextsharp,xmlworker,C#,Pdf,Itextsharp,Xmlworker,我正在使用ItextSharp和c#,asp.net MVC生成PDF报告。但是,当我生成报告时,PDF返回为空白(除了一个可以正常工作的标题)。我希望你的意见 生成报告的代码如下所示: using (var writer = PdfWriter.GetInstance(doc, ms)) { // This sorts out the Header and Footer parts.

我正在使用ItextSharp和c#,asp.net MVC生成PDF报告。但是,当我生成报告时,PDF返回为空白(除了一个可以正常工作的标题)。我希望你的意见

生成报告的代码如下所示:

                using (var writer = PdfWriter.GetInstance(doc, ms))
                {
                    // This sorts out the Header and Footer parts.
                    var headerFooter = new ReportHeaderFooter(reportsAccessor);
                    writer.PageEvent = headerFooter;

                    var rootPath = ConfigurationManager.AppSettings["SaveFileRootPath"];
                    string html = File.ReadAllText(rootPath + "/reports/report.html");                      

                    // Perform the parsing to PDF
                    doc.Open();

                    // The html needs to be sorted before this call.
                    StringReader sr = new StringReader(html);
                    XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, sr);
                    doc.Close();
                    writer.Close();
                    res = ms.ToArray();
                }
我知道有很多隐藏的内容,但为了方便起见,这里有一个生成并放入StringReader的HTML示例:

    <table style="font-size:10pt">
        <tr>
            <td rowspan="4"> Address<br/> </td>
            <td>Phone: phone</td>
        </tr>
        <tr>
            <td>Fax: fax</td>
        </tr>
        <tr>
            <td>Email: email@example.com</td>
        </tr>
        <tr>
            <td>Website: example.com</td>
        </tr>
    <table>

    <table style="font-size:10pt; width:100%">
        <tr style="width:50%">
            <td>Settlement: 30 days from invoice</td>
        </tr>
        <tr>
            <td>Delivery Charge Notes: N/A</td>
        </tr>
    </table>
    <p style="width:100%; font-size:10pt">
    I love notes</p>

    <table>
    <tr style="font-weight:bold">
        <td>Item</td>
        <td>Item Code</td>
        <td>Description</td>
        <td>Unit Size</td>
        <td>Units Per Outer</td>
        <td>Units Per Pallet</td>
        <td>Invoice Price Volume Breaks</td>
        <td>Branding</td>
        <td>Notes</td>
    </tr>

    </table>

当我在代码中运行你的HTML时,我确实得到了一个异常,因为在你的HTML中有一个隐蔽的错误。第一个表没有结束标记:它说的是
,而不是
。这很容易被忽视。您可以在此处找到更正后的HTML:

这是生成的PDF的外观:

您的代码和我的代码之间的一个主要区别是,我使用的是iText/XML Worker 5.5.6(Java),而您使用的是iTextSharp/XML Worker(C#)。虽然Java iText和XML Worker与C#iTextSharp和XML Worker保持同步(因此应该具有相同的行为),但底层XML解析器是不同的

我知道我们决定表现得像浏览器(*),默默地允许一些糟糕的HTML构造失败,但我对Java XML解析的经验是,这会引发异常。也许C#XML解析没有

(*)我是iText集团的首席执行官,该集团由比利时、美国和新加坡的公司组成

至于“css解析器哭泣”异常,我们将在下一版本中删除它:

您是否尝试过使用非常简单的HTML?下面显示的片段至少包含一个我可以看到的HTML错误(请看第一个表-没有结束标记(您写的是“”,而不是“”)。了解一个真正简单有效的HTML是否有效会很有趣;这意味着错误发生在您的特定HTML文件中…@davidvandriesche-测试并确认在传递无效的HTML片段时引发异常。我想这就是答案,我认为内联样式又出现了一个错误(它说css解析器在哭?!?)但是我相信这已经解决了最初的问题。谢谢当我年轻的时候,我经常在我的代码中添加有趣的错误消息,但是我没有编写XML Worker代码,所以我从来没有听说过一个哭泣的CSS解析器。我想知道这听起来如何:D如果你有完整的错误消息,我可以向XML Worker开发人员查询。错误消息是{“iTextSharp.tool.xml.pipeline.css.CssResolverPipeline哭了,它找不到自己的上下文。”}我会向我们的开发人员询问这个错误消息。这有点好笑,但老实说:我不知道读它意味着什么。谢谢Bruno,我可以告诉你,收到这样一条消息后就不那么好笑了:-s
    public override void OnStartPage(PdfWriter writer, Document document)
    {
        base.OnStartPage(writer, document);
        var rootPath = ConfigurationManager.AppSettings["SaveFileRootPath"];
        GetReportImageResult imgInfo = ReportsAccessor.GetImage(4);

        byte[] header_img = imgInfo.ReportImage;
        string logoFn = rootPath + "/tmp/logo.png";
        File.WriteAllBytes(logoFn, header_img);
        string html = File.ReadAllText(rootPath + "/reports/report_header.html");
        html = html.Replace("{{ title }}", HeaderTitle);
        html = html.Replace("{{ logo_img }}", logoFn);

        StringReader sr = new StringReader(html);
        XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, sr);          
    }