# 基本库导入
import pandas as pd
import numpy as np
1、相关库了解
利用python操作pdf会用到两个库,分别是:PyPDF2 和 pdfplumber
其中PyPDF2可以读取,写入,分割,合并PDF文件,而pdfplumber可以更好地读取PDF文件中的内容以及提取PDF中的表格
由于这两个库都不是 Python 的标准库,所以在使用之前都需要单独安装
2、批量拆分
将一个完成的PPDF拆分成几个小PDF。因为涉及到PDF的拆分,所以需要用到PyPDF2这个库。
拆分思路:
- 读取PDF的整体信息,总页数等
- 遍历每一页内容,以每个step为间隔将PDF拆分成每一个小的文件快
- 将小的文件重新保存为新的PDF文件
!!注意:拆分过程中,可以手动设置间隔,例如:每5页保存成一个小的PDF文件
以03.原料药行业.pdf为例,展示拆分过程
# 导库
import os
from PyPDF2 import PdfFileReader,PdfFileWriter
# 读取待拆分pdf文件
pdf_reader = PdfFileReader("D:\\study\\datawhale\\task04\\Python基础课件.pdf")
# 获取pdf的总页数
pages = pdf_reader.getNumPages()
pages
53
# 假设以5页为间隔
step=5
save_dirpath = "D:/study/datawhale/task04"
for page in range(0,pages,step): # 从0开始每隔一个step读取一次page
pdf_writer = PdfFileWriter()
# 拆分pdf,每step页拆分为一个文件
for index in range(page,page+step): # 每个间隔中,读取其中的5页
#print(index)
if index < pages: # 如果页数小于pdf的总页数
pdf_writer.addPage(pdf_reader.getPage(index))
#保存拆分后的小文件
save_path = os.path.join(save_dirpath,"Python基础课件" + str(int(page))+".pdf")
with open(save_path,'wb') as out:
pdf_writer.write(out)
将上述过程写成一个函数,之后只需要调用函数即可
def split_pdf(filename,filepath,save_dirpath,step=5):
'''
拆分PDF为多个小的PDF文件,
@param filename:文件名
@param filepath:待拆分文件的文件路径
@param save_path:拆分后的小的PDF保存路径
@param step:每step间隔的页面生成一个文件,例如step=5,表示0-4页、5-9页....为一个文件
'''
if not os.path.exists(save_dirpath):
os.mkdir(save_dirpath)
pdf_reader = PdfFileReader(filepath)
for page in range(0,pages,step):
pdf_writer = PdfFileWriter()
for index in range(page,page+step):
if index < pages: # 如果原文件页数不是5的倍数,最终会出现page+step数大于原pdf的总页数,后续的getPage(index)会报错,所以需要加这一行代码判断
pdf_writer.addPage(pdf_reader.getPage(index))
save_path = os.path.join(save_dirpath,filename + str(int(page))+"-"+str(int(page+step)) + ".pdf")
with open(save_path,'wb') as out:
pdf_writer.write(out)
split_pdf("Python基础课件","D:\\study\\datawhale\\task04\\Python基础课件.pdf","D:/study/datawhale/task04/Python基础课件导出结果")
Python基础课件.pdf一共有53页,以5页为间隔,最终生成了11个小的pdf文件
3、批量合并
合并思路:
- 确定要合并的文件的顺序
- 循环追加到一个文件块中
- 保存成一个新的文件
s = os.listdir("D:\\study\\datawhale\\task04\\Python基础课件导出结果")
s[0][:-4].replace("Python基础课件","").split("-")[0]
'0'
def concat_pdf(filename,read_dirpath,save_filepath):
'''
合并多个PDF文件
@param filename: 文件名
@param read_dirpath:要合并的多个pdf的目录
@param save_filepath:合并后文件的保存路径
'''
pdf_writer = PdfFileWriter()
# 对文件名进行排序
list_filenames = os.listdir(read_dirpath)
list_filenames.sort(key=lambda x: int(x[:-4].replace(filename,"").split("-")[0])) # 取出文件名中可以排序的部分
print(list_filenames)
for filename in list_filenames:
filepath = os.path.join(read_dirpath,filename)
# 读取每个小pdf文件
pdf_reader = PdfFileReader<