2017-05-09 56 views
0

我想将XML(使用外部CSS)转换为使用Itext XMLWorkerHelper的PDF,每当XMLWorkerHelper分析格式错误的HTML时,都面临着运行时异常。例如:如何使用iText和XMLWorker将格式错误的HTML转换为PDF?

下面的html输入标记未关闭:而XMLWorkerHelper无法解析并抛出运行时异常。

如果我尝试使用正确的HTML输入标签,它会正常工作。

如何将格式错误或复杂的HTML(以及css)转换为使用Itext的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 { } 
         } 
        } 
+2

升级到iText 7并使用pdfHTML插件。 XML Worker的升级修复了您提到的问题。 –

+1

在将您的HTML提供给XMLWorker之前,请使用JSoup将其格式合理化。由Bruno提到的pdfHtml已经为你做了,但在iText 5中它仍然是一个手动步骤。 –

+0

我升级到Itext 7许可版本。任何能指出我正确的资源,我可以参考和我使用C#作为编程语言。请让我知道,如果我可以得到一些支持形式Itext,因为我使用的是行货版本。非常感谢@BrunoLowagie –

回答

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输出:

enter image description here

0

如果您可以自由选择特定的iText风格,请使用iText7和pdfHTML。它取代了XMLWorker,支持更广泛的标签和CSS3.0。

相关问题