XSL-FO根据页面位置的不同页眉/页脚

时间:2015-02-06 13:35:34

标签: xslt xsl-fo apache-fop

这可能是XSL-FO的一个相当普遍的问题:我尝试构建一个具有明确规范的计费:

  1. "主标题":每页(文字,标识和条形码)
  2. " Sub Header" :(客户数据)

    - >在第一页上,这个块应该是页面高度的10%

    - >在所有其他页面上,这个块应该是大约一半,所以我们说5%

  3. " Last-Page Footer":当然在最后一页(总金额和签名)

  4. "每页页脚":仅适用于打印日期

  5. "正文":结算内容(每个职位)应自动流入所有页眉和页脚之间

  6. 所以我知道使用属性page-position:

    可以实现一些要点
    <fo:page-sequence-master master-name="masterSequenceName1">
    <fo:repeatable-page-master-alternatives>
      <fo:conditional-page-master-reference master-reference="masterNamePageFirst1" page-position="first"></fo:conditional-page-master-reference>
      <fo:conditional-page-master-reference master-reference="masterNamePageLast1"  page-position="last"></fo:conditional-page-master-reference>
      <fo:conditional-page-master-reference master-reference="masterNamePageAny"    page-position="any"></fo:conditional-page-master-reference>
    </fo:repeatable-page-master-alternatives>
    </fo:page-sequence-master>
    

    我可以为每种情况定义区域,但遇到以下问题:

    1. 如果第一页是最后一页(仅一页),则最后一页页脚不会出现。知道页面位置可以具有值&#34;仅#34;,可能的是为此设置静态内容。但是我仍然会有两个相同内容的块,每当我想编辑这个部分时,我都要改两次。
    2. 主标题通常可以通过区域设置 - 之前引用页面位置=&#34;任何&#34; (这是标准),但不知怎的,这对我来说不起作用。我只是在不是第一个或最后一页的页面上得到标题。不应该这实际上是页面位置所需的功能=&#34;休息&#34; ?

1 个答案:

答案 0 :(得分:5)

page-position属性定义中的注释表明(强调添加):

  

其中一些值可以同时为真;例如,'任何'   永远是真的,当'第一'和'最后'都是'时,'唯一'是真的   真正。出于这个原因,有必要订购   fo:conditional-page-master-references,以便进行最少的包含测试   在更具包容性的测试之前执行,这也是正确的。

换句话说,选择构建页面的conditional-page-master-reference条件评估为真的第一个,并且甚至不考虑以下引用。

