1

我正在尝试将一个简单的 HTML 页面转换为 XSL-FO,以输入 Apache FOP 以进行 PDF 渲染。步骤是:HTML+CSS -> XHTML -> XSL-FO -> PDF。

我使用 java 库CSSToXSLFO将 XHTML 转换为 XSL-FO。这可行,但是它无法处理嵌入的图像。

有什么工具可以改造

<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>hello</title>
  </head>
  <body>
    <h1 style="color: green">Hello world!</h1>
    <img src="data:image/png;base64,iVBORw...=" />
  </body>
</html>

进入

    <fo:flow flow-name="xsl-region-body">
      <fo:block>
        <fo:block color="green">Hello world!</fo:block>
        <fo:external-graphic src="url(data:image/png;base64,iVBORw...=)" content-height="scale-to-fit" content-width="scale-to-fit" scaling="uniform"/>
      </fo:block>
    </fo:flow>

?

4

1 回答 1

0

如果 FOP 处理器支持数据 URI,fo:external-graphic您当然可以使用 XSLT 将 XHTML 转换为 XSL-FO,例如

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:fo="http://www.w3.org/1999/XSL/Format"
    xpath-default-namespace="http://www.w3.org/1999/xhtml"
    exclude-result-prefixes="#all"
    version="3.0">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="/">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
        <fo:layout-master-set>
            <fo:simple-page-master master-name="sample">
                <fo:region-body/>
            </fo:simple-page-master>
        </fo:layout-master-set>
        <fo:page-sequence master-reference="sample">
            <xsl:apply-templates select="html/body"/>
        </fo:page-sequence>
    </fo:root>
  </xsl:template>
  
  <xsl:template match="body">
      <fo:flow flow-name="xsl-region-body">
          <fo:block>
              <xsl:apply-templates/>
          </fo:block>
      </fo:flow>
  </xsl:template>
  
  <xsl:template match="h1">
      <fo:block>
          <xsl:apply-templates/>
      </fo:block>
  </xsl:template>
  
  <xsl:template match="img">
      <fo:external-graphic src="{@src}" content-height="scale-to-fit" content-width="scale-to-fit" scaling="uniform"/>    
  </xsl:template>
  
</xsl:stylesheet>

这是处理h1andimg元素的最小示例,我没有尝试将任何 HTML CSSstyle属性拼写为 XSL-FO 表示属性转换,但您当然可以使用 eg<xsl:apply-templates select="@*, node()"/>而不是<xsl:apply-templates/>然后添加模板以转换style="color: green"color="green". 由于 CSS 有自己的非 XML 语法,显然为任意样式属性编写完整的解析器是一项超出 StackOverflow 答案范围的艰巨任务。

我也不太确定 XSL-FO 中允许的 src 属性语法,FOP 似乎理解直接src="{@src}"就好了,但是当然,要创建您在问题中指出的格式,您也可以使用src="url({@src})".

于 2021-04-01T16:51:55.410 回答