Python:从pdf中提取文本和图片

1导入相关包

import win32ui  # pip install pypiwin32
import numpy as np
from numpy import *
import operator
 
# 导入pdf相关的包 #No module named 'frontend' #pip install PyMuPDF
from io import StringIO
from pdfminer.pdfinterp import PDFResourceManager
from pdfminer.pdfinterp import process_pdf
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
import re
import fitz  # 安装软件包fitz
import time
import os

2 声明函数(Declare function)

       2.1清空文件夹及创建空文件夹的函数

def create_folder(path):
    # 创建保存的文件夹
    if os.path.exists(path):
        del_f(path, True)  # tf 是否删除隐藏文件,默认删除
    os.rmdir(path)  # 删除
    os.mkdir(path)  # 创建
    print('创建文件夹完成')
    return path  # 返回文件夹地址
 
 
#清空文件夹内所有内容(包括子文件夹)
def del_f(path_0, tf=True):
    # tf 是否删除隐藏文件,默认删除
    list1 = os.listdir(path_0)
    for i in list1:
        c_path = os.path.join(path_0, i)
        if (i[0] != '.' or tf):  # 如果不是隐藏文件
            if os.path.isdir(c_path):
                # print('\n')
                del_f(c_path, tf)
                if (os.listdir(c_path) == []):
                    # 判断文件夹是否为空,可能保留了隐藏文件
                    os.rmdir(c_path)
                    # print("已删除文件夹%s"%c_path,'\n')
                else:
                    # print("文件夹%s"%c_path,"中含有隐藏文件,保留该文件夹")
                    # print(os.listdir(c_path),'\n')
                    pass
            else:
                try:
                    os.remove(c_path)
                    # print("已删除文件%s"%i)
                except Exception as e:
                    return False
        else:
            # print("保留隐藏文件%s"%c_path)
            pass
    print('删除文件夹完成')
 
 

        2.2打开文件对话框,选取文件

def file_name():
    print('打开文件对话框,选取文件')
    # 0代表另存为对话框,1代表打开文件对话框
    dlg = win32ui.CreateFileDialog(1)
    # 默认目录
    dlg.SetOFNInitialDir(r'C:/')
    # 显示对话框
    dlg.DoModal()
    # 获取用户选择的文件全路径
    filename = dlg.GetPathName()
    return filename

        2.3查找pdf中的图片

def pdf_pic(path, pic_path):
    # 使用正则表达式查找PDF中的图片
    # path:pdf的路径,pic_path:图片保存的路径
    t0 = time.perf_counter()
    # 使用正则表达式来查找图片
    checkXO = r"/Type(?= */XObject)"
    checkIM = r"/Subtype(?= */Image)"
    # 打开pdf
    doc = fitz.open(path)
    # 图片计数
    imgCount = 0
    lenXREF = doc.xref_length()
 
    # 打印pdf的信息
    print("文件名:{},页数:{},对象:{}".format(path, len(doc), lenXREF - 1))
 
    # 遍历每一个对象
    for i in range(1, lenXREF):
        # 定义对象字符串
        text = doc.xref_object(i)
        isXObject = re.search(checkXO, text)
        # 使用正则表达式查看是否是图片
        isImage = re.search(checkIM, text)
        # 如果不是对象也不是图片,则continue
        if not isXObject or not isImage:
            continue
        imgCount += 1
        # 根据索引生成图像
        pix = fitz.Pixmap(doc, i)
        # 根据pdf的路径生成图片的名称
        new_name = path.replace('\\', '_') + "_img{}.png".format(imgCount)
        new_name = new_name.replace(':', '')
 
        # 如果pix.n<5,可以直接存为png
        if pix.n < 5:
            pix.save(os.path.join(pic_path, new_name))
        # 否则先转换CMYK
        else:
            pix0 = fitz.Pixmap(fitz.csRGB, pix)
            pix0.save(os.path.join(pic_path, new_name))
            pix0 = None
        # 释放资源
        pix = None
        t1 = time.perf_counter()
        print("运行时间:{}s".format(t1 - t0))
        print("提取了{}张图片".format(imgCount))

        2.4处理pdf中的文字

def pdf_text(pdf_name, save_path):  # 处理文本数据 path:文本保存的文件夹的路径
    print('处理文本数据ing')
    pdf_content = read_pdf(pdf_name)
    f = open(r'%s\pdf_text.txt' % (save_path), 'w')
    for i in range(0, len(pdf_content)):
        if i % 50 == 0:
            f.write(pdf_content[i:i + 50] + '\n')
    print('处理文本数据完成')

        2.5读取pdf

def read_pdf(file_path):  # 读取pdf文件
    with open(file_path, 'rb') as file:
        resource_manager = PDFResourceManager()
        return_str = StringIO()
        lap_params = LAParams()
        device = TextConverter(resource_manager, return_str, laparams=lap_params)
        process_pdf(resource_manager, device, file)
        device.close()
        content = return_str.getvalue()
        return_str.close()
        print('读取pdf文件完成')
        return re.sub('\s+', '', content)

3运行 

pdf_name = file_name()  # 选取pdf文件
path = create_folder(r'E:\cpdd')  # 创建文件夹 #返回文件夹地址
pdf_text(pdf_name, path)
pdf_pic(pdf_name, path)

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

3446013570@qq.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值