【问题标题】:Flying Saucer - ITextRenderer createPdf extremely slow飞碟 - ITextRenderer createPdf 非常慢
【发布时间】:2012-06-20 12:32:09
【问题描述】:

我正在尝试使用 iText 和飞碟从 Html 生成 PDF。我使用了 SO 上建议的不同技术来快速启用DocumentBuilder parse

但是,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();
}

【问题讨论】:

  • 这个问题的答案可能会有所帮助:link
  • 就我而言,加载更多 css(例如:bootstrap.css)和图像导致 layout() 任务变慢。
  • 你找到解决办法了吗?

标签: java pdf html-parsing flying-saucer


【解决方案1】:

我遇到了同样的问题,PDF 创建速度很慢,<IMG src="http:..."> 没有解决。

这是因为没有使用HTTP代理,我猜有很多“http://”超时。

在我的情况下,修复是

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

【讨论】:

  • 感谢您的建议。但是,我没有图像(或任何其他必须从网络外部获取的资源)。
【解决方案2】:

这可能只是一个缓冲问题。如果您还没有这样做,请尝试使用 BufferedOutputStream 包装输出流并将其用作 createPdf 参数。

【讨论】:

  • BufferedOutputStream 对我帮助不大。我已将代码添加到问题中。
  • 我没有任何其他建议......除了“profile it”。
【解决方案3】:

下面的部分应该可以解决它。

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

【讨论】:

    【解决方案4】:

    我在使用 ITextRenderer 时遇到了类似的问题,当我修复了 createReplacedElement 方法以查找图像等其他资源时,问题得到了缓解。

    createReplacedElement 方法是接口 ReplacedElementFactory 的一部分。

    我在创建项目时使用此页面作为基础,您可以在那里阅读有关 createReplacedElement 的信息:https://www.baeldung.com/java-html-to-pdf

    【讨论】:

      猜你喜欢
      • 2011-06-14
      • 2013-07-30
      • 1970-01-01
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 2013-05-24
      相关资源
      最近更新 更多