为了完成一个竞赛作品,需要自主开发一个ocr文字识别模型,奈何组内无懂得人工智能的同学,退而求其次之,使用已经存在的框架开发一个能够实现pdf文件转文字的模块。
基于时间和使用难度的考虑,我最后决定使用easyocr(同类框架还有很多,比如pandaocr)正如它的宣言一样,做更少的事情,完成更多的事情,easyocr应该是最容易上手的ocr模型之一,但是令人感到无奈的是,easyocr貌似只支持图片格式(png,jpg)转文字,所以我们需要事先使用另一个方法将我们准备好的pdf文件转换成图片格式,这里选取的框架是fitz,逻辑可行,开始实践。
这是我的项目结构
将pdf转为图片格式
def trans_pdf(filename):
pdfPath = 'pdf' # !!!需要修改的文件所在的路径
#pdf_name = os.listdir(pdfPath) # 读取文件初始的名字
#for i in pdf_name: # 遍历全部文件
fileName = filename.split('.pdf')[0]
fileName = fileName.split('.PDF')[0]
pdf_fullName = pdfPath + '\\' + filename
imagePath = r'img' # !!!取出图片后的位置
pyMuPDF_fitz(pdf_fullName, imagePath, fileName)
首先要做的就是,获取我们需要的pdf文件,我们根据输入的filename,拼接pdf文件路径就可以确定
另外做的一件事情,就是确定图片的存放地址,通过filename.split('.pdf')[0]去除文件名后缀,再通过字符串拼接,这样我们就可以在后面的工作中,在img新建一个文件夹名为fileName的文件夹,来存储我们分析获得的所有图片 。(这里需要区分filename和fileName,一个是确定pdf的位置的,一个是确定存放png文件位置的)
def pyMuPDF_fitz(pdfPath, imagePath,fileName):
startTime_pdf2img = datetime.datetime.now() # 开始时间
print("imagePath=" + imagePath)
pdfDoc = fitz.open(pdfPath)
for pg in range(pdfDoc.page_count):
page = pdfDoc[pg]
rotate = int(0)
# 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
# 此处若是不做设置,默认图片大小为:792X612, dpi=96
zoom_x = 4 # (新型颅内支架Enterprise_省略_弹簧圈栓塞治疗颅内微小宽颈动脉瘤_黄海东.33333333-->1056x816) (2-->1584x1224)
zoom_y = 4
mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
pix = page.get_pixmap(matrix=mat, alpha=False)
#检测img文件夹中是否存在该pdf文件的文件夹,若没有,测创建
if not os.path.exists(imagePath+'/'+fileName): # 判断存放图片的文件夹是否存在
os.makedirs(imagePath+'/'+fileName) # 若图片文件夹不存在就创建
print(pg)
pix._writeIMG(imagePath + '/' + fileName+'/'+str(pg)+'.png',1)
#输出此次分析所消耗的时间
endTime_pdf2img = datetime.datetime.now() # 结束时间
print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)
这个函数就是用fitz来对我们之前确定的pdf文件做分析,并且存放在我们之前确定的img的文件夹中,其中一些函数的具体作用如有不懂,可以阅读官方文档,篇幅较长,暂不赘述。需要注意的是zoom_x和zoom_y是用来确定分析所得图片的清晰度的,情绪度越高所需要的时间就越多,因为我们是分析做文字识别用,所以设置的值是4,正常阅读的话,大约设置在2就可以。另外,两者的值必须相同。
对于这个模块需要注意的是,需要下载的两个框架,一个是fitz
pip install fitz
需要在fitz下载完并且完成索引的编写之后,在执行一下命令来下载PyMuPDF
pip install PyMuPDF
不然会有报错。
识别已经完成的图片,并转文字
#识别指定文件夹内的png,例如img/1,只需输入1
def ocr_dir(dir_path):
if isinstance(dir_path, int):
dir_path = str(dir_path)
# 初始化EasyOCR读取器
reader = easyocr.Reader(['ch_sim', 'en'])
# 读取png文件夹路径
# 设置文件夹路径
folder_path = 'img/'+dir_path
# 获取该文件夹下所有文件的路径
file_paths = []
for root, dirs, files in os.walk(folder_path):
for file in files:
file_path = os.path.join(root, file)
file_paths.append(file_path)
# 读取文本
texts = ""
for file_path in file_paths:
results = reader.readtext(file_path)
# 提取文本内容,去除坐标和可信度参数
for result in results:
texts += result[1]
# 打印提取的文本内容
texts+="\n"+"<__next_page__>"+"\n"
return texts
注释给的很全,关于easyocr的下载,大家可以先去网上参阅,室友叫我打星际争霸2,日后再补充。