Apache FOP可用于将仲裁HTML转换为PDF吗?

时间:2017-01-18 20:01:51

标签: html pdf apache-fop

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

适用于简单的html文件。

对带有样式的html文件(通过嵌入式css或样式属性)起作用。创建PDF但完全未格式化。我试图转换HTML文件,我无法控制样式/内容。

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

目前,我确实有一个使用flyingsaucer的工作实现。但是,该要求要求在没有AGPL许可的情况下实施。

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

感谢任何帮助

1 个答案:

答案 0 :(得分:2)

tl; dr版本:

在最常见的情况下,没有,您无法使用FOP转换任何 html,保留原始样式(并且更改格式化程序无法解决问题)。

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

为什么它不能正常工作

  

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

您对必要的转型链的描述是现场的。

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

  

我使用了Antenna House的xhtml2fo.xsl作为xhtml - > XSL-FO转换   [...]

     

创建PDF但完全未格式化

您使用的样式表是this one from the AntennaHouse site吗?

从快速看,似乎应该转换{F}输出中产生单独属性的style="..."属性,但它不会处理外部CSS文件

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

  

这可以通过FOP实现吗?

如果确实如此,格式化程序除使用默认值外无法执行任何操作,其中一些(font-family会出现)与应用程序相关。

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

你需要什么是一个“合并”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开发人员,但现在不是很活跃。