我正在尝试使用Itext XMLWorkerHelper将HTML(使用外部CSS)转换为PDF,每当XMLWorkerHelper解析格式错误的HTML时,我都会遇到运行时异常。例如:
下面的html输入标记未关闭:XMLWorkerHelper无法解析并抛出运行时异常。
如果我尝试使用正确的HTML输入标签,它可以正常工作。
如何使用Itext将格式错误或复杂的HTML(以及css)转换为PDF格式。
下面是我的代码:
var test_html = File.ReadAllText("C:/Desking _ Lender Program - Dealertrack.html");
var test_css = File.ReadAllText("C:/login.css");
using (var msCss = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(test_css)))
{
using (var msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(test_html)))
{
//Parse the HTML
try
{
iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHtml, msCss);
}
catch { }
}
}
答案 0 :(得分:1)
您是否已决定使用iText7或iTextSharp(5.xx)有点不清楚,但这是后者使用HtmlAgilityPack清除格式错误的HTML的简单示例:
var malformedHtml = @"
<h1>Malformed HTML</h1>
<p>A paragraph <b><span>with improperly nested tags</b></span></p><hr>
<table><tr><td>Cell 1, row 1</td><td>Cell 1, row 2";
HtmlDocument h = new HtmlDocument()
{
OptionFixNestedTags = true, OptionWriteEmptyNodes = true
};
h.LoadHtml(malformedHtml);
string css = @"
h1 { font-size:1.4em; }
hr { margin-top: 4em; margin-bottom: 2em; color: #ddd; }
table { border-collapse: collapse; }
table, td { border: 1px solid black; }
td { padding: 4px; }
span { color: red; }";
using (var stream = new MemoryStream())
{
using (var document = new Document())
{
PdfWriter writer = PdfWriter.GetInstance(document, stream);
document.Open();
using (var htmlStream = new MemoryStream(Encoding.UTF8.GetBytes(h.DocumentNode.WriteTo())))
{
using (var cssStream = new MemoryStream(Encoding.UTF8.GetBytes(css)))
{
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, htmlStream, cssStream);
}
}
}
File.WriteAllBytes(OUTPUT, stream.ToArray());
}
PDF输出:
答案 1 :(得分:0)
如果您可以自由选择特定的iText风格,请使用iText7和pdfHTML。它取代了XMLWorker,支持更广泛的标签和CSS3.0。