2017-05-09 6 views
0

XML (외부 CSS가있는)을 Itext XMLWorkerHelper를 사용하여 PDF로 변환하려고 시도 중입니다. XMLWorkerHelper가 조작 된 HTML을 구문 분석 할 때마다 런타임 예외가 발생합니다. 예 :형식이 잘못된 HTML을 iText 및 XMLWorker를 사용하여 PDF로 변환하려면 어떻게해야합니까?

아래 html에는 입력 태그가 닫히지 않았습니다. XMLWorkerHelper는 구문 분석 할 수 없으며 런타임 예외를 throw합니다.

올바른 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을 지원합니다.