目录
1. 预备知识
Python操作pdf会用到两个库:
- PyPDF2 可以更好的读取、写入、分割、合并PDF文件
- pdfplumber 可以更好的读取 PDF 文件中内容和提取 PDF 中的表格
在使用前需要先对其进行安装
pip install PyPDF2
pip install pdfplumber
2. 批量拆分
将一个pdf拆分为几个小的pdf,主要用到PyPDF2这个库
拆分思路如下:
- 读取pdf的整体信息,总页数等
- 遍历每一页内容,以每个step为间隔将pdf保存为每一个小的文件块
- 将小的文件重新保存为新的pdf文件
import os
import PyPDF2
from PyPDF2 import PdfFileReader
from PyPDF2 import PdfFileWriter
def split_pdf(filename, filepath, save_dirpath, step=5):
"""
拆分PDF为多个小的PDF文件,
@param filename:文件名
@param filepath:文件路径,包含pdf的名字
@param save_dirpath:保存小的PDF的文件路径
@param step: 每step间隔的页面生成一个文件,例如step=5,表示0-4页、5-9页...为一个文件
@return:
"""
if not os.path.exists(save_dirpath):
os.mkdir(save_dirpath)
pdf_reader = PdfFileReader(filepath)
# 读取每一页的数据
pages = pdf_reader.getNumPages()
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(pdf_reader.getPage(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)
filename='易方达中小盘混合型证券投资基金2020年中期报告'
filepath=r'E:\数据分析\python办公\易方达中小盘混合型证券投资基金2020年中期报告.pdf'
save_dirpath='E:\数据分析\python办公\pdf拆分'
split_pdf(filename,filepath,save_dirpath,step=5)
注意:第一次用的时候会报错
解决方法是从python安装包下找到PyPDF2\utils.py
将其中的238 行的
r = s.encode('latin-1')
if len(s) < 2:
bc[s] = r
return r
改为
try:
r = s.encode('latin-1')
if len(s) < 2:
bc[s] = r
return r
except Exception as e:
r = s.encode('utf-8')
if len(s) < 2:
bc[s] = r
return r
改完后一定要重启python,否则不成功
3. 批量合并
思路:
- 确定要合并的文件顺序
- 循环追加到一个文件块中
- 保存成为一个新的文件
def concat_pdf(filename, read_dirpath, save_filepath):
"""
合并多个PDF文件
@param filename:文件名前缀
@param read_dirpath:要合并的PDF目录
@param save_filepath:合并后的PDF文件路径,包含新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 = pdf_reader.getNumPages()
# 逐页添加
for page in range(pages):
pdf_writer.addPage(pdf_reader.getPage(page))
# 保存合并后的文件
with open(save_filepath, "wb") as out:
pdf_writer.write(out)
print("文件已成功合并,保存路径为:"+save_filepath)
filename='易方达中小盘混合型证券投资基金2020年中期报告'
read_dirpath='E:\数据分析\python办公\pdf拆分'
save_filepath='E:\数据分析\python办公\pdf合并\易方达中小盘混合型证券投资基金2020年中期报告.pdf'
concat_pdf(filename,read_dirpath,save_filepath)