c#-为什么我的PDF生成为空白?
作者:互联网
我正在使用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 {get;组; }
公共IReportsAccessor ReportsAccessor {get;组; }
公共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);
}
解决方法:
当我通过代码运行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解析器哭泣”异常,我们将在下一个版本中将其删除:
标签:pdf,itextsharp,xmlworker,c 来源: https://codeday.me/bug/20191120/2042987.html