【发布时间】:2017-09-09 13:41:45
【问题描述】:
在特定情况下使用 iText 和 XMLWorkerHelper 时遇到问题。我生成多个包含多个页面的 PDF 文件没有问题,但有时会出现特殊字符错误。
我测试了我的模板,我的 HTML 没有问题,即使异常说:
Exception thrown: 'iTextSharp.tool.xml.exceptions.RuntimeWorkerException' in itextsharp.xmlworker.dll
Additional information: Invalid nested tag tr found, expected closing tag td.
此错误是由于添加到我的模板中的字符 : & 造成的。
<td>Launch C&O</td>
我不知道如何解决这个错误,是编码错误吗?我应该在创建 PDF 时指定编码模式吗?
这是创建 PDF 的代码:
public async Task Generate(Stream stream, List<string> contentPages)
{
try
{
int cpt = 1;
Document document = new Document();
PdfWriter writer = PdfWriter.GetInstance(document, stream);
writer.CloseStream = false;
document.Open();
foreach (string pdfContentPage in contentPages)
{
try
{
document.NewPage();
using (StringReader srHtml = new StringReader(pdfContentPage ))
{
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, srHtml);
}
++cpt;
}
catch (RuntimeWorkerException ex)
{
Console.Write($"An error occured at PDF generation for cpt = {cpt}");
Console.Write(ex.Message);
}
catch (Exception)
{
Console.WriteLine($"Content Error : pdfContentPage}");
throw;
}
}
document.Close();
}
catch (Exception)
{
throw;
}
}
如果您有建议,我很高兴阅读! :)
【问题讨论】:
-
用
&amp;替换&,看看会发生什么。 -
它没有改变任何东西,谢谢你的目的:)
-
通过validator.w3.org/check 上的 W3C 验证器运行您的 HTML 并检查 使用 HTML-Tidy 清理标记。与您的原始 HTML 进行比较。使用页面底部的已清理 HTML 重试。您可以使用 JTidy 在您自己的代码中自动执行此操作。
-
我只是通过使用 new System.Xml.Linq.XText(myString).ToString() 来发现一个解决方案(或部分解决方案),我需要添加到我的模板中。跨度>
-
非常奇怪的错误描述。我一直在寻找这个问题很多天。谢天谢地,在这篇文章中找到了实际的问题和解决方案。我已经通过像这样替换 & 字符来解决它:
string htmlText = templateHTML.Replace("&", "&amp;");