Apache FOP 可以用于将任意 HTML 转换为 PDF 吗?

2023-12-15

我尝试使用 Apache FOP 将 HTML 转换为 PDF。 (HTML --> XHTML --> XSL-FO --> PDF)。我使用 Antenna House 中的 xhtml2fo.xsl 进行 xhtml --> XSL-FO 转换。

它适用于简单的 html 文件。

It does not适用于带有样式的 html 文件(通过嵌入的 css 或通过 style 属性)。 PDF 已创建,但完全未格式化。我正在尝试转换 HTML 文件,但我对样式/内容没有太多控制权。

为每个 html 创建一个 xslt 在我的用例中是不切实际的。

目前,我确实有一个关于 Flyingsaucer 的有效实现。然而,该要求要求在没有 AGPL 许可证的情况下实施。

我的问题是:这可以通过 FOP 实现吗?

感谢任何帮助


TL;博士版本:

在最一般的情况下,no,不能使用FOP来转换anyhtml 保留原始样式(并且更改格式化程序无法解决问题)。

但是,您可以使用 FOP(或任何其他格式化程序)来尝试并相当好地处理大量 html 文档子集;这可能需要一些 XSLT 调整。


为什么它不能一般工作

HTML --> XHTML -->XSL-FO --> PDF

您对必要的转换链的描述是正确的。

然而,FOP只参与最后一步:除了尚未实现的功能外,最终的 PDF 文件应尊重 FO 文件中表达的印刷特征。

我使用 Antenna House 的 xhtml2fo.xsl 进行 xhtml --> XSL-FO 转换 [...]

PDF 已创建,但完全未格式化

是您正在使用的样式表这个来自 AntennaHouse 网站?

乍一看似乎是这样should转换style="..."属性在 FO 输出中产生单独的属性,但是它不处理外部 CSS 文件.

因此,使用外部 CSS 样式的 HTML 文件将转换为没有任何格式属性的 FO 文件(font-family, font-size, text-align, ...).

通过FOP可以实现这一点吗?

如果确实如此,格式化程序除了使用默认值,其中一些(font-family我想到的)是依赖于应用程序的。

因此,根据您使用的格式化程序,您将有一个slightly不同的结果,但仍然是“未格式化”的结果。

你需要什么是一种“合并”html 和 css 文件的工具,内联样式以便 XSLT 可以处理它们,或者是一个能够考虑外部 css 文件的不同样式表(但我怀疑编写一个样式表并不容易)在一般情况下工作)。

什么可以轻松解决

在处理 html 表时,链接的 XSLT 使用fo:table-and-caption元素,FOP 不支持该元素,因此表从输出中“消失”。

这可以通过 XSLT 中的一个小更改来解决,或者(可能是一种更简洁的解决方案)使用导入另一个样式表的自定义样式表:

<xsl:stylesheet version="1.0"
  xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
  xmlns:fo="http://www.w3.org/1999/XSL/Format"
  xmlns:html="http://www.w3.org/1999/xhtml">

  <xsl:include href="xhtml2fo.xsl"/>

  <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>

  <xsl:template match="html:table" priority="2">
    <fo:table xsl:use-attribute-sets="table">
      <!-- warning: table caption is not processed! -->
      <xsl:call-template name="process-table"/>
    </fo:table>
  </xsl:template>

</xsl:stylesheet>

您实际使用的样式表可能需要一些类似的调整才能更好地与 FOP 结合使用。

披露:我是一名 FOP 开发人员,尽管现在不太活跃。

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

