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)