在电子商务和财务系统中,生成规范化的发票 PDF 文件是一个常见需求。利用 XSL-FO(Extensible Stylesheet Language Formatting Objects),我们可以设计和生成格式规范的发票 PDF。本文将介绍如何使用 XSL-FO 构建电子发票的 PDF 文件,并提供一些优化布局的建议,以实现更清晰美观的发票。
为什么选择 XSL-FO?
XSL-FO 是 W3C 的标准,用于将 XML 文档格式化为 PDF、PostScript 等格式的高质量输出文档。它尤其适合结构化数据的排版需求。结合 Apache FOP(Formatting Objects Processor)等工具,我们可以从 XML 模板生成发票 PDF。
1. 初始设置
首先,在根节点 <fo:root>
中设置页面布局:
<fo:root>
<fo:layout-master-set>
<fo:simple-page-master master-name="invoice">
<fo:region-body margin="5mm"/>
</fo:simple-page-master>
</fo:layout-master-set>
</fo:root>
这里指定了页面的边距和布局,便于后续的内容排版。
2. 标题区块
发票的顶部通常包括公司标志、发票编号和日期。以下是一个简单的示例:
<fo:block font-size="14pt" font-weight="bold" text-align="center">
<fo:external-graphic src="company-logo.png" height="50mm"/>
</fo:block>
<fo:block font-size="12pt" text-align="center">
<fo:table>
<fo:table-body>
<fo:table-row>
<fo:table-cell>
<fo:block>发票编号:</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>123456789</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell>
<fo:block>日期:</fo:block>
</fo:table-cell>
<fo:table-cell>
<fo:block>2025-06-03</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
3. 买卖方信息
接下来,添加买卖方的详细信息:
<fo:block font-size="12pt">
<fo:block>买方:</fo:block>
<fo:block>姓名:张三</fo:block>
<fo:block>地址:XX路XX号</fo:block>
<fo:block>电话:1234567890</fo:block>
<fo:block>邮箱:zhangsan@example.com</fo:block>
<fo:block>---------------------</fo:block>
<fo:block>卖方:</fo:block>
<fo:block>姓名:李四</fo:block>
<fo:block>地址:YY路YY号</fo:block>
<fo:block>电话:0987654321</fo:block>
<fo:block>邮箱:lisi@example.com</fo:block>
</fo:block>
4. 商品明细表格
商品明细通常以表格形式呈现:
<fo:table border="1mm">
<fo:table-body>
<fo:table-row>
<fo:table-cell text-align="center">序号</fo:table-cell>
<fo:table-cell text-align="center">商品名称</fo:table-cell>
<fo:table-cell text-align="center">数量</fo:table-cell>
<fo:table-cell text-align="center">单价</fo:table-cell>
<fo:table-cell text-align="center">金额</fo:table-cell>
</fo:table-row>
<!-- 更多行 -->
</fo:table-body>
</fo:table>
5. 合计信息
在表格下方,添加合计信息:
<fo:block font-size="12pt" font-weight="bold">
<fo:block>合计金额:</fo:block>
<fo:block>1000.00</fo:block>
</fo:block>
6. 优化代码结构与布局
为了提高代码的可读性和可维护性,建议将样式和布局分离,并使用命名空间。
7. 生成 PDF 文件
使用 Apache FOP 等工具将 XSL-FO 文档转换为 PDF:
java -jar fop-3.x.x.jar -fo input.fo -pdf output.pdf
8. 示例
以下是一个简单的 XSL-FO 示例,展示了如何构建一个包含上述元素的发票:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format">
<!-- ... -->
</xsl:stylesheet>
总结
使用 XSL-FO 可以轻松创建格式规范的 PDF 文件,如电子发票。通过学习 XSL-FO 的基本语法和布局技巧,您可以提高文档的排版质量和效率。