2016-08-17 4 views
0

Bonjour,IText Fuite de mémoire HTML vers PDF

J'utilise itext pour convertir du HTML en PDF. Mais quand il appelle le XMLWorkerHelper.getInstance().parseXHtml(writer, document, is); il devient lent et quand je vérifie JVisualVM, il semble qu'il y ait une fuite de mémoire.

Voici mon code:

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, baos);   
    document.open(); 
    InputStream is = new ByteArrayInputStream(content.getBytes()); 
    XMLWorkerHelper.getInstance().parseXHtml(writer, document, is); 

    document.close(); 
    return baos.toByteArray(); 

son fonctionnement sur le serveur Tomcat.

Voici le code html:

<!--?xml version="1.0" encoding="UTF-8"?--> 
 
<html> 
 
<head> 
 
    <title>Title</title> 
 
    
 
    
 
</head> 
 
    
 
<body> 
 
    
 
     
 
EXAMPLE 
 

 
</body> 
 
</html>

Merci à l'avance.

+1

pas Très probablement une fuite de mémoire, mais simplement une situation dans laquelle beaucoup la mémoire est utilisée. Ou avez-vous une indication d'une fuite de mémoire réelle * contrairement à la simple utilisation * de la mémoire *. – mkl

+0

Pouvez-vous donner quelques statistiques sur l'utilisation de la mémoire? Quelle est la taille du document? Comme 1-2 pages A4 ou plus comme plusieurs centaines? Les images sont-elles impliquées? – Fildor

+0

@mkl Je pense que vous avez raison. quand je vérifie le JavaVisualVM. la taille du tas est de 500 Mo et lorsque XMLWorkerHelper.getInstance(). parseXHtml (writer, document, is); invoque. la taille du tas atteint le maximum de 2 Go. mais le tas utilisé est seulement environ 500 Mo ci-dessous .. – Develofer

Répondre

0

Pour les projets Maven: Ajoutez la dépendance suivante à votre fichier pom.xml de projet:

<dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml</artifactId> 
     <version>3.14</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --> 
    <dependency> 
     <groupId>com.itextpdf</groupId> 
     <artifactId>itextpdf</artifactId> 
     <version>5.5.8</version> 
    </dependency> 

    <!-- https://mvnrepository.com/artifact/com.itextpdf.tool/xmlworker --> 
    <dependency> 
     <groupId>com.itextpdf.tool</groupId> 
     <artifactId>xmlworker</artifactId> 
     <version>5.5.8</version> 
    </dependency> 

import java.io.File; 
    import java.io.FileInputStream; 
    import java.io.FileOutputStream; 
    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.OutputStream; 

    import org.apache.poi.util.IOUtils; 

    import com.itextpdf.text.Document; 
    import com.itextpdf.text.DocumentException; 
    import com.itextpdf.text.pdf.PdfWriter; 
    import com.itextpdf.tool.xml.XMLWorkerHelper; 

    public class HtmlToPdf { 
     public static void main(String[] args) throws DocumentException, IOException { 
      File htmlFile = new File(args[0]); 
      String pdfFileName = "test.pdf"; 
      Document document = new Document(); 
      PdfWriter writer = null; 
      InputStream is = null; 
      OutputStream out = null; 
      if (htmlFile.exists()) { 
       try { 
        is = new FileInputStream(htmlFile); 
        out = new FileOutputStream(pdfFileName); 
        writer = PdfWriter.getInstance(document, out); 
        document.open(); 
        XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);    
        System.out.println("PDF Created!"); 
       } finally { 

        // close the document before before input stream (is) and writer closure     
        if(document != null && document.isOpen()) { 
         document.close(); 
        } 

        // no harm in closing writer here 
        if(writer != null) { 
         writer.close(); 
        } 
        IOUtils.closeQuietly(out); 
        IOUtils.closeQuietly(is); 
       } 
      } 
     } 
    } 
+0

salut. il n'y a pas de paramètre pour PDFWriter dans closeQuietly – Develofer

+0

Je m'attendais à ce que ce soit la sous-classe de Writer, Si ce n'est pas alors écrivain.close() peut être appelé finalement si ce n'est pas null. – user3325637

+0

La fermeture de 'document' n'est pas possible dans iText 5.x. Les clauses 'catch' vides sont en général. Avez-vous testé votre code du tout? Cela étant dit, c'est en effet une bonne idée de fermer ses flux. – mkl