为什么我的PDF生成为空白?

3

我正在使用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生成了一个漂亮的空白PDF文件(不是我想要的)。我看不出有什么问题,希望能就以下两个问题得到一些帮助: [1] 为什么报告是空白的? [2] 如果这是解析错误,为什么没有显示错误信息,反而是一个空白报告?(是否有设置或参数可以抛出更有用的错误信息而不是空白报告?)
更新: 我已经添加了头/尾代码: public string HeaderTitle { get; set; } public IReportsAccessor ReportsAccessor { get; set; } public ReportHeaderFooter(IReportsAccessor reportsAccessor) { this.ReportsAccessor = reportsAccessor; }
    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);          
    }

1
你尝试过使用非常简单的HTML吗?你下面展示的片段已经包含至少一个HTML错误(看一下第一个表格 - 你没有为它写一个闭合标签(你写了“<table>”而不是“</table>”)。知道一个非常简单和有效的HTML是否可行会很有趣;这意味着错误在于你特定的HTML文件... - David van Driessche
@DavidvanDriessche - 测试并确认在传递无效的HTML片段时会抛出异常。 - kuujinbo
1个回答

3
当我运行你的HTML代码时,我会得到一个异常,因为在你的HTML中有一个难以察觉的错误。第一个表没有结束标签:它说<table>而不是</table>。这很容易被忽视。你可以在这里找到纠正后的HTML:table10.html 下面是生成的PDF文件:html_table_10.pdf 下面是PDF的截图:enter image description here 我的代码和你的代码之间的一个主要区别是,我使用了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 Group的CEO,该集团由比利时、美国和新加坡的公司组成。
至于"css resolver crying"异常,我们将在下一个版本中删除它: enter image description here

你有问题跟踪器的链接吗?我还没有收到任何回复。 - Daniel Casserly
抱歉,我不明白。您已经拥有了我正在使用的XMLWorker的所有代码,您能详细说明哪些配置不正确吗? - Daniel Casserly
你可以在这里找到我的测试:http://itextpdf.com/sandbox/xmlworker/ParseHtmlTable10,结果可以在这里找到:http://itextpdf.com/sites/default/files/html_table_10.pdf。我没有遇到任何问题。没有出现任何错误,因此也没有需要修复的地方。 - Bruno Lowagie
唯一的区别是您没有使用我在示例中使用的 var headerFooter = new ReportHeaderFooter(reportsAccessor) 来设置页眉/页脚。我现在将把那段代码附加到我的示例中。 - Daniel Casserly
我尝试使用onEndPage(),但是我无法在HTML中添加标题,因为允许的样式集合中没有任何可以工作的CSS样式。它确实添加了一个标题并且有效,即使我在下面放置一个简单的段落也可以正常工作,但是,如果我在其中添加上述代码,则会抛出错误。这毫无意义。 - Daniel Casserly
显示剩余14条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接