Apache FOP 可以用于将任意 HTML 转换为 PDF 吗? 的相关文章

  • 如何使用 Spring Boot 传输音频

    我想让用户能够播放声音 我的实现在 Firefox 上运行良好 在 Safari 上 不播放声音 我验证了音频控制可以在 Safari 中与其他网站一起使用 所以 我认为我必须更改控制器中的某些内容 控制器 RequestMapping v
  • “序言中不允许有内容”错误,但 XML 声明之前没有任何内容

    首先我已经详尽地检查了以下问题 这个问题似乎不是同一件事 SAXParseException 序言中不允许有内容 https stackoverflow com q 20551572 1571426 org xml sax SAXParse
  • 如何将焦点设置在 BootStrap 中的第一个输入字段上? [复制]

    这个问题在这里已经有答案了 可能的重复 如何将焦点设置到独立于 id 的 HTML 表单中的第一个输入元素 https stackoverflow com questions 277544 how to set the focus to t
  • iPhone 上的锁定方向 UIWebView

    有没有办法锁定 UIWebView 的方向 使用 Obj C JS 还是 Html 我不想有按钮或任何东西 我只想在应用程序打开时将其锁定为纵向 好像这个堆栈溢出帖子 https stackoverflow com questions 43
  • 如何在 HTML 中将文本设置为粗体?

    我正在尝试使用 HTML 将一些文本加粗 但我很难让它发挥作用 这就是我正在尝试的 Some
  • 如何计算一行中Flexbox项目的数量?

    网格是使用 CSS flexbox 实现的 Example http jsbin com jumosicasi edit html css js output 本示例中的行数为 4 因为我出于演示目的固定了容器宽度 但是 实际上 它可以根据
  • 使文本背景透明但不使文本本身透明

    所以我遇到了问题 我环顾四周 但没有运气 我想让我的身体背景透明 但让文本不透明 就像现在一样 我继续使两者保持相同的不透明度 这是我的代码 charset utf 8 body font 100 1 4 Verdana Arial Hel
  • 将元数据添加到 PDF

    我需要将元数据添加到我正在创建的 PDF 中prawn http rubygems org gems prawn 该元数据稍后可能会被提取 pdf阅读器 http rubygems org gems pdf reader 该元数据将包含内部
  • 仅使用 HTML 正确填充电子邮件

    对于作业 我需要放置一个form在我的网页中 并让表单填充一封电子邮件供用户发送 我在四处搜寻后写下了这个
  • 在 th:href 链接中使用模型属性

    有没有办法在 th href 链接中引用模型属性 例如 a a Here 当前用户是控制器中指定的模型变量 这可以很容易地访问 如th text标签 但是 那th href百里香解析失败 如果有任何方法以这种方式引用模型属性 则在th hr
  • 如何强制网络浏览器不缓存图像

    背景 我正在为两个公益网站编写并使用一个非常简单的基于 CGI Perl 的内容管理工具 它为网站管理员提供了事件的 HTML 表单 他们可以在其中填写字段 日期 地点 标题 描述 链接等 并保存 在该表格上 我允许管理员上传与该活动相关的
  • 如何根据另一个动态下拉列表的值创建动态下拉列表?

    我有一个下拉菜单 当我选择一个选项时 它会创建一个动态下拉菜单 到目前为止 一切都很好 但我想创建另一个动态下拉列表 现在基于另一个动态下拉列表的值 我该怎么做 第一个动态下拉列表有效 我猜第二个无效 因为动态变量 div 没有静态 ID
  • html 抓取和 CSS 查询

    以下库的优点和缺点是什么 PHP 简单 HTML DOM 解析器 http simplehtmldom sourceforge net QP http querypath org phpQuery http code google com
  • 我什么时候应该使用内联和外部 Javascript?

    我想知道什么时候应该包含外部脚本或将它们与 html 代码内联编写 就性能和易于维护而言 这方面的一般做法是什么 真实场景 我有几个需要客户端表单验证的 html 页面 为此 我使用了一个包含在所有这些页面上的 jQuery 插件 但问题是
  • 按钮导致页面重新加载

    我在我的页面上使用 html 和 jquery 在我的 html 中 我有一个按钮 单击该按钮将触发一个功能 当页面加载时 我调用文档准备中的主函数 这是我的代码 div div
  • onClick 事件适用于触摸屏设备上的触摸吗?

    我用过onclick我的网站上的活动 但是 当我在谷歌浏览器的开发人员模式移动视图中打开它时 触摸使用鼠标单击的元素没有任何反应 所以我的问题是 我还必须添加吗ontouch事件连同onclick事件或 onClick 事件适用于所有触摸屏
  • Modernizr 未将类应用于 html 标签

    我目前正在构建一个网站 我需要使用 Modernizr 但由于某种原因 它没有将类应用到 html 标签 因为它应该 我的代码如下所示
  • Antd select 元素:如何禁用输入?

    我正在尝试使用模式 multiple 的选择元素 我希望禁用输入 这意味着用户只能在现有选项之间进行选择 而不能输入文本 我该怎么做呢 我的元素 import Select from antd import antd dist antd c
  • 手机上的网页滚动条可以隐藏吗?

    我正在尝试在移动设备上隐藏滚动条 一切在桌面上看起来都很好 没有滚动条 但是当我检查某些 Android 设备 ipad 时 我仍然可以看到灰色 细小的拇指 可以从浏览器中隐藏预定义的滚动条 我的代码 在桌面上运行良好 body webki
  • Bootstrap - 为反向行模式创建移动自适应

    我想用 Bootstrap 创建一个反向效果 第一行 左边是文字 右边是图像 第二行 左边是图片 右边是文字 第三行 左边是文字 右边是图片 第四行 左边是图片 右边是文字 而且这种情况一直持续下去 它在大型设备上看起来非常漂亮 但当它在设

