Python处理PDF操作

今天的具体内容将会从以下几个小节展开:

  1. 相关介绍

  2. 批量拆分

  3. 批量合并

  4. 提取文字内容

  5. 提起表格内容

  6. 提起图片内容

  7. 转换为PDF图片

  8. 添加水印

  9. 加密与解码

上述操作比较常用,也可以解决较多的办公内容,下面直接开始本节内容:

1. 相关介绍

Python 操作 PDF 会用到两个库,分别是:PyPDF2 和 pdfplumber

其中 PyPDF2 可以更好的读取、写入、分割、合并PDF文件,而 pdfplumber 可以更好的读取 PDF 文件中内容和提取 PDF 中的表格

对应的官网分别是:

PyPDF2:https://pythonhosted.org/PyPDF2/

pdfplumber:https://github.com/jsvine/pdfplumber

由于这两个库都不是 Python 的标准库,所以在使用之前都需要单独安装

win+r 后输入 cmd 打开 command 窗口,依次输入如下命令进行安装:

pip install PyPDF2

pip install pdfplumber

  

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:文件路径
    @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)
    
split_pdf(filename, filepath, save_dirpath, step=5)

  

 批量合并

比起拆分来,合并的思路更加简单:

  • 确定要合并的 文件顺序

  • 循环追加到一个文件块中

  • 保存成一个新的文件

对应的代码比较简单:

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 = 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)
    
concat_pdf(filename, read_dirpath, save_filepath)

  

 提取文字内容

涉及到具体的 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]
        print(page.extract_text())
        
# 提取文字内容
extract_text_info(filepath)

  

可以看到,直接通过下标即可定位到相应的页码,从而通过 extract_text 函数提取该也的所有文字

而如果想要提取所有页的文字,只需要改成:

with pdfplumber.open(filepath) as pdf:
 # 获取全部数据
 for page in pdf.pages
     print(page.extract_text())

  

提取表格内容

同样的,本节是对具体内容的操作,所以也需要用到 pdfplumber 这个库

和提取文字十分类似的是,提取表格内容只是将 extract_text 函数换成了 extract_table 函数

对应的代码如下:

import os
import pandas as pd
import pdfplumber
 
def extract_table_info(filepath):
    """
    提取PDF中的图表数据
    @param filepath:
    @return:
    """
    with pdfplumber.open(filepath) as pdf:
        # 获取第18页数据
        page = pdf.pages[17]
        # 如果一页有一个表格,设置表格的第一行为表头,其余为数据
        table_info = page.extract_table()
        df_table = pd.DataFrame(table_info[1:], columns=table_info[0])
        df_table.to_csv('dmeo.csv', index=False, encoding='gbk')
        
# 提取表格内容
extract_table_info(filepath)

  

 
posted @ 2022-03-14 11:02  青竹之下  阅读(442)  评论(0编辑  收藏  举报