gpt4 book ai didi

java - 有没有办法提高FlyingSaucer的性能?

转载 作者:行者123 更新时间:2023-12-02 07:56:46 24 4
gpt4 key购买 nike

我关注了this article使用 FlyingSaucer 将 XHTML 转换为 PDF,这很出色,但有一个重大缺点......速度慢得离谱!

我发现从 XHTML 渲染 PDF 需要 1 到 2 分钟,无论该页面多么简单。

基本代码:

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.lowagie.text.DocumentException;

public class FirstDoc {

public static void main(String[] args) throws IOException, DocumentException {

String inputFile = "firstdoc.xhtml";
String url = new File(inputFile).toURI().toURL().toString();
String outputFile = "firstdoc.pdf";
OutputStream os = new FileOutputStream(outputFile);

ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);

os.close();
}
}

示例 XHTML:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>My First Document</title>
<style type="text/css"> b { color: green; } </style>
</head>
<body>
<p>
<b>Greetings Earthlings!</b>
We've come for your Java.
</p>
</body>
</html>

有人知道如何提高FlyingSaucer的性能吗?

如果做不到这一点,是否有人能够推荐一个替代 Java 库,它可以有效地将 PDF 从 URL 渲染为具有外部 CSS 和从 URL 生成的图像的 (X)HTML 文档?

最佳答案

我和艾德面临着同样的问题。

遗憾的是,下一个方法不起作用 Java DocumentBuilder: xml parsing is very slow? by Marek Piechut完全适合我 - 我的 HTML 实体在途中丢失了。

DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
fac.setNamespaceAware(false);
fac.setValidating(false);
fac.setFeature("http://xml.org/sax/features/namespaces", false);
fac.setFeature("http://xml.org/sax/features/validation", false);
fac.setFeature("http://apache.org/xml/features/nonvalidating/load-dtd-grammar", false);
fac.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
DocumentBuilder builder = fac.newDocumentBuilder();

最后的技巧是这些行:

DocumentBuilderFactory fac = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = fac.newDocumentBuilder();
builder.setEntityResolver(FSEntityResolver.instance());

通过使用内置的 Java EntityResolver 来解析 DTD,速度大大加快。

关于java - 有没有办法提高FlyingSaucer的性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5431646/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com