在电子商务和财务系统中,生成规范化的发票 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。
XSL-FO 生成电子发票 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">
<fo:table>
<fo:table-body>
<fo:table-row>
<fo:table-cell text-align="center">
<fo:block>
<fo:external-graphic src="company-logo.png" scaling="uniform"/>
</fo:block>
</fo:table-cell>
</fo:table-row>
<fo:table-row>
<fo:table-cell text-align="center">
<fo:block>
<fo:sequence-count name="invoice-number" format="0000"/>
发票编号:
</fo:block>
</fo:table-cell>
</fo:table-row>
</fo:table-body>
</fo:table>
</fo:block>
3. 买卖方信息
接下来,添加买卖方的信息:
<fo:block font-size="12pt">
<fo:block>
<fo:strong>卖方信息:</fo:strong>
公司名称:XXX有限公司
地址:XXX省XXX市XXX区XXX路XXX号
联系电话:XXX-XXXX-XXXX
</fo:block>
<fo:block>
<fo:strong>买方信息:</fo:strong>
公司名称:XXX公司
地址:XXX省XXX市XXX区XXX路XXX号
联系电话:XXX-XXXX-XXXX
</fo:block>
</fo:block>
4. 商品明细表格
商品明细表格是发票的核心部分:
<fo:table border="solid 1pt">
<fo:table-body>
<fo:table-row>
<fo:table-cell text-align="center" border-right="solid 1pt" border-bottom="solid 1pt">
序号
</fo:table-cell>
<fo:table-cell text-align="center" border-right="solid 1pt" border-bottom="solid 1pt">
商品名称
</fo:table-cell>
<fo:table-cell text-align="center" border-right="solid 1pt" border-bottom="solid 1pt">
单位
</fo:table-cell>
<fo:table-cell text-align="center" border-right="solid 1pt" border-bottom="solid 1pt">
数量
</fo:table-cell>
<fo:table-cell text-align="center" border-right="solid 1pt" border-bottom="solid 1pt">
单价
</fo:table-cell>
<fo:table-cell text-align="center" border-right="solid 1pt" border-bottom="solid 1pt">
小计
</fo:table-cell>
</fo:table-row>
<!-- 商品明细数据 -->
</fo:table-body>
</fo:table>
5. 合计信息
在商品明细表格下方,添加合计信息:
<fo:block font-size="12pt">
<fo:block>
<fo:strong>合计:</fo:strong>
总计数量:XXX
总计金额:XXX元
</fo:block>
</fo:block>
6. 优化代码结构与布局
为了提高代码的可读性和可维护性,建议将 XSL-FO 代码拆分为多个模块,例如标题模块、商品明细模块等。
7. 生成 PDF 文件
使用 Apache FOP 等工具,将 XSL-FO 文件转换为 PDF 文件:
java -jar ApacheFOP.jar -fo input.fo -pdf output.pdf
8. 示例
以下是一个简单的 XSL-FO 示例,用于生成发票 PDF:
<?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:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<!-- XSL-FO 代码 -->
</xsl:stylesheet>
总结
使用 XSL-FO 与 PDF 工具集成,可以轻松打造精美文档。通过合理布局和优化代码结构,可以生成格式规范、美观的发票 PDF 文件。