如何在区域主体的底部定位块

时间:2014-04-03 10:37:11

标签: xsl-fo

我正在生成发票PDF,我希望 block ,增值税摘要位于region-body的底部

我读了(几乎)所有的ibex和更一般的xsl-fo文档,我得到的最接近的是学习如何在页面中绝对定位元素;

但这不符合我的需要,因为我可能有很多可变大小的行,而绝对定位的元素可能会与行重叠。

我正在使用ibex xsl-fo发电机。

编辑:一些示例代码

可以找到完整的xsl-fo代码here

我在下面放了一些示例代码,这样就不必看到原来的xsl-fo有1200行了。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <xsl:template match="/root">
        <fo:table>
            <fo:table-body>
                <fo:table-row>
                    <fo:table-cell>
                        <fo:block>
                            <xsl:value-of select="'I am up here'"/>
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
                <!-- I'd like this table-row to be bottom aligned -->
                <fo:table-row>
                    <fo:table-cell>
                        <fo:block>
                            <xsl:value-of select="'I would like to be at the bottom of the region body'"/>
                        </fo:block>
                    </fo:table-cell>
                </fo:table-row>
            </fo:table-body>
        </fo:table>
    <xsl:template
</xsl:stylesheet>

3 个答案:

答案 0 :(得分:4)

在XSL FO中执行此操作的唯一方法是使用最后一页的页面模板,并将该内容放在region-after中。没有结构产生“橡皮带”效果将内容推到底部,浮子=“底部”也不存在(如果它不合适,它无论如何都不会起作用,它会漂浮到底部第二页。你会从我做过的另一个项目中使用这样的东西。

 <fo:layout-master-set>
    <!-- ============== simple-page-master ============ -->
    <fo:simple-page-master master-name="simple-page-master.only" page-height="792pt" page-width="612pt">
      <fo:region-body margin-top="4.15in" margin-right="0.25in" margin-bottom="2.6in" margin-left="0.25in" />
      <fo:region-before extent="792pt" region-name="region-before.only"/>
    </fo:simple-page-master>
    <!-- ============== simple-page-master ============ -->
    <fo:simple-page-master master-name="simple-page-master.first" page-height="792pt" page-width="612pt">
      <fo:region-body margin-top="4.15in" margin-right="0.25in" margin-bottom="2.6in" margin-left="0.25in" />
      <fo:region-before extent="792pt" region-name="region-before.first"/>
    </fo:simple-page-master>
    <!-- ============== simple-page-master ============ -->
    <fo:simple-page-master master-name="simple-page-master.rest" page-height="792pt" page-width="612pt">
      <fo:region-body margin-top="0.8in" margin-right="0.25in" margin-bottom="0.64in" margin-left="0.25in" />
      <fo:region-before extent="792pt" region-name="region-before.rest"/>
    </fo:simple-page-master>
    <!-- ============== simple-page-master ============ -->
    <fo:simple-page-master master-name="simple-page-master.last" page-height="792pt" page-width="612pt">
      <fo:region-body margin-top="0.8in" margin-right="0.25in" margin-bottom="2.58in" margin-left="0.25in" />
      <fo:region-before extent="792pt" region-name="region-before.last"/>
    </fo:simple-page-master>
    <!-- ============== page-sequence-master ============ -->
  <fo:page-sequence-master master-name="page-sequence-master">
       <fo:repeatable-page-master-alternatives maximum-repeats="no-limit">
        <fo:conditional-page-master-reference master-reference="simple-page-master.last" blank-or-not-blank="blank" />
         <fo:conditional-page-master-reference master-reference="simple-page-master.only" page-position="only" />
        <fo:conditional-page-master-reference master-reference="simple-page-master.first" page-position="first" />
        <fo:conditional-page-master-reference master-reference="simple-page-master.last" page-position="last" />
        <fo:conditional-page-master-reference master-reference="simple-page-master.rest" page-position="rest" />
       </fo:repeatable-page-master-alternatives> 
  </fo:page-sequence-master>
  </fo:layout-master-set>

这为第一页,休息页,最后一页和唯一一页(首先是最后一页)创建模板。然后,将页面底部所需的内容输出到相应的区域(region-before.only和region-before.last)。

唯一的警告/技巧是,如果您选择不同大小的页面布局以容纳底部所需的信息,那么您应该确保表格内部的最后几行保持在一起以拉出几个那些行到第二页。

答案 1 :(得分:1)

您可以在最后一个表格行中使用fo:footnote(请参阅https://www.w3.org/TR/xsl11/#fo_footnote),也可以在表格之后立即使用fo:inline

如果您使用空fo:region-body作为脚注标记,则fo:table中不会显示任何标记,您可以在fo:footnote-body中为增值税摘要添加@XmlAccessorType(XmlAccessType.FIELD) @XmlType(name = "", propOrder = { "name", "age" }) @XmlRootElement(name = "STUDENT") public class STUDENT { //.... sample student class } }。

答案 2 :(得分:0)

我认为脚注是一个很好的解决方案,正如@Tony在上面的回复中所说。 对我而言,此解决方案有效:

是的,对我来说,这段代码有效。

<fo:block>
    <fo:footnote>
        <fo:inline/>
        <fo:footnote-body>
            <fo:block keep-together.within-column="always">
                <fo:inline>
                    <xsl:text>Here is the text at the bottom</xsl:text>
                </fo:inline>
            </fo:block>
        </fo:footnote-body>
    </fo:footnote>
</fo:block>