标签归档:pdf生成

Python 批量生成PDF文档, 办公效率火箭般提升

日常办公中,经常会使用PDF文档,难免需要对PDF文档进行编辑,有时候PDF文档中的大部分内容都是一样的,只是发送对象不同。

这种模板套用的场景下,使用Python进行自动化就尤为方便,用最短的时间办最高效的事。

今天就给大家讲讲如何用Python自动套用模板批量生产PDF文档。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

在终端输入以下命令安装我们所需要的依赖模块:

pip install fpdf

看到 Successfully installed xxx 则说明安装成功。

完整源代码可在【Python实用宝典】公众号后台回复:批量生成pdf 下载

2.基本使用

PyPDF是从PHP移植到Python的第三方模块。其主要特点有:

1.非常容易使用和扩展
2.提供了许多简单示例
3.没有外部依赖项
4.不需要安装变异其他库(DLL)

它的基本功能有:

1.调整PDF精度、页面格式、边距
2.管理页眉、页脚
3.自动分页符、自动换行和文本对齐
4.支持图像、颜色、超链接文本
5.支持压缩

一个最简单的生成示例:

from fpdf import FPDF

pdf = FPDF()
# add_page() 增加一页
pdf.add_page()
# set_font 调整字体
pdf.set_font('Arial', 'B', 16)
# 输出Hello World,宽度40,高度10
pdf.cell(40, 10, 'Hello World!')

# 输出文件
pdf.output('tuto2.pdf', 'F')

生成的效果如下:

这只是一个压缩后的图片,真实PDF比这大得多。

把生成的文本变复杂一点:

from fpdf import FPDF

pdf = FPDF()
# add_page() 增加一页
pdf.add_page()
# set_font 调整字体
pdf.set_font('Arial', 'B', 16)
# 输出Hello World,宽度40,高度10
pdf.cell(40, 10, 'Hello World!')

# 居中输出Powered by FPDF.宽度60,高度10
# border=1 设置显示文本框的框,
# ln=1 代表在这个文本框后换行
# align='C' 则表明文本居中。
pdf.cell(60, 10, 'Powered by FPDF.', border=1, ln=1, align='C')

# 输出文件
pdf.output('tuto2.pdf', 'F')

注意cell的参数:
1. border 取值为0或1,代表是否显示边框。
2. ln 是指在生成该文本框之后焦点移动到的位置,0 代表到该文本框的右边,1 代表换行,2 代表文本框的正下方。
3. align 是指文本对齐格式,C为居中、L为左对齐、R为右对齐。

因此上述代码会生成类似这样的PDF文档:

cell还有2个参数:

1. fill 参数用于设置文本框的背景,TRUE时为白色,False为透明。
2. link 参数用于添加超链接

下面看一个比较复杂的例子,带图片LOGO作为页眉,带页数作为页脚的PDF文档:

看看要怎么实现这个PDF文档的生成。

首先需要继承FPDF类,以用于自定义页眉和页脚。

from fpdf import FPDF

class PDF(FPDF):
    """
    继承FPDF类,以自定义页眉也页脚
    """
    def header(self):
        """
        设置页眉
        """
        # 添加logo
        self.image('pythondict_logo.png', 10, 8, 33)
        # 设置字体
        self.set_font('Arial', 'B', 15)
        # 移动焦点至右边
        self.cell(80)
        # 添加标题
        self.cell(30, 10, 'Title', 1, 0, 'C')
        # 换行
        self.ln(20)

    def footer(self):
        """
        设置页脚
        """
        # 底部以上1.5厘米
        self.set_y(-15)
        # 设置字体
        self.set_font('Arial', 'I', 8)
        # 页码
        self.cell(0, 10, 'Page ' + str(self.page_no()) + '/{nb}', 0, 0, 'C')

这样设置完页眉也页脚后,只要你使用该类定义PDF文档,便会自动带上页眉页脚。

# 使用上述继承并进行了自定义的类
pdf = PDF()
pdf.alias_nb_pages()
pdf.add_page()
pdf.set_font('Times', '', 12)
# 填充内容
for i in range(1, 41):
    pdf.cell(0, 10, 'Printing line number ' + str(i), 0, 1)
pdf.output('tuto2.pdf', 'F')

真的是非常方便。

3.批量生成PDF

接下来在Python实用宝典网站(https://pythondict.com)上随机抽取了5位注册了账号的同学的ID批量制作祝福PDF文档。

这里可以复用咱刚自定义完成的页眉和页尾。不过,为了显示中文,需要在继承的类里面添加并设置字体为本地中文字体,如:

from fpdf import FPDF

class PDF(FPDF):
    """
    继承FPDF类,以自定义页眉也页脚
    """
    def header(self):
        """
        设置页眉
        """
        # 添加logo
        self.image('pythondict_logo.png', 10, 8, 33)
        # 设置字体
        self.add_font('yuanti','','yuanti.ttf', True)
        self.set_font('yuanti')
        # 移动焦点至右边
        self.cell(80)
        # 添加标题
        self.cell(30, 10, 'Python实用宝典祝福您', 0, 0, 'C')
        # 换行
        self.ln(20)

注意,add_font第一个参数是该字体注册进FPDF的名字,之后set_font的时候都使用该名字。

然后将用户名都放到一个数组里,遍历该数组,填充用户名,循环批量生成PDF.

for user in users:
    pdf = PDF()
    pdf.alias_nb_pages()
    pdf.add_page()
    pdf.set_font('yuanti', '', 12)
    pdf.cell(0, 10, 'Dear ' + str(user) + ': ', 0, 1)
    # 填充内容
    for i in range(len(texts)):
        pdf.cell(5)
        pdf.multi_cell(0, 10, texts[i], 0)
    pdf.output(f'output/{user}.pdf', 'F')

最终效果如下:

完整源代码可在【Python实用宝典】公众号后台回复:批量生成pdf 下载

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典