XSL-FO「块」(fo:block)最全实战手册
(2025 年写发票、报表、图书排版每天都在用的核心元素)
一句话记住:
XSL-FO 里 99% 的文字、段落、标题、间距、全都靠 <fo:block> 撑起来,它就是 FO 里的 <div> + <p> + <h1> 的超级合体。
1. 基本语法(最小可运行)
<fo:block font-size="14pt"
font-weight="bold"
text-align="center"
space-before="20mm"
space-after="10mm">
这是标题
</fo:block>
<fo:block font-size="12pt" line-height="1.8" text-indent="2em">
这是一段正文段落,第一行缩进 2 个中文字符。
</fo:block>
2. 2025 年最常用的 30 个 block 属性(直接复制表)
| 属性 | 常用值示例 | 说明(中文场景) |
|---|---|---|
| font-family | “SimSun”, “Heiti TC”, “Arial Unicode MS” | 中文必写,多个用逗号隔开 |
| font-size | 9pt, 10.5pt, 小四, 三号 | 小四=12pt,三号=16pt |
| font-weight | bold, 700 | 标题、表头常用 |
| color | #cc0000, red | 红色金额、负数 |
| text-align | left, center, right, justify | justify=两端对齐(中文报表最爱) |
| text-indent | 2em, 24pt | 段落首行缩进(中文必备) |
| line-height | 1.5, 180%, 20pt | 中文建议 1.8~2.0 |
| space-before / space-after | 12pt, 5mm | 段前段后间距(比 margin 更准) |
| start-indent / end-indent | 10mm | 整体左缩进、右缩进 |
| background-color | #f5f5f5 | 灰底标题条 |
| border | 1pt solid black | 四边框 |
| border-top/bottom/left/right | 0.5pt solid #ccc | 单边框 |
| padding | 4pt, 5mm 8mm | 内边距(表格单元格最常用) |
| keep-with-next.within-page | always | 本块和下一个块绝不分页(标题不孤行) |
| keep-with-previous.within-page | always | 不做孤行 |
| keep-together.within-page | always | 本块内部绝不分页(短表格、短段落) |
| break-before | page, column | 强制在此之前新起一页 |
| break-after | page | 强制在此之后新起一页 |
| margin-left / margin-right | 0mm | 配合 text-align 做居中更稳 |
| widows / orphans | 2 | 防止段落末尾/开头只剩 1-2 行(出版级) |
| id | “lastpage” | 给最后一个 block 加 id,页脚引用总页数用 |
3. 经典块组合(直接复制到项目里就能用)
<!-- 大标题 -->
<fo:block font-size="22pt" font-weight="bold" text-align="center"
space-before="30mm" space-after="20mm" keep-with-next="always">
增值税专用发票
</fo:block>
<!-- 小标题(带灰底) -->
<fo:block font-size="14pt" font-weight="bold" background-color="#e6e6e6"
padding="6pt" space-before="12pt" space-after="8pt">
一、基本信息
</fo:block>
<!-- 普通段落(中文标准) -->
<fo:block font-size="12pt" line-height="1.8" text-align="justify" text-indent="24pt"
space-after="8pt">
根据《中华人民共和国税收征收管理法》及其实施细则的有关规定……
</fo:block>
<!-- 金额大写(右对齐、红色) -->
<fo:block font-size="14pt" font-weight="bold" color="#c00000" text-align="right"
space-before="15pt" keep-with-previous.within-page="always">
合计人民币:壹拾贰万叁仟肆佰伍拾陆元整
</fo:block>
<!-- 防止孤行标题 -->
<fo:block font-size="16pt" font-weight="bold" keep-with-next.within-page="always">
第二章 项目明细
</fo:block>
4. 终极防孤行寡行写法(银行、出版必备)
<!-- 标题绝不孤立在页底 -->
<fo:block font-size="16pt" font-weight="bold"
keep-with-next.within-page="always"
space-after="6pt">
第三季度财务报表
</fo:block>
<!-- 段落至少留 3 行在页顶/页底 -->
<fo:block font-size="12pt" line-height="18pt" text-indent="24pt"
widows="3" orphans="3"
keep-together.within-page="auto">
……段落内容……
</fo:block>
5. 实战技巧(2025 年还在踩的坑)
| 问题 | 正确解决方式 |
|---|---|
| 段落两端对齐最后一行也拉开 | 改用 text-align-last="justify"(FOP 2.8+ 支持) |
| 想做首行不缩进 | text-indent="0pt" + 手动在前加空格 |
| block 里嵌图片导致分页异常 | 给图片外包一层 fo:block keep-together="always" |
| 多个 block 之间间距不稳定 | 统一只用 space-after,不要混用 margin |
| 中文标点挤到行首 | 加 linefeed-treatment="preserve" 和 punctuation-trim="both"(商业处理器支持) |
一句话总结
所有文字、标题、间距、背景、边框、防孤行,全靠 fo:block + 这 30 个属性搞定。
掌握上面这些,你已经能写出银行级发票、出版级图书、上市公司年报的全部块级排版了。
需要我直接发你一套「增值税发票完整 block 模板」「银行对账单 block 模板」「双面图书 block 样式」吗?说一声 10 秒发你。