【问题标题】:XSL-FO Different header/footer depending on page-positionXSL-FO 根据页面位置不同的页眉/页脚
【发布时间】:2015-04-06 16:00:57
【问题描述】:

这可能是 XSL-FO 的一个很常见的问题:我尝试建立一个具有明确规范的帐单:

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

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

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

  3. “Last-Page Footer”:就在课程的最后一页(总金额和签名)

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

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

所以我知道有些点可以通过使用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. 如果第一页是最后一页(只有一页),则不会出现最后一页页脚。知道页面位置可以具有“仅”值,因此也可以为此设置静态内容。但是我仍然会有两个相同内容的块,每当我想编辑这部分时,我都必须更改两次。
  2. 主要标题通常可以由一个区域之前设置,并引用 page-position="any"(这是标准),但不知何故这对我不起作用。我只是在不是第一页或最后一页的页面上获取页眉。这实际上不应该是 page-position="rest" 所需的功能吗?

【问题讨论】:

  • @Jean-FrançoisSavard,我不认为这是您链接的问题的重复:这个问题是关于根据序列中的页面位置不同的(静态)页眉/页脚(首先,中间,最后),链接的是关于页眉/页脚的动态内容,具体取决于页面正文中的内容。

标签: xslt xsl-fo apache-fop


【解决方案1】:

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

其中几个值可以同时为真;例如,“任何” 当 'first' 和 'last' 都为真时,总是为真且 'only' 为真 真的。因此,有必要订购 fo:conditional-page-master-references 以便包含最少的测试 在更具包容性的测试之前执行,这也是正确的。

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

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

所以,看看你的问题:

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

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

知道 page-position 的值可以是“only”,这是一种可能 也将为此设置一个静态内容。但我还是会 两个相同内容的块,每当我想编辑它时 部分,我将不得不更改它两次。

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

2.主标题通常可以由一个区域之前设置 参考 page-position="any" (这是标准),但不知何故 这对我不起作用。我只是在页面上获取标题 不是第一个或最后一个。这实际上不应该是所需的功能吗 page-position="rest"?

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

编辑:完整示例

这是一个示例,它使用fo:markers 显示不同的页面几何形状仅适用于/first/rest/any 页面和根据页面位置的不同页眉/页脚fo:retrieve-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>

【讨论】:

    猜你喜欢
    • 2012-07-28
    • 1970-01-01
    • 2014-01-06
    • 2021-02-28
    • 2021-09-19
    • 2021-05-07
    • 1970-01-01
    • 2015-12-18
    • 2013-07-18
    相关资源
    最近更新 更多