在日常办公中,发票生成与发送往往是一项重复且繁琐的工作。无论是小型企业还是个人创业者,都可能面临手动录入信息、排版格式、逐一发送的低效流程。今天,我将为大家介绍一个基于 Python 的自动化发票生成器,它能从 CSV 文件读取订单数据、生成标准化 PDF 发票,并支持自动发送邮件,彻底解放双手!

项目简介

自动化发票生成器是一个轻量级 Python 工具,核心功能包括:

  • 从 CSV 文件批量读取客户及订单信息(如客户名称、商品明细、金额等)
  • 基于模板生成美观的 PDF 格式发票(支持自定义 logo、字体、布局)
  • 自动通过邮件将发票发送给对应客户

项目依赖fpdf库实现 PDF 生成,通过标准库处理 CSV 读取与邮件发送,整体代码简洁易扩展,适合二次开发。

项目框架

## 项目结构
```
invoice_generator/
├── input/               # 存放原始CSV数据
│   └── orders.csv       # 包含订单ID、客户姓名、客户邮箱、商品信息、金额和到期日期等字段
├── output/              # 生成的PDF发票
├── config/              # 配置文件
│   └── config.ini       # 包含发送邮件所需的邮箱信息
├── templates/           # 发票模板
│   └── invoice_template.py # 生成发票所需的格式和样式
├── main.py              # 主程序,负责读取CSV数据、生成PDF发票并发送邮件
└── requirements.txt     # 列出项目所需的依赖库

核心技术解析

1. PDF 发票生成:基于 fpdf 库的实现

项目的核心是 PDF 发票的生成,这里主要依赖fpdf库。以下从代码中提取几个关键技术点:

(1)图片插入:添加企业 logo

在发票顶部插入企业 logo 是常见需求,fpdf的image方法可轻松实现:


# 从fpdf.py中提取的核心逻辑

def image(self, name, x=None, y=None, w=0, h=0, type='', link=''):

# 自动识别图片类型(jpg/png等)

if type == '':

pos = name.rfind('.')

if not pos:

self.error('图片文件无扩展名且未指定类型: ' + name)

type = name[pos+1:].lower()

# 解析图片信息(尺寸等)

if type in ['jpg', 'jpeg']:

info = self._parsejpg(name)

elif type == 'png':

info = self._parsepng(name)

# 自动计算尺寸(保持比例)

if w == 0 and h == 0:

# 按72dpi缩放

w = info['w'] / self.k

h = info['h'] / self.k

elif w == 0:

w = h * info['w'] / info['h']

elif h == 0:

h = w * info['h'] / info['w']

# 输出到PDF

self._out(f'q {w*self.k:.2f} 0 0 {h*self.k:.2f} {x*self.k:.2f} {(self.h-(y+h))*self.k:.2f} cm /I{info["i"]} Do Q')

使用时只需指定图片路径和位置,库会自动处理格式和缩放,非常方便。

(2)字体处理:支持中文显示

发票中常包含中文,fpdf通过字体子集化(ttfonts.py)确保中文正常显示且减小文件体积:


# 从ttfonts.py中提取的字体子集化逻辑

def makeSubset(self, file, subset):

# 读取字体文件的cmap表(字符到字形的映射)

self.readTableDirectory()

# 解析Unicode映射(确保中文能被正确识别)

if unicode_cmap_offset12:

self.getCMAP12(unicode_cmap_offset12, glyphToChar, charToGlyph)

else:

self.getCMAP4(unicode_cmap_offset, glyphToChar, charToGlyph)

# 筛选需要的字符(仅保留发票中用到的字符,减小体积)

subsetglyphs = [(0, 0)] # 保留特殊字符

for code in subset:

if code in self.charToGlyph:

subsetglyphs.append((self.charToGlyph[code], code))

# 生成子集字体并写入PDF

self.add('cmap', cmapstr) # 更新字符映射

self.add('glyf', glyf) # 写入字形数据

通过字体子集化,既能保证中文正常显示,又能避免完整字体文件导致的 PDF 过大问题。

(3)模板与动态内容:个性化发票信息

项目支持通过模板动态填充发票内容(如客户信息、金额、日期等),template.py中的write方法实现了文本与链接的动态写入:


# 从template.py中提取的动态内容写入逻辑

def write(self, pdf, x1=0, y1=0, x2=0, y2=0, text='', font="arial", size=1,

bold=False, italic=False, underline=False, align="", link=''):

# 设置字体样式(粗体/斜体/下划线)

style = ""

if bold: style += "B"

if italic: style += "I"

if underline: style += "U"

pdf.set_font(font, style, size)

# 设置位置并写入文本(支持链接,如付款链接)

pdf.set_xy(x1, y1)

pdf.write(5, text, link) # 最后一个参数为链接地址

通过此方法,可灵活设置发票中的动态文本(如 “客户名称:XXX”),甚至添加付款链接,提升实用性。

2. 依赖管理:确保环境一致性

项目使用pip进行依赖管理,代码中涉及的ResourceCache(资源缓存)、Link(依赖链接解析)等类,确保了依赖安装的稳定性:

  • ResourceCache:缓存第三方资源(如字体文件),避免重复下载
  • Link:解析依赖包的 URL,处理版本兼容与哈希验证

在实际部署时,只需通过requirements.txt声明依赖(如fpdf==1.7.2),即可通过pip install -r requirements.txt快速搭建环境。

快速使用教程

步骤 1:准备环境

# 克隆项目

git clone https://github.com/1215-jjj/Python-.git

cd invoice-generator

# 安装依赖

pip install -r requirements.txt

步骤 2:配置数据

  1. 编辑orders.csv,按格式填入订单信息:

客户名称,邮箱,商品,数量,单价,日期

张三,zhangsan@example.com,产品A,2,100,2024-05-01

李四,lisi@example.com,产品B,1,200,2024-05-02
  1. config.py中配置邮件服务器(如 SMTP)和发票模板参数(如 logo 路径、税率)。

步骤 3:生成并发送发票


python generate_invoices.py

运行后,程序会自动读取 CSV 数据,生成 PDF 发票(保存至invoices/目录),并发送至客户邮箱。

效果图:

总结

自动化发票生成器通过 Python 的fpdf库实现了 PDF 发票的快速生成,结合 CSV 数据读取与邮件自动发送,显著提升了办公效率。项目代码简洁易扩展,适合开发者根据实际需求进行二次开发。

如果你在使用中遇到问题或有改进建议,欢迎在项目仓库提交 Issue 或 PR 参与贡献!

项目地址:https://github.com/1215-jjj/Python-.git

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