【问题标题】:XLSFO: floating images, full-page imagesXLSFO:浮动图片、整页图片
【发布时间】:2020-09-03 18:44:25
【问题描述】:

我正在使用 Apache fop 从描述抽象内容的 XML 文件(我生成它,因此我可以控制它)和包含格式的 XSL 文件生成 PDF 书籍。应该使用各种 XSL 文件来生成各种 PDF(手稿、平装本等)。

我想在书的文本中包含图像,其中一些应该是靠近文本中某个点的整页图像,还有一些是内联的(在段落之间居中)。

内容 XML 应该包含像 <fullpageimg path="img/000_cover.png"><inlineimg path="img/001_face.png"> 这样的元素。整页图像前后的 XML 中的文本应不间断地继续,图像应仅出现在靠近该位置的自己的页面上。

我用于内嵌图像的模板很简单,看起来像这样:

  <xsl:template match="inlineimg">
    <fo:block text-align="center">
      <fo:external-graphic>
        <xsl:attribute name="src">
          <xsl:value-of select="@path"/>
        </xsl:attribute>
      </fo:external-graphic>
    </fo:block>
  </xsl:template>

这也可以按预期工作。图像按应有的方式显示为它们自己的段落。

整页图片,但是,我不知道如何制作。我从几个教程和示例集合中尝试了几件事,例如

  <xsl:template match="fullpageimg">
    <fo:block text-align="center">
    <fo:float float="left">
    <fo:block text-align="center">
      <fo:external-graphic>
        <xsl:attribute name="content-width">
          <xsl:value-of select="@width"/>
        </xsl:attribute>
        <xsl:attribute name="src">
          <xsl:value-of select="@path"/>
        </xsl:attribute>
      </fo:external-graphic>
    </fo:block>
    </fo:float>
    </fo:block>
  </xsl:template>

这让所有整页图像在 PDF 的第一页(也是意外)上彼此重叠(意外)出现,而不会使文本在其周围浮动(也是意外),因此文本也会通过图像(当然意外)。

我还尝试将它的一部分包含在如下元素中:

  <fo:block-container absolute-position="absolute" width="214mm" height="301mm">
    <fo:block-container overflow="error-if-overflow" width="214mm" height="301mm">
      ...
    </fo:block-container>
  </fo:block-container>

但这也不会产生我正在寻找的结果(结果会有所不同,取决于我在哪里插入这些,fop 通常也会抱怨输入错误)。

我的 XSL 的主模板如下所示:

  <xsl:template match="/doc">
    <fo:root>
      <fo:layout-master-set>
        <fo:simple-page-master ...>
          ...
        </fo:simple-page-master>
        <fo:page-sequence-master master-name="document">
          ...
        </fo:page-sequence-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="document">
        ...
        <fo:flow ...>
          <xsl:apply-templates/>
        </fo:flow>
      </fo:page-sequence>
    </fo:root>
  </xsl:template>

如果需要更多信息,我当然可以提供。

这样做的正确方法是什么?是否可能需要更改主模板?我正在使用fop 2.4,如果只给出简单的东西,例如float="left",它应该能够正确处理fo:float

【问题讨论】:

    标签: xml xslt layout xsl-fo apache-fop


    【解决方案1】:

    如果你想让浮动远离当前块并让文本在它周围关闭,你需要float="before"。 (参见https://www.w3.org/TR/xsl11/#fo_float)格式化程序可以将带有float="before" 的浮点数浮动到当前区域的顶部或下一页上的相同区域。

    我现在找不到具体信息(指向 FOP 的“知道问题”页面的链接无法解决),我不记得 FOP 对fo:float 的“部分”支持是支持还是不支持不支持float="before"。 (https://xmlgraphics.apache.org/fop/compliance.html 的合规页面说 float 属性不受支持,但我不知道如果 fo:float 有部分支持,这怎么可能。)

    此外,当您将浮动放在单独的 fo:block 中时,当浮动浮动到其他地方时,您将留下一个空块(看起来像换行符)。

    【讨论】:

    • 谢谢,但正如你在我的 Q 中看到的那样,我也在盲目地寻找应用 &lt;fo:float&gt; 元素的位置和方式。目前我正在尝试很多废话(在额外的&lt;fo:block&gt;&lt;fo:block-container&gt; 等中,并在&lt;fo:float&gt; 中添加额外的此类元素in)希望任何事情都会起作用并产生想要的结果。我很乐意摆脱废话,因此,如果您能提供有关如何在我的情况下正确应用 &lt;fo:float&gt; 的信息,我将不胜感激。
    • 在我的Q中发布的当前版本,您的提案没有影响(但这可能是因为fop&lt;fo:float&gt;的支持太有限了)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2015-07-18
    • 1970-01-01
    相关资源
    最近更新 更多