要记住的另一个要点是条件(page-positionodd-or-evenblank-or-not-blank选择页面主页,而不是特定的静态内容

所以,看看你的问题:

  

1。如果第一页是最后一页(仅一页),则是最后一页页脚   不会出现。

发生这种情况是因为适用于第一页和唯一页的第一个conditional-page-master-reference在您的示例中是指向"masterNamePageFirst1"的那个(我猜,因为它不在问题中)有一个region-after只有“每页页脚”的映射。

  

知道页面位置可以具有“仅”值,这是可能的   也是为此设置静态内容。但我仍然会   两个相同内容的块,每当我想编辑它时   部分,我将不得不改变它两次。

您不必重复两次相同的内容:您可以将其放入命名模板,并从两个静态内容中调用该模板。

  

2。主标题通常可以通过a之前的区域来设置   引用page-position =“any”(这是标准的),但不知何故   这对我不起作用。我只是在页面上得到标题   不是第一个或最后一个。这不应该是理想的功能   page-position =“rest”

静态内容映射到某个区域:在第一页和最后一页的页面母版中检查该区域是否实际存在

编辑:完成示例

这是一个示例,根据页面位置显示不同页面几何仅用于/ first / rest /任何页面不同的页眉/页脚 {{3 }和fo:markers

我用FOP 1.1进行了测试,结果pdf应符合您的规格。

<?xml version="1.0" encoding="UTF-8"?>
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
    <fo:layout-master-set>
        <fo:simple-page-master master-name="singlePage" margin="1cm">
            <fo:region-body margin-top="5cm" margin-bottom="4cm" background-color="#FFFFAA"/>
            <fo:region-before extent="4cm" background-color="#AAFFFF"/>
            <fo:region-after extent="3cm" background-color="#FFAAFF" display-align="after"/>
        </fo:simple-page-master>
        <fo:simple-page-master master-name="firstPage" margin="1cm">
            <fo:region-body margin-top="5cm" margin-bottom="2cm" background-color="#FFFFAA"/>
            <fo:region-before extent="4cm" background-color="#AAFFFF"/>
            <fo:region-after extent="1cm" background-color="#FFAAFF" display-align="after"/>
        </fo:simple-page-master>
        <fo:simple-page-master master-name="middlePage" margin="1cm">
            <fo:region-body margin-top="2cm" margin-bottom="2cm" background-color="#FFFFAA"/>
            <fo:region-before extent="1cm" background-color="#AAFFFF"/>
            <fo:region-after extent="1cm" background-color="#FFAAFF" display-align="after"/>
        </fo:simple-page-master>
        <fo:simple-page-master master-name="lastPage" margin="1cm">
            <fo:region-body margin-top="2cm" margin-bottom="4cm" background-color="#FFFFAA"/>
            <fo:region-before extent="1cm" background-color="#AAFFFF"/>
            <fo:region-after extent="3cm" background-color="#FFAAFF" display-align="after"/>
        </fo:simple-page-master>
        <fo:page-sequence-master master-name="allPages">
            <fo:repeatable-page-master-alternatives>
                <fo:conditional-page-master-reference page-position="only" master-reference="singlePage"/>
                <fo:conditional-page-master-reference page-position="first" master-reference="firstPage"/>
                <fo:conditional-page-master-reference page-position="rest" master-reference="middlePage"/>
                <fo:conditional-page-master-reference page-position="last" master-reference="lastPage"/>
            </fo:repeatable-page-master-alternatives>
        </fo:page-sequence-master>
    </fo:layout-master-set>
    <fo:page-sequence master-reference="allPages">
        <!--
            header
        -->
        <fo:static-content flow-name="xsl-region-before" font-size="90%">
            <!-- main header on every page -->
            <fo:block>Text, logo, barcode</fo:block>
            <!-- sub header -->
            <fo:retrieve-marker retrieve-class-name="subHeader" retrieve-position="first-starting-within-page"/>
        </fo:static-content>
        <!--
            footer
        -->
        <fo:static-content flow-name="xsl-region-after" font-size="90%">
            <!-- special footer -->
            <fo:retrieve-marker retrieve-class-name="footer" retrieve-position="first-starting-within-page"/>
            <!-- common footer on every page -->
            <fo:block>printing date dd/mm/yyyy</fo:block>
        </fo:static-content>
        <!--
            document body
        -->
        <fo:flow flow-name="xsl-region-body">
            <!-- empty blocks with markers for the header -->
            <fo:block>
                <!-- sub header for the first page -->
                <fo:marker marker-class-name="subHeader">
                    <fo:block>LARGE SUB HEADER</fo:block>
                </fo:marker>
            </fo:block>
            <fo:block>
                <!-- sub header for the not-first pages -->
                <fo:marker marker-class-name="subHeader">
                    <fo:block>small sub header</fo:block>
                </fo:marker>
            </fo:block>
            <!-- normal content -->
            <!-- 
                YOUR REAL CONTENT GOES HERE 
                (I just put some blocks with page breaks to produce a few pages)
            -->
            <fo:block break-after="page">Long sequence with many pages ...</fo:block>
            <fo:block break-after="page">... bla bla bla ...</fo:block>
            <fo:block>... the end</fo:block>
            <!-- empty block with marker for the footer -->
            <fo:block>
                <!-- footer for the last page -->
                <fo:marker marker-class-name="footer">
                    <fo:block>TOTAL AMOUNT $$$ AND SIGNATURES</fo:block>
                </fo:marker>
            </fo:block>
       </fo:flow>
    </fo:page-sequence>
</fo:root>
相关问题