2012-06-20 2 views
0

Я пытаюсь создать PDF из Html с помощью iText и Flying Saucer. Я использовал различные методы, предложенные для SO, чтобы включить DocumentBuilderразобрать быстро.Flying Saucer - ITextRenderer createPdf очень медленно

Однако ITextRenderer createPdf(outputstream) стал узким местом. Это очень медленно, и я не знаю, как улучшить скорость процесса.

Любая помощь была бы действительно оценена.

private Document getDocument(String htmlContent) throws Exception 
{ 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    //For faster document. 
    factory.setNamespaceAware(false); 
    factory.setValidating(false); 
    factory.setFeature("http://xml.org/sax/features/namespaces", false); 
    factory.setFeature("http://xml.org/sax/features/validation", false); 
    factory.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false); 
    factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); 
    DocumentBuilder builder = factory.newDocumentBuilder(); 
    builder.setEntityResolver(FSEntityResolver.instance()); 
    return builder.parse(new ByteArrayInputStream(htmlContent.getBytes())); 
} 

public void printHtmlToPdf(final String htmlContent, String tempFile, String title) throws Exception 
{ 
    Document document = getDocument(htmlContent); 
    ITextRenderer renderer = new ITextRenderer(); 
    renderer.setDocument(document, null); 
    BufferedOutputStream outputStream = new BufferedOutputStream(new FileOutputStream(tempFile)); 
    renderer.layout(); 
    renderer.createPDF(outputStream); 
    outputStream.close(); 
} 
+0

Ответы на этот вопрос может помочь: [ссылка] (http://stackoverflow.com/questions/5431646/is-there-any-way-improve-the-performance-of-flyingsaucer) – Edd

+0

В мой случай, загружая больше css (например: bootstrap.css) и образы, вызывающие задачу layout() медленнее. – YROjha

+0

Вы нашли решение? – s1moner3d

ответ

0

Это может быть просто проблема буферизации. Если вы еще этого не сделали, попробуйте обернуть выходной поток с помощью BufferedOutputStream и использовать это как аргумент createPdf.

+0

BufferedOutputStream не очень помог мне. Я добавил свой код к вопросу. –

+0

У меня нет других предложений ... кроме «profile it». –

1

У меня была та же проблема, создание PDF было очень медленным, и <IMG src="http:..."> не были разрешены.

Это потому, что прокси-сервер HTTP не использовался, и я думаю, что было много тайм-аутов «http: //».

В моей ситуации, исправление было

System.setProperty("java.net.useSystemProxies", "true"); 
+0

Спасибо за предложение. Однако у меня нет изображений (или любого другого ресурса, который должен быть извлечен извне из Интернета). –

0

Следующая часть должна решить.

package com.pdf.web; 

import com.lowagie.text.DocumentException; 
import java.io.*; 
import org.xhtmlrenderer.layout.SharedContext; 
import org.xhtmlrenderer.pdf.ITextRenderer; 
import org.xhtmlrenderer.resource.XMLResource; 
import org.xml.sax.InputSource; 

// Referenced classes of package com.pdf.web: 
//   PDFRender 

public class createPDF 
{ 

    public createPDF() 
    { 
    } 

    public createPDF(String url, String pdf) 
     throws IOException, DocumentException 
    { 
     OutputStream os; 
     os = null; 
     os = new FileOutputStream(pdf); 
     ITextRenderer renderer = new ITextRenderer(); 
     PDFRender.ResourceLoaderUserAgent callback = new PDFRender.ResourceLoaderUserAgent(renderer.getOutputDevice()); 
     callback.setSharedContext(renderer.getSharedContext()); 
     renderer.getSharedContext().setUserAgentCallback(callback); 
     org.w3c.dom.Document doc = XMLResource.load(new InputSource(url)).getDocument(); 
     renderer.setDocument(doc, url); 
     renderer.layout(); 
     renderer.createPDF(os); 
     os.close(); 
     os = null; 
     if(os != null) 
     { 
      try 
      { 
       os.close(); 
      } 
      catch(IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     break MISSING_BLOCK_LABEL_143; 
     Exception exception; 
     exception; 
     if(os != null) 
     { 
      try 
      { 
       os.close(); 
      } 
      catch(IOException e) 
      { 
       e.printStackTrace(); 
      } 
     } 
     throw exception; 
    } 
} 
Смежные вопросы