2017-04-13 4 views
0

Je suis confronté à un problème en utilisant iText et XMLWorkerHelper pour un cas spécifique. Je génère plusieurs fichiers PDF avec plusieurs pages sans problème mais parfois, une erreur se produit avec les caractères spéciaux.Convertir du HTML en PDF en utilisant iText avec char spécial

J'ai testé mon modèle et il n'y a pas un problème avec mon HTML, même si l'exception dit:

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

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

Cette erreur est due au caractère: & qui est ajouté dans mon modèle.

<td>Launch C&O</td> 

Je ne sais pas exactement comment résoudre cette erreur, est-il une erreur de codage? Dois-je spécifier un mode d'encodage lorsque je crée le PDF?

C'est le code qui crée un 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; 
       } 
} 

Si vous avez un conseil, je suis heureux de le lire! :)

+2

Remplacez '' et avec '' & et de voir ce qui se passe. –

+0

Il n'a rien changé, merci pour votre but :) –

+0

Exécutez votre HTML via le validateur W3C sur https://validator.w3.org/check et cochez * Nettoyer balisage avec HTML-Tidy *. Comparez avec votre HTML original. Essayez à nouveau avec le code HTML nettoyé en bas de la page. Vous pouvez automatiser ceci dans votre propre code avec * JTidy *. –

Répondre

0

Essayez avec la logique ci-dessous

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

Avec, xmlworker 5.5.12 et 5.5.12 itextpdf Version

+0

Comme déjà indiqué dans les commentaires à la question, le problème a été causé par XML non valide; votre code n'aurait pas aidé. – mkl