我正在尝试使用iText和Flying Saucer从Html生成PDF。我使用了SO上建议的不同技术来快速启用DocumentBuilder
解析。
然而,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 :(得分:2)
我遇到了同样的问题,PDF创建速度非常慢,<IMG src="http:...">
未得到解决。
这是因为没有使用HTTP代理,我猜有很多“http://”超时。
在我的情况下,修复是
System.setProperty("java.net.useSystemProxies", "true");
答案 1 :(得分:0)
这可能只是一个缓冲问题。如果您还没有这样做,请尝试使用BufferedOutputStream
包装输出流并将其用作createPdf
参数。
答案 2 :(得分: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;
}
}