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

2023-12-04

我已经关注了本文使用 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解析很慢?作者:马雷克·皮耶丘特完全适合我 - 我的 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,速度大大加快。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有办法提高FlyingSaucer的性能? 的相关文章

随机推荐

  • 我应该在 JavaScript 中使用 window.navigate 还是 document.location?

    使用 JavaScript 更改当前网页位置的首选方法是什么 我见过 window navigate 和 document location 都被使用 行为上有什么差异吗 浏览器实现有差异吗 window location href URL
  • 活动如何在不扩展 AppCompatActivity 的情况下使用工具栏

    我有一个活动HomeView它已经扩展了另一个活动并且不能扩展AppCompatActivity 但HomeView需要有一个工具栏 Android 文档说任何需要工具栏的活动都必须扩展AppCompatActivity 我怎样才能绕过这个
  • 在 JavaScript 中比较字符串时,为什么一个字符串比另一个字符串大?

    我从一本书上看到这段代码 var a one var b four a gt b will return true 但它没有提到为什么 一 比 四 大 我试过c a 并且它比a和b小 我想知道 JavaScript 如何比较这些字符串 因为
  • 检查 Internet 和特定站点是否在 JavaScript/AJAX 中正常运行

    我有一个在我的设备上本地运行的页面 我想使用 AJAX 或普通 JavaScript 来检查设备是否已连接到互联网and如果某个特定站点已启动 此外 我试图弄清楚如何通过 AJAX 计算 RSS 提要中的条目数 但我以前从未围绕 RSS 进
  • 对数据库进行更改后如何保存DataSet?

    如果我有一个名为 myDs 的数据集 并且我通过在循环中直接访问来编辑其中的字段 如下所示 for int i 0 i lt myDS Tables TableName Rows Count i some function or web m
  • 核心数据在枚举时发生变异

    我在核心数据方面遇到了一个恼人的问题 我的应用程序需要从 iPhone 获取联系人并将其保存在我的数据库中 我正在尝试在后台线程中执行此操作 我使用上面的代码 self performSelectorInBackground selecto
  • Soundcloud API - 分别提取艺术家姓名和歌曲标题?

    查看 Soundcloud 文档 似乎您无法单独提取艺术家姓名和歌曲名称 或者我遗漏了什么 http developers soundcloud com docs api reference playlists IE 为了歌曲https s
  • VS2010总是重建解决方案?

    我有一个包含 40 个项目的解决方案 我最近将每个项目的输出路径重新配置为以下值 输出 对每个构建配置的 csproj 文件进行了更改 这一更改达到了预期目的 将所有已编译的程序集收集到一个文件夹中 但不寻常的副作用是 每次我点击 F5 调
  • 卡在比较器

    这是我的第一篇文章 这是针对 Java 7 的 有人可以告诉我为什么我无法访问 CompareIpaddress 类中的 first a 吗 我不知道为什么 SOF 不允许我发布这个 除非我输入更多的东西 这足够填充吗 谢谢 戈登 impo
  • 访问各种缓存和主内存的大致成本?

    谁能给我访问 L1 L2 和 L3 缓存以及 Intel i7 处理器上主内存的大致时间 以纳秒为单位 虽然这不是一个具体的编程问题 但了解这些类型的速度细节对于一些低延迟编程挑战是必要的 每个人都应该知道的数字 0 5 ns CPU L1
  • MySQL:如何将 varchar(255) UNIQUE 列更改为 UNIQUE Text NOT NULL?

    当前列是 VARCHAR 255 NOT NULL 那么如何将其更改为 TEXT NOT NULL 注意 要更改其属性类型的列是另一列的 UNIQUE KEY 组合 例如 唯一密钥 名称 描述 列描述当前采用 varchar 255 无法更
  • 如何使用 bash 替换 json 中的文本

    我正在尝试更换质量测试服务 by 测试服务在 JSON 文件中使用 bash 有人可以帮我吗 谢谢 JSON 文件 variables json variable qa test services default prod test 1 p
  • 使用 svlib 从 SystemVerilog 中的字符串中提取正则表达式匹配

    我是THE的新用户svlibSystemVerilog 环境中的封装 参考Verilab svlib 我有以下示例文本 PARAMATER lollg 1 SPEC ID 1G3HSB 1 我想使用正则表达式来提取1G3HSB从这段文字 我
  • 在 R 中使用 osmplotr 和 OpenStreetmap 绘制海域

    我正在尝试使用 Openstreetmap 通过osmplotrCRAN 上的软件包 绘制海岸线并将大海涂成蓝色 因为大海不是多边形 所以我尝试使用osm line2poly 将线条变成多边形 然而 下面的最小可重现示例给出了以下错误 Er
  • 使用 hbase 处理图像、视频和音频类型

    任何人都知道如何使用 Hbase 处理音频 视频和图像等非结构化数据 我尝试了很多 但没有任何想法 请提供任何帮助 选项1 将图像转换为字节数组 您可以准备放置请求并插入到表中 同样也可以实现音频和视频文件 See https docs o
  • C语言中的对象

    即使我浏览了一些 C 语言教程 笔记 我还是遇到了 对象 这个术语 我一直想知道对象与过程语言有什么关系 深入一点我可以理解 占用一块内存的东西在c中被称为 对象 我的问题是我的理解是否正确或者是否有我遗漏的东西 谢谢 来自C99标准草案
  • 如何存储/检索 RSA 公钥/私钥

    我想使用RSA公钥加密 存储或检索私钥和公钥的最佳方法是什么 XML 在这里是个好主意吗 如何获得钥匙 RSAParameters privateKey RSA ExportParameters true RSAParameters pub
  • ExpressJS:每 24 小时运行一次函数

    在 ExpressJS 中每 24 小时运行一次自动化函数的最简单方法是什么 除了运行无限循环之外 我到处寻找解决方案 原则上这是唯一的方法吗 你需要使用节点 cron npm var cron require node cron cron
  • 为什么 Ruby `**` 运算符的优先级高于一元 `-` ?

    这会导致这样的情况 1 0 5 gt 1 只有括号可以解决这个问题 1 0 5 gt 6 123031769111886e 17 1 0i 这比预期的要差1 i 但基本可以接受 在我去抱怨 Ruby bug 之前 我想知道是否有某种原因造成
  • 有没有办法提高FlyingSaucer的性能?

    我已经关注了本文使用 FlyingSaucer 将 XHTML 转换为 PDF 这很出色 但有一个重大缺点 速度慢得离谱 我发现从 XHTML 渲染 PDF 需要 1 到 2 分钟 无论该页面多么简单 基本代码 import java io