Edd*_*ddi 2 xslt xsl-fo apache-fop
这可能是XSL-FO的一个相当普遍的问题:我尝试构建一个具有明确规范的计费:
"子标题":(客户数据)
- >在第一页上,这个块应该是页面高度的10%左右
- >在所有其他页面上,这个块应该是大约一半,所以让我们说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>
Run Code Online (Sandbox Code Playgroud)
我可以为每个案例定义区域,但遇到以下问题:
该page-position物业定义中的注释指出(重点补充):
其中几个值可以同时为真; 例如,'any'始终为true,'only'为真,当'first'和'last'都为真时.出于这个原因,有必要对fo:conditional-page-master-references进行排序,以便在更具包容性的测试之前执行最不包含的测试,这也是正确的.
换句话说,conditional-page-master-reference选择构建页面的那个是第一个条件评估为真的页面,并且甚至没有考虑以下引用.
另外要记住很重要的一点是,条件(page-position,odd-or-even,blank-or-not-blank)选择一个页面主,而不是特定的静态内容.
那么,看看你的问题:
1.如果第一页是最后一页(仅一页),则不会显示最后一页页脚.
发生这种情况是因为conditional-page-master-reference在你的例子中,第一个适用于第一个和唯一一个页面的"masterNamePageFirst1"那个(我猜,因为它不在问题中)有一个区域 - 之后只有"每页页脚"是映射.
知道页面位置可以具有"仅"值,可能性也是为此设置静态内容.但是我仍然会有两个相同内容的块,每当我想编辑这个部分时,我都要改两次.
您不必重复两次相同的内容:您可以将其放入命名模板,并从两个静态内容中调用该模板.
2.主标题通常可以通过区域设置 - 之前引用page-position ="any"(这是标准),但不知何故,这对我不起作用.我只是在不是第一页或最后一页的页面上得到标题.这不应该是页面位置="休息"的理想功能吗?
静态内容映射到某个区域:检查该区域是否实际存在于第一页和最后一页的页面主页中.
编辑:完整的例子
这是一个示例,根据使用s和s 的页面位置,仅显示/ first/rest/any页面和不同页眉/页脚的不同页面几何.fo:markerfo:retrieve-marker
我用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>
Run Code Online (Sandbox Code Playgroud)