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

B. *_*ham 5 html pdf apache-fop

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

它适用于简单的 html 文件。

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

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

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

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

感谢任何帮助

lfu*_*ini 3

TL;博士版本:

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

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


为什么它不能一般工作

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

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

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

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

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

您使用的样式表是AntennaHouse 网站上的样式表吗?

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

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

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

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

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

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

什么可以轻松解决

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

这可以通过 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>
Run Code Online (Sandbox Code Playgroud)

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

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