XSL-FO 块

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-size9pt, 10.5pt, 小四, 三号小四=12pt,三号=16pt
font-weightbold, 700标题、表头常用
color#cc0000, red红色金额、负数
text-alignleft, center, right, justifyjustify=两端对齐(中文报表最爱)
text-indent2em, 24pt段落首行缩进(中文必备)
line-height1.5, 180%, 20pt中文建议 1.8~2.0
space-before / space-after12pt, 5mm段前段后间距(比 margin 更准)
start-indent / end-indent10mm整体左缩进、右缩进
background-color#f5f5f5灰底标题条
border1pt solid black四边框
border-top/bottom/left/right0.5pt solid #ccc单边框
padding4pt, 5mm 8mm内边距(表格单元格最常用)
keep-with-next.within-pagealways本块和下一个块绝不分页(标题不孤行)
keep-with-previous.within-pagealways不做孤行
keep-together.within-pagealways本块内部绝不分页(短表格、短段落)
break-beforepage, column强制在此之前新起一页
break-afterpage强制在此之后新起一页
margin-left / margin-right0mm配合 text-align 做居中更稳
widows / orphans2防止段落末尾/开头只剩 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 秒发你。

文章已创建 2838

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部