2016-08-17 17 views
0

Good Day,IText HTML to PDF memory leak

Я использую itext для преобразования HTML в PDF. Но когда он вызывает XMLWorkerHelper.getInstance().parseXHtml(writer, document, is);, он становится медленным, и когда я проверяю JVisualVM, кажется, что есть утечка памяти.

Вот мой код:

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(); 

Its работает на сервере Tomcat.

Вот HTML код:

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

 
</body> 
 
</html>

Спасибо заранее.

+1

Скорее всего не утечка памяти, а просто ситуация, в которой много используется память. Или у вас есть какие-либо признаки фактической утечки памяти * в отличие от использования памяти *. – mkl

+0

Можете ли вы дать некоторую статистику по использованию памяти? Насколько велик документ? Как 1-2 страницы А4 или больше, как несколько сотен? Включены ли фотографии? – Fildor

+0

@mkl Я думаю, что вы правы. когда я проверяю JavaVisualVM. размер кучи составляет 500 МБ, а XMLWorkerHelper.getInstance(). parseXHtml (writer, document, is); вызывает. размер кучи достигает максимального значения 2 ГБ. но используемая куча составляет всего около 500 МБ ниже. – Develofer

ответ

0

Для проектов Maven: Добавьте следующую зависимость в pom.xml файл вашего проекта:

<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

привет. нет параметра для PDFWriter в closeQuietly – Develofer

+0

Я ожидал, что это будет подкласс Writer, если это не автор.close() может быть вызван, наконец, если он не является нулевым. – user3325637

+0

Не закрытие 'document' - это не-go в iText 5.x. Пустые 'catch' -классы вообще. Вы вообще протестировали свой код? Это, как говорится, действительно хорошая идея закрыть свои потоки. – mkl