2

我正在尝试转换使用 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。

这是用于检查 HtmlBody 的pastebin 的链接,MimeMessage因为我在这里达到了字符限制。

我错过了什么?谢谢。

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

4

2 回答 2

2

看起来您面临两个问题HtmlBody

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

任何时候您可能正在处理格式不正确的 XML 字符串,最好的办法是使用HtmlAgilityPack之类的解析器来清理混乱。这是一个简单的帮助方法,使用XPath来涵盖上述两个问题,并根据注释更新以删除破坏HtmlCommentNodeiText XML Worker 的 s:

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());
}
于 2017-03-04T01:17:06.140 回答
0

我发现 iTestSharp 的标签 <br> 有问题。请改用 <br/>。

于 2021-01-15T07:57:29.553 回答