2012-06-20 42 views
0

我正尝试使用iText和Flying Saucer从Html生成PDF。我已经使用了SO上建议的不同技术来快速解析 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

除了“描述它”,我没有任何其他建议。 –

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; 
    } 
}