为什么我的 PDF 生成为空白?
Why is my PDF being generated as blank?
我正在使用 ItextSharp 和 c#,asp.net MVC 生成 PDF 报告。但是,当我生成报告时,PDF 返回为空白(除了 header 工作正常)。我会喜欢你的意见。
生成报告的代码如下:
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] 如果这是解析中的错误,为什么它没有出现错误而是一个空白报告(是否有我可以设置的设置或参数会抛出比空白报告更有用的错误? )
更新:
我已经添加了 header/footer
的代码
public string HeaderTitle { get;放; }
public IReportsAccessor ReportsAccessor { 得到;放; }
public ReportHeaderFooter(IReportsAccessor 报告访问者)
{
this.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);
}
当我通过我的代码 运行 你的 HTML 时,我确实得到了一个异常,因为你的 HTML 中有一个偷偷摸摸的错误。第一个 table 没有结束标签:它表示 <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 crying" 异常,我们将在下一个版本中将其删除:
我正在使用 ItextSharp 和 c#,asp.net MVC 生成 PDF 报告。但是,当我生成报告时,PDF 返回为空白(除了 header 工作正常)。我会喜欢你的意见。
生成报告的代码如下:
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] 如果这是解析中的错误,为什么它没有出现错误而是一个空白报告(是否有我可以设置的设置或参数会抛出比空白报告更有用的错误? )
更新: 我已经添加了 header/footer
的代码public string HeaderTitle { get;放; } public IReportsAccessor ReportsAccessor { 得到;放; } public ReportHeaderFooter(IReportsAccessor 报告访问者) { this.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);
}
当我通过我的代码 运行 你的 HTML 时,我确实得到了一个异常,因为你的 HTML 中有一个偷偷摸摸的错误。第一个 table 没有结束标签:它表示 <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 crying" 异常,我们将在下一个版本中将其删除: