【发布时间】: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