九⼤Python处理PDF操作
办公⾃动化应该算是打⼯⼈上班摸鱼的极致追求了,况且对于 Python 爱好者来说,办公⾃动化简直是太简单了
⽐如,今天的办公⾃动化主题:Python 操作 PDF
今天的具体内容将会从以下⼏个⼩节展开:
1. 相关介绍
2. 批量拆分
3. 批量合并
4. 提取⽂字内容
5. 提起表格内容
6. 提起图⽚内容
7. 转换为PDF图⽚
8. 添加⽔印
9. 加密与解码
上述操作⽐较常⽤,也可以解决较多的办公内容,下⾯直接开始本节内容:
1. 相关介绍
Python 操作 PDF 会⽤到两个库,分别是:PyPDF2 和 pdfplumber
其中 PyPDF2 可以更好的读取、写⼊、分割、合并PDF⽂件,⽽ pdfplumber 可以更好的读取 PDF ⽂件中内容和提取 PDF 中的表格对应的官⽹分别是:
由于这两个库都不是 Python 的标准库,所以在使⽤之前都需要单独安装
win+r 后输⼊ cmd 打开 command 窗⼝,依次输⼊如下命令进⾏安装:
pip install PyPDF2
pip install pdfplumber
安装完成后显⽰ success 则表⽰安装成功
2. 批量拆分
将⼀个完整的 PDF 拆分成⼏个⼩的 PDF,因为主要涉及到 PDF 整体的操作,所以本⼩节需要⽤到 PyPDF2 这个库
拆分的⼤概思路如下:
读取 PDF 的整体信息、总页数等
遍历每⼀页内容,以每个 step 为间隔将 PDF 存成每⼀个⼩的⽂件块
将⼩的⽂件块重新保存为新的 PDF ⽂件
需要注意的是,在拆分的过程中,可以⼿动设置间隔,例如:每5页保存成⼀个⼩的 PDF ⽂件
拆分的代码如下:
import os
from PyPDF2 import PdfFileWriter, PdfFileReader
def split_pdf(filename, filepath, save_dirpath, step=5):
"""
拆分PDF为多个⼩的PDF⽂件,
@param filename:⽂件名
@param filepath:⽂件路径
getsavefilename@param save_dirpath:保存⼩的PDF的⽂件路径
@param step: 每step间隔的页⾯⽣成⼀个⽂件,例如step=5,表⽰0-4页、5-9页...为⼀个⽂件
@return:
"""
if not ists(save_dirpath):
os.mkdir(save_dirpath)
pdf_reader = PdfFileReader(filepath)
# 读取每⼀页的数据
pages = NumPages()
for page in range(0, pages, step):
pdf_writer = PdfFileWriter()
# 拆分pdf,每 step 页的拆分为⼀个⽂件
for index in range(page, page+step):
if index < pages:
pdf_writer.addPage(Page(index))
# 保存拆分后的⼩⽂件
save_path = os.path.join(save_dirpath, filename+str(int(page/step)+1)+'.pdf')
print(save_path)
with open(save_path, "wb") as out:
pdf_writer.write(out)
print("⽂件已成功拆分,保存路径为:"+save_dirpath)
split_pdf(filename, filepath, save_dirpath, step=5)
以“易⽅达中⼩盘混合型证券投资基⾦2020年中期报告”为例,整个 PDF ⽂件⼀共 46 页,每5页为间隔,最终⽣成了10个⼩的 PDF ⽂件
3. 批量合并
⽐起拆分来,合并的思路更加简单:
确定要合并的 ⽂件顺序
循环追加到⼀个⽂件块中
保存成⼀个新的⽂件
对应的代码⽐较简单:
import os
from PyPDF2 import PdfFileReader, PdfFileWriter
def concat_pdf(filename, read_dirpath, save_filepath):
"""
合并多个PDF⽂件
@param filename:⽂件名
@param read_dirpath:要合并的PDF⽬录
@param save_filepath:合并后的PDF⽂件路径
@return:
"""
pdf_writer = PdfFileWriter()
# 对⽂件名进⾏排序
list_filename = os.listdir(read_dirpath)
list_filename.sort(key=lambda x: int(x[:-4].replace(filename, "")))
for filename in list_filename:
print(filename)
filepath = os.path.join(read_dirpath, filename)
# 读取⽂件并获取⽂件的页数
pdf_reader = PdfFileReader(filepath)
pages = NumPages()
# 逐页添加
for page in range(pages):
pdf_writer.addPage(Page(page))
# 保存合并后的⽂件
with open(save_filepath, "wb") as out:
pdf_writer.write(out)
print("⽂件已成功合并,保存路径为:"+save_filepath)
concat_pdf(filename, read_dirpath, save_filepath)
4. 提取⽂字内容
涉及到具体的 PDF 内容 操作,本⼩节需要⽤到 pdfplumber 这个库在进⾏⽂字提取的时候,主要⽤到 extract_text 这个函数
具体代码如下:
import os
import pdfplumber
def extract_text_info(filepath):
"""
提取PDF中的⽂字
@param filepath:⽂件路径
@return:
"""
with pdfplumber.open(filepath) as pdf:
# 获取第2页数据
page = pdf.pages[1]
act_text())
# 提取⽂字内容
extract_text_info(filepath)
可以看到,直接通过下标即可定位到相应的页码,从⽽通过 extract_text 函数提取该也的所有⽂字
⽽如果想要提取所有页的⽂字,只需要改成:
with pdfplumber.open(filepath) as pdf:
# 获取全部数据
for page in pdf.pages
act_text())
例如,提取“易⽅达中⼩盘混合型证券投资基⾦2020年中期报告” 第⼀页的内容时,源⽂件是这样的:
运⾏代码后提取出来是这样的:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论