1 相关介绍
- 相关库:Python操作PDF会用到两个库
- PyPDF2:可以更好的读取、写入、分割、合并PDF文件
- pdfplumber:可以更好的读取 PDF 文件中内容和提取 PDF 中的表格
- 两个都需要单独安装
pip install PyPDF2 pip install pdfplumber
注:PyPDF2无法从PDF文档中提取图像、图表或其他媒体,但它可以提取文本,并将文本返回为Python字符串
2 批量拆分
- 拆分思路:涉及到 PDF 整体的操作,需要用到 PyPDF2 这个库
- 读取 PDF 的整体信息、总页数等
- 遍历每一页内容,以每个 step 为间隔将 PDF 存成每一个小的文件块
- 将小的文件块重新保存为新的 PDF 文件
import os def split_pdf(filename, filepath, save_dirpath, step=5): """ 拆分PDF为多个小的PDF文件, @param filename:文件名 @param filepath:文件路径 @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() # page取值:list [0, 5, 10...pages) for page in range(0, pages, step): pdf_writer = PdfFileWriter() # 拆分pdf,每 step 页的拆分为一个文件 # index取值, 区间: [0, 5),[5, 10) 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)
# 导入拆分函数中需要的模块 from PyPDF2 import PdfFileReader from PyPDF2 import PdfFileWriter
# 分隔PDF path = '易方达中小板指数证券投资基金(LOF)2020年中期报告' # 当前路径下 split_pdf(path, path + '.pdf', 'test_pdf')
注:第一次运行会出现下面的报错
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 8-9:
- 解决方法:
- 在Pycharm下,直接通过报错信息,点击
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
- 在Pycharm下,直接通过报错信息,点击