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 开发人员,尽管现在不太活跃。