Apache FOP 2.6生成多页PDF的XSLT:FO layout-master-set布局咨询
Apache FOP 2.6 多模块分页通用layout-master-set布局方案
核心设计思路
- 拆分原有的2个基础页面模板为4个,分别匹配箱子列表首页、箱子列表续页、单箱物品详情首页、单箱物品详情续页的不同内容容量要求
- 所有页面的页眉统一提取复用,无需在每个模板重复定义
- 新增
page-sequence-master绑定同模块下的页面流转规则,无需手动硬编码每页的模板引用
完整layout-master-set结构示例
<fo:layout-master-set> <!-- 全局边距/高度参数,可按需调整 --> <xsl:param name="header-height" select="15mm"/> <xsl:param name="margin-top" select="20mm"/> <xsl:param name="margin-bottom" select="15mm"/> <xsl:param name="margin-left" select="20mm"/> <xsl:param name="margin-right" select="20mm"/> <!-- 1. 箱子列表首页模板:顶部预留统计信息展示区 --> <fo:simple-page-master master-name="Boxes-First" page-height="297mm" page-width="210mm"> <fo:region-body margin-top="{$margin-top}" margin-bottom="{$margin-bottom}" margin-left="{$margin-left}" margin-right="{$margin-right}"/> <fo:region-before extent="{$header-height}" region-name="common-header"/> <fo:region-after extent="10mm" region-name="page-footer"/> </fo:simple-page-master> <!-- 2. 箱子列表续页模板:无顶部统计区,可容纳更多箱子行 --> <fo:simple-page-master master-name="Boxes-Rest" page-height="297mm" page-width="210mm"> <fo:region-body margin-top="{$margin-top}" margin-bottom="{$margin-bottom}" margin-left="{$margin-left}" margin-right="{$margin-right}"/> <fo:region-before extent="{$header-height}" region-name="common-header"/> <fo:region-after extent="10mm" region-name="page-footer"/> </fo:simple-page-master> <!-- 3. 单箱物品详情首页模板:顶部预留箱子基础信息展示区 --> <fo:simple-page-master master-name="Items-First" page-height="297mm" page-width="210mm"> <fo:region-body margin-top="{$margin-top}" margin-bottom="{$margin-bottom}" margin-left="{$margin-left}" margin-right="{$margin-right}"/> <fo:region-before extent="{$header-height}" region-name="common-header"/> <fo:region-after extent="10mm" region-name="page-footer"/> </fo:simple-page-master> <!-- 4. 单箱物品详情续页模板:无顶部箱子信息区,可容纳更多物品行 --> <fo:simple-page-master master-name="Items-Rest" page-height="297mm" page-width="210mm"> <fo:region-body margin-top="{$margin-top}" margin-bottom="{$margin-bottom}" margin-left="{$margin-left}" margin-right="{$margin-right}"/> <fo:region-before extent="{$header-height}" region-name="common-header"/> <fo:region-after extent="10mm" region-name="page-footer"/> </fo:simple-page-master> <!-- 箱子列表页面流转规则:首页用Boxes-First,后续页自动用Boxes-Rest --> <fo:page-sequence-master master-name="Boxes-Sequence"> <fo:repeatable-page-master-alternatives> <fo:conditional-page-master-reference master-reference="Boxes-First" page-position="first"/> <fo:conditional-page-master-reference master-reference="Boxes-Rest" page-position="rest"/> </fo:repeatable-page-master-alternatives> </fo:page-sequence-master> <!-- 物品详情页面流转规则:每个箱子的首页用Items-First,同箱后续页自动用Items-Rest --> <fo:page-sequence-master master-name="Items-Sequence"> <fo:repeatable-page-master-alternatives> <fo:conditional-page-master-reference master-reference="Items-First" page-position="first"/> <fo:conditional-page-master-reference master-reference="Items-Rest" page-position="rest"/> </fo:repeatable-page-master-alternatives> </fo:page-sequence-master> </fo:layout-master-set>
适配说明
- 所有页面共用的页眉统一在
fo:static-content对应common-header的节点中定义一次即可,全局生效 - 每个箱子的物品详情单独开启一个
fo:page-sequence,指定master-reference="Items-Sequence",即可自动实现单箱首页、续页的模板切换 - 配合后端传入的索引参数,在对应阈值行的
fo:table-row添加break-before="page"即可触发分页,FOP会自动匹配当前序列对应的续页模板 - 物品表格续页重复表头只需给
fo:table添加table-omit-header-at-break="false"属性即可实现
内容的提问来源于stack exchange,提问作者Alex Dumitrescu
相关产品推荐
相关产品推荐

