You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 22:36:04