栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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


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('删除文件夹完成')


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


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))


def pdf_text(pdf_name, save_path):  # 处理文本数据 path:文本保存的文件夹的路径
    print('处理文本数据ing')
    pdf_content = read_pdf(pdf_name)
    f = open(r'%spdf_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('处理文本数据完成')


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)


# 主函数

pdf_name = file_name()  # 选取pdf文件

path = create_folder(r'E:cpdd')  # 创建文件夹 #返回文件夹地址

pdf_text(pdf_name, path)

pdf_pic(pdf_name, path)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993827.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号