2017-04-13 522 views
0

對於特定情況,我使用iText和XMLWorkerHelper來解決問題。我生成多頁PDF文件沒有問題,但有時會出現特殊字符錯誤。使用特殊字符失敗的iText將HTML轉換爲PDF

我測試了我的模板,這不是我的HTML的一個問題,即使異常說:

Exception thrown: 'iTextSharp.tool.xml.exceptions.RuntimeWorkerException' in itextsharp.xmlworker.dll 

Additional information: Invalid nested tag tr found, expected closing tag td. 

此錯誤是由於性格:&被添加到我的模板。

<td>Launch C&O</td> 

我不完全知道如何解決這個錯誤,它是一個編碼錯誤?我應該在創建PDF時指定編碼模式嗎?

這是創建一個PDF的代碼:

public async Task Generate(Stream stream, List<string> contentPages) 
     { 
       try 
       { 
        int cpt = 1; 
        Document document = new Document(); 
        PdfWriter writer = PdfWriter.GetInstance(document, stream); 
        writer.CloseStream = false; 
        document.Open(); 

        foreach (string pdfContentPage in contentPages) 
        { 
         try 
         { 
          document.NewPage(); 
          using (StringReader srHtml = new StringReader(pdfContentPage)) 
          { 
           XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, srHtml); 
          } 
          ++cpt; 
         } 
         catch (RuntimeWorkerException ex) 
         { 
          Console.Write($"An error occured at PDF generation for cpt = {cpt}"); 
          Console.Write(ex.Message); 
         } 
         catch (Exception) 
         { 
          Console.WriteLine($"Content Error : pdfContentPage}"); 
          throw; 
         } 
        } 

        document.Close(); 
       } 
       catch (Exception) 
       { 
        throw; 
       } 
} 

如果你有一個建議,我很高興地閱讀它! :)

+2

更換'&'和''&,看看會發生什麼。 –

+0

它沒有改變任何東西,感謝您的目的:) –

+0

通過https://validator.w3.org/check上的W3C驗證程序運行您的HTML,並檢查*清理標記與HTML-Tidy *。與您的原始HTML比較。請使用頁面底部的清理過的HTML再次嘗試。您可以使用* JTidy *在自己的代碼中自動執行此操作。 –

回答

0

與嘗試以下邏輯

InputStream is = new ByteArrayInputStream(srHtml.getBytes(Charset.forName("UTF-8"))); 
XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, is, Charset.forName("UTF-8")); 

有了,xmlworker 5.5.12和5.5.12 itextpdf版本

+0

正如在問題的評論中已經發現的那樣,問題是由無效的XML引起的;你的代碼不會有幫助。 – mkl