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] 如果这是解析中的错误,为什么它没有出现错误而是空白报告(是否有我可以设置的设置或参数会引发错误比空白报告有用得多?)

更新:我添加了页眉/页脚的代码

公共字符串 HeaderTitle { 获取;放; } 公共 IReportsAccessor ReportsAccessor { 获取;放; } 公共 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);          
    }
4

1 回答 1

3

当我通过我的代码运行你的 HTML 时,我确实遇到了一个异常,因为你的 HTML 中有一个偷偷摸摸的错误。第一个表没有结束标签:它说<table>而不是</table>. 这很容易被忽视。您可以在此处找到更正后的 HTML:table10.html

这是生成的 PDF 的样子:html_table_10.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 resolver cry”异常,我们会在下个版本中移除: 在此处输入图像描述

于 2015-05-16T16:49:14.457 回答