【python办公自动化】task 04 python与pdf

目录

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办公自动化】task 04 python与pdf
注意:第一次用的时候会报错
【python办公自动化】task 04 python与pdf
解决方法是从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)

【python办公自动化】task 04 python与pdf

上一篇:Python os模块简单应用


下一篇:7 个非常实用的 Shell 拿来就用脚本实例!