随机推荐

  • 与 Surefire 并行运行测试并使用 TestNG Jenkins 插件正确显示它们

    我正在使用 Surefire 运行并行执行测试 一切似乎都工作正常 但是 在 target surefire reports 文件夹中只生成了一个 testng results xml 其中 仅包含最后运行的测试的结果 我发现了一个与旧版本
  • Cortana 技能不适用于 Windows 10 或 iOS

    我使用 Microsoft Bot Framework 添加了 Cortana 技能 我的召唤短语是 我的技能 当我尝试在 iOS 或 Windows 中与 Cortana 交谈时 它不会调用该技能 相反 它一直引导我访问 Bing 结果
  • PHP 函数使用 scrape 方法抓取远程站点上

    有人有一个 PHP 函数可以抓取远程站点上特定 DIV 内的所有链接吗 所以用法可能是 links grab links url divname 并返回一个我可以使用的数组 抓取链接我可以弄清楚但不知道如何让它只在特定的 div 内执行 谢
  • Visual Studio 中 KeyDown 事件、KeyPress 事件和 KeyUp 事件之间的区别

    谁能告诉我两者之间的区别KeyDown事件 KeyPress事件和KeyUp事件 我查了msdn网站 没有太多解释 谁能用简单的逻辑意义告诉我每个事件发生的时间 我感觉上述所有事件都是在按下某个键时发生的 那么它们之间的具体区别是什么呢 M
  • 以不同颜色显示 R 热图异常值

    希望用不同的颜色标记 R 矩阵中的异常值 假设我的数据为 1 2 4 2 5 5 4 3 2 3 1 500 5 4 2 现在我想用不同的颜色标记 500 用热图的默认颜色标记矩阵的其余部分 有人可以指导我完成整个过程吗 这是实现这一目标的
  • 如何在 javascript 和/或 css 中向下滚动时水平移动 div

    有谁知道我怎样才能获得像本网站底部那样的轮播效果https brand twitch tv 我使用了在 codepen 中找到的这个示例来了解本节的结构 但是当尝试使用垂直滚动将其添加到我的网站时 它不是像 twitch 网站中那样的连续滚
  • TypeScript 接口实现不检查方法参数

    interface IConverter convert value number string class Converter implements IConverter convert string no error return co
  • Heroku Node.js 应用程序“进程已退出,状态为 1”和错误 h10

    我将我的应用程序部署到 Heroku 上 没有任何问题 我能够跑heroku local web在 localhost 5000 上并且它有效 当我访问 web dyno 地址时 它说应用程序错误 我检查了该网站的日志 上面写着 2017
  • 使用 CGPoint 追踪长按手势的确切位置

    通过使用 CGPoint 位置 它始终保存 uiscrollview 中的最后一个图像 当我点击其他图像进行保存时 我该怎么做才能保存我点击的确切图像 UIScrollView imageScrollView UIScrollView al
  • Cypress 运行命令而无需重新运行测试

    只是想知道 假设我有一个已完成运行的冗长的柏树测试 有没有办法尝试新的 cypress 命令 比如 cy get tg tag should have css background color rgb 0 128 0 非常感谢 如果您的意思
  • IOS7:Pop ViewController 强制 UIImageView 掉落

    将我的项目升级到iOS7后 当我执行 后退 按钮并且 UINavigationController 返回到上一页时 屏幕顶部的 ImageView 会向下移动 我使用 IB 进行布局 这些是我的模拟指标 我有自动布局 关于问题可能是什么的任
  • Zend Framework 2:获取有序的 SQL 调用

    我一直在尝试获取一个字段的 ASC DESC 调用顺序 假设是 craeted 但我似乎不知道如何在 ZF2 中执行此操作 我哪里出错了 namespace Todo Model class TodoTable extends Abstra
  • MySQL:将多个文件加载到表中

    我一直在尝试将多个文件加载到表中 以便它们适合同一行 我可以单独插入它们 但问题出在NULL值 并且我计划加入此表 如果发生这种情况 我会得到太多NULL价值观 无用的数据 LOAD DATA LOCAL INFILE malefirst
  • SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败

    我正在使用 python 2 7 10 request urllib2 Request url data urllib urlencode params f urllib2 urlopen request 导致以下异常 urlopen er
  • 计算文件夹内的文件夹数量

    你能帮我看看如何计算文件夹内的文件夹数量吗 弹出FolderBrowserDialog 后如何计算子文件夹并选择由3 个文件夹组成的主文件夹 我在用着 FolderBrowserDialog fbdialog new FolderBrows
  • 使用 JNI 将 java 与 C 定时器库接口

    我正在尝试使这个简单的示例发挥作用 import java io public class Timer public static void main String args setTimer new Runnable public voi
  • 在树莓派中安装QtVirtualkeyboard?

    我尝试在 Raspberry pi 中实现 Qt Virtualkeyboard 使用PyQt5 显示虚拟键盘但我没有找到它的前缀路径 bin plugin等文件夹 实际上整个Qt文件夹不存在 In 我之前的解决方案我使用了官方提供的 Qt
  • 使用 PHP 作为守护进程是否明智?

    我希望创建一个后台进程 有人告诉我这些进程通常是用 C 或类似的东西编写的 我最近发现 PHP 可以用来创建守护进程 如果我应该以这种方式使用 PHP 我希望得到一些建议 这是我对守护进程的要求 不断检查一行是否已被 添加到 MySQL 数
  • R - 传单限制 - 传单地图支持多少个标记?

    Data 我有一个包含 35 000 个纬度 经度位置的数据框 这些地点已绘制在交互式传单地图上 情况 我想通过 Markdown 文档在线发布地图 问题 当我将地图导出为 html 页面或以 markdown 格式时 地图为 Laggy
  • Apache FOP 可以用于将任意 HTML 转换为 PDF 吗?

    我尝试使用 Apache FOP 将 HTML 转换为 PDF HTML gt XHTML gt XSL FO gt PDF 我使用 Antenna House 中的 xhtml2fo xsl 进行 xhtml gt XSL FO 转换 它