2015-02-06 105 views
2

这可能是使用XSL-FO一个相当普遍的问题:我尝试建立具有明确规范计费:XSL-FO不同的页眉/页脚根据页面位置

  1. “主头”:上每一页(文字,标志和条形码)
  2. “子头”:(客户数据)

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

    的约10% - >打开所有其他页面此块应该是关于th Ë一半,因此,可以说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. 如果第一页是最后的(只有一个页面),最后一个页面页脚将不会出现。知道页面位置可以具有“唯一”的值,可能也会为此设置静态内容。但是我仍然会有两块相同的内容,每当我想编辑这个部分时,我都必须改变它两次。
  2. 主标题通常可以通过一个区域设置 - 之前引用page-position =“any”(这是标准),但不知何故,这对我不起作用。我只是在不是第一个或最后一个页面的页眉。不应该这实际上是页面位置=“休息”所需的功能?
+0

@让FrançoisSavard,我不认为这是你链接的问题的重复:这个问题是关于不同(静态)页眉/页脚根据序列中的页面位置(第一,中,最后),链接的是关于具有动态内容的页眉/页脚,具体取决于页面内容。 – lfurini 2015-02-06 23:03:51

回答

5

page-position属性指出(强调)的定义的说明:

若干这些值可以同时是真实的;例如,'any' 总是如此,当'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"其中(我猜的,因为它是不是在这个问题)有一个区域,之后进入其中仅映射了“每页页脚”。

明知页面位置可以有“才”的价值,成为了可能, 将设置一个静态内容这一点,太。但我仍然会有 两块相同的内容,并且每当我想编辑这个 部分时,我都必须改变它两次。

您不必再重复两次相同的内容:你可以把它变成一个命名模板,并调用模板从两个静态内容里面。

2.主头通常可通过前区域被设置与 参考页面位置=“任何”(这是标准的),但不知何故 ,这将不适合我。我只是在 不是第一个或最后一个页面获得标题。不应该这实际上是所需的功能 of page-position =“rest”

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

编辑:完整FO例如

下面是示出了根据使用fo:markers页位置仅供/第一/休息/任何页面和不同页眉/页脚既不同页面几何一个例子和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>