代码之家  ›  专栏  ›  技术社区  ›  Eddi

XSL-FO不同的页眉/页脚取决于页面位置

  •  3
  • Eddi  · 技术社区  · 11 年前

    这可能是XSL-FO的一个非常常见的问题:我试图构建一个具有明确规范的计费:

    1. “主标题”:每页(文本、徽标和条形码)
    2. “子标题”:(客户数据)

      ->在第一页上,此块应约为页面高度的10%

      ->在所有其他页面上,这个块应该大约小一半,所以假设5%

    3. “最后一页页脚”:仅在课程的最后一页(总额和签名)

    4. “每页页脚”:仅用于打印日期

    5. “正文”:账单内容(每个位置)应自动在所有页眉和页脚之间流动

    因此,我知道使用属性页面位置可以实现一些要点:

    <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. 如果第一页是最后一页(只有一页),则不会显示最后一页页脚。知道页面位置可以具有值“only”,也可以为此设置静态内容。但我仍然会有两个相同内容的块,每当我想编辑这部分时,我必须更改两次。
    2. 主标题通常可以由之前的区域设置,并引用page position=“any”(这是标准的),但不知何故,这对我不起作用。我只是在不是第一页或最后一页的页面上获取标题。这不应该是页面位置=“rest”的期望函数吗?
    1 回复  |  直到 11 年前
        1
  •  7
  •   lfurini    11 年前

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

    其中几个值可以同时为真;例如,“any” 当“first”和“last”都为true时,“only”始终为true 真的。因此, 有必要订购 fo:有条件的页面主控引用,以便进行包含最少的测试 在更具包容性的测试之前执行 这也是正确的。

    换句话说 conditional-page-master-reference 选择用于构建页面的是 第一个条件为真的 ,甚至没有考虑以下参考文献。

    另一个需要记住的重要点是( 页面位置 , odd-or-even , blank-or-not-blank ) 选择页面母版,而不是特定的静态内容 .

    所以,看看你的问题:

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

    这是因为第一个 条件页母版引用 在您的示例中,适用于第一页也是唯一一页的是指向 "masterNamePageFirst1" 该区域(我猜,因为这不是问题所在)有一个区域,之后只有“每一个页脚”被映射到该区域。

    知道页面位置可以具有值“only” 也将为此设置一个静态内容。但我还是会 两个相同内容的块,每当我想编辑这个 部分,我得换两次。

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

    2.主集管通常可以由之前的区域设置 引用页面位置=“any”(这是标准),但不知为何 这对我不起作用。我只是得到了页面的标题 不是第一个或最后一个。这不应该是我们想要的功能吗 第页位置=“rest” ?

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

    EDIT:完成示例

    下面是一个示例,显示了这两种情况 不同的页面几何形状 仅适用于/first/rest/任意页面和 根据页面位置不同的页眉/页脚 使用 fo:marker s fo:retrieve-marker s .

    我用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>