gpt4 book ai didi

c# - Mailkit:使用 iTextSharp XMLWorker 将 HtmlBody 转换为 pdf 抛出 "The document has no pages"

转载 作者:行者123 更新时间:2023-11-30 23:15:29 25 4
gpt4 key购买 nike

我正在尝试使用 Mailkit 转换从邮件服务器收到的电子邮件的 HtmlBody,看起来 iTextSharp 不太喜欢我传递给它的 html。

我的方法适用于“示例”html 代码,但我收到了一条The document has no pages 错误消息,看起来好像是在 html 不再是 html 时抛出的。

public void GenerateHtmlFromBody(UniqueId uid)
{
var email = imap.Inbox.GetMessage(uid);
Byte[] bytes;

using (var ms = new MemoryStream())
{
using (var doc = new Document())
{
using (var writer = PdfWriter.GetInstance(doc, ms))
{
doc.Open();

//Sample HTML and CSS
var example_html = @"<p>This <em>is </em><span class=""headline"" style=""text-decoration: underline;"">some</span> <strong>sample <em> text</em></strong><span style=""color: red;"">!!!</span></p>";
var example_css = @".headline{font-size:200%}";

using (var srHtml = new StringReader(email.HtmlBody))
{
//Parse the HTML
iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
}
doc.Close();
}
}
bytes = ms.ToArray();
}
var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "processedMailPdf.pdf");
System.IO.File.WriteAllBytes(testFile, bytes);
}

我正在访问 MimeMessage.HtmlBody 并进行调试,看起来它实际上是 html。

Here is a link to pastebin用于检查 MimeMessage 的 HtmlBody,因为我在这里达到了字符数限制。

我错过了什么?谢谢。

编辑: 我试过使用 HTMLWorker(已弃用)但它不稳定。它适用于一封电子邮件,但不适用于其他电子邮件。当然这不是一个解决方案,但它最终从 Mailkit 生成了一个 pdf,这是“东西”。

最佳答案

看起来您在使用 HtmlBody 时遇到了两个问题:

  1. 可以是纯文本。
  2. 当 [X]HTML 时,它格式正确。

任何时候您可能正在处理一个格式不正确的 XML 字符串,您最好的选择是使用像 HtmlAgilityPack 这样的解析器。收拾残局。这是一个使用 XPath 的简单辅助方法涵盖上述两个问题,并根据注释更新删除破坏 iText XML Worker 的 HtmlCommentNode:

string FixBrokenMarkup(string broken)
{
HtmlDocument h = new HtmlDocument()
{
OptionAutoCloseOnEnd = true,
OptionFixNestedTags = true,
OptionWriteEmptyNodes = true
};
h.LoadHtml(broken);

// UPDATED to remove HtmlCommentNode
var comments = h.DocumentNode.SelectNodes("//comment()");
if (comments != null)
{
foreach (var node in comments) { node.Remove(); }
}

return h.DocumentNode.SelectNodes("child::*") != null
// ^^^^^^^^^^
// XPath above: string plain-text or contains markup/tags
? h.DocumentNode.WriteTo()
: string.Format("<span>{0}</span>", broken);
}

为了完整起见,生成 PDF 的代码。测试并使用您在上面提供的 pastebin 链接:

var fixedMarkup = FixBrokenMarkup(PASTEBIN);
// swap initialization to verify plain-text works too
// var fixedMarkup = FixBrokenMarkup("some text");

using (var stream = new MemoryStream())
{
using (var document = new Document())
{
PdfWriter writer = PdfWriter.GetInstance(document, stream);
document.Open();
using (var stringReader = new StringReader(fixedMarkup))
{
XMLWorkerHelper.GetInstance().ParseXHtml(
writer, document, stringReader
);
}
}
File.WriteAllBytes(OUTPUT, stream.ToArray());
}

关于c# - Mailkit:使用 iTextSharp XMLWorker 将 HtmlBody 转换为 pdf 抛出 "The document has no pages",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42577638/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com