这可能是XSL-FO的一个相当普遍的问题:我尝试构建一个具有明确规范的计费:
" Sub Header" :(客户数据)
- >在第一页上,这个块应该是页面高度的10%
- >在所有其他页面上,这个块应该是大约一半,所以我们说5%
" Last-Page Footer":当然在最后一页(总金额和签名)
"每页页脚":仅适用于打印日期
"正文":结算内容(每个职位)应自动流入所有页眉和页脚之间
所以我知道使用属性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>
我可以为每种情况定义区域,但遇到以下问题:
答案 0 :(得分:5)
page-position
属性定义中的注释表明(强调添加):
其中一些值可以同时为真;例如,'任何' 永远是真的,当'第一'和'最后'都是'时,'唯一'是真的 真正。出于这个原因,有必要订购 fo:conditional-page-master-references,以便进行最少的包含测试 在更具包容性的测试之前执行,这也是正确的。
换句话说,选择构建页面的conditional-page-master-reference
是条件评估为真的第一个,并且甚至不考虑以下引用。
要记住的另一个要点是条件(page-position
,odd-or-even
,blank-or-not-blank
)选择页面主页,而不是特定的静态内容。
所以,看看你的问题:
1。如果第一页是最后一页(仅一页),则是最后一页页脚 不会出现。
发生这种情况是因为适用于第一页和唯一页的第一个conditional-page-master-reference
在您的示例中是指向"masterNamePageFirst1"
的那个(我猜,因为它不在问题中)有一个region-after只有“每页页脚”的映射。
知道页面位置可以具有“仅”值,这是可能的 也是为此设置静态内容。但我仍然会 两个相同内容的块,每当我想编辑它时 部分,我将不得不改变它两次。
您不必重复两次相同的内容:您可以将其放入命名模板,并从两个静态内容中调用该模板。
2。主标题通常可以通过a之前的区域来设置 引用page-position =“any”(这是标准的),但不知何故 这对我不起作用。我只是在页面上得到标题 不是第一个或最后一个。这不应该是理想的功能 page-position =“rest”?
静态内容映射到某个区域:在第一页和最后一页的页面母版中检查该区域是否实际存在。
编辑:完成示例
这是一个示例,根据页面位置显示不同页面几何仅用于/ first / rest /任何页面不同的页眉/页脚 {{3 }和fo: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>