2017-05-09 3 views
0

HTML(外部CSS付き)をItext XMLWorkerHelperを使用してPDFに変換しようとしていますが、XMLWorkerHelperが不正なHTMLを解析するたびにランタイム例外に直面しています。例:不正形式のHTMLをiTextとXMLWorkerで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#を使用しています。ライセンスされたバージョンを使用しているので、私はいくつかのサポートフォームを入手できるかどうか教えてください。ありがとうございました@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をサポートします。

関連する問題