为了完成一个竞赛作品,需要自主开发一个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 + '\\' + filenameimagePath = 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=96zoom_x = 4  # (新型颅内支架Enterprise_省略_弹簧圈栓塞治疗颅内微小宽颈动脉瘤_黄海东.33333333-->1056x816)   (2-->1584x1224)zoom_y = 4mat = 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,日后再补充。

Python基于easyocr和fitz实现的pdf转文字相关推荐

  1. 【Python 基于EasyOCR库进行图片文字识别】

    文章目录 一.概况 目前支持的语言 二.安装指南(windows) 1.通过pip安装 2.通过源代码安装 三.代码运用OCR 要识别的图片 1.代码_I 识别结果_1 2.代码_II 识别结果_2 ...

  2. 通过Python的fitz库提取pdf中的图片

    文章目录 前言 一.fitz库是什么? 二.安装fitz库 三.查看fitz库版本 四.pymupdf库是什么? 五.安装pymupdf库 六.查看pymupdf库版本 七.fitz和pymupdf是 ...

  3. python基于dlib的face landmarks

    python基于dlib的face landmarks python使用dlib进行人脸检测与人脸关键点标记 Dlib简介: 首先给大家介绍一下Dlib Dlib是一个跨平台的C++公共库,除了线程支 ...

  4. Python基于YOLOv7和CRNN的车牌分割&识别系统(源码&教程)

    1.研究背景 随着科技的进步和社会需求的增长,近年来摄像头逐渐高清化.高帧率化,摄像头作为信息获取设备的载体也不再局限于固定场景.路口.路侧.室内.高位.低位等不同场景下产生了各种对于检测识别的需求, ...

  5. python处理PDF-通过关键词定位-截取PDF中的图表

    代码来源:python处理PDF-通过关键词定位-截取PDF中的图表 最近需要对pdf做一些处理,在这篇文章的基础上进行了修改. 运行时出现一些报错: AttributeError: 'Matrix' ...

  6. Python基于OpenCV的智能交通灯系统(南北车流量比例)

    1.研究背景: 在传统城市道路交通信号灯的应用过程中,存在专业技术人员较缺乏.项目投入资金少.信号灯故障抢修较困难等问题,为城市居民生活与出行带来极大不便.对此,文章进行深入研究,分析了城市道路智慧交 ...

  7. Python基于OpenCV的智能交通灯系统(南北车流量比例)[源码&部署教程]

    1.研究背景: 在传统城市道路交通信号灯的应用过程中,存在专业技术人员较缺乏.项目投入资金少.信号灯故障抢修较困难等问题,为城市居民生活与出行带来极大不便.对此,文章进行深入研究,分析了城市道路智慧交 ...

  8. Python脚本工具,PyMuPDF批量提取PDF文件中的图片

    如何批量快速提取出PDF中的图片文件,你是否遇到这样的一个问题,尤其是PPT文件转换为PDF文件,需要快速提取其中的图片文件,如果你恰好会那么一点py,同时复制粘贴没问题的话,那么相信你也能够很轻松的 ...

  9. Python基于MASK信息抽取ROI子图并构建基于迁移学习(densenet)的图像分类器实战(原始影像和mask文件都是二维的情况)

    Python基于MASK信息抽取ROI子图并构建基于迁移学习(densenet)的图像分类器实战(原始影像和mask文件都是二维的情况) 目录

最新文章

  1. sql server 2008数据导入Oracle方法
  2. c# 传递Null的string值导致的调用C++的dll报错 Attempted to read or write protected memory.
  3. vue main.js中引入js_web前端的同学不容错过,大厂Vue最佳实践总结,提高竞争力...
  4. 剑指offer试题(PHP篇一)
  5. R语言观察日志(part16)--Google‘s R Style Guide
  6. 前端学习(1737):前端调试值测试窗口的切换
  7. java selenium (十二) 操作弹出窗口
  8. 回首我的2007 12/25
  9. java连接打印机访问被拒绝_java – 尝试访问spring security中的登录页面时访问被拒绝的异常...
  10. JavaScript中的 in 操作符
  11. 家里安装宽带,另一个房子相距150米怎么连网?
  12. 射频微波天线知识点整理
  13. 更改stata外部命令存放位置
  14. 实时操作系统与分时操作系统原理详解——经典
  15. N次剩余 最基础的laji入门
  16. 在angular中实现图片/视频的预览
  17. TS中限制某种类型的传递
  18. 【Mysql进阶-3】大量实例悟透EXPLAIN与慢查询
  19. 94、图解:网络硬件的发展史
  20. 【技术类】【ArcGIS对国产卫星的支持2:高分一号卫星】篇1、ArcGIS RasterType Extension for Chinese Satellites 2.0插件介绍

热门文章

  1. android GPS驱动
  2. P01 滴水逆向公开课1月3号
  3. 洛古最简单50题解(1-10)
  4. golddata和const app = getApp()
  5. iqooneo5支持鸿蒙系统吗,标配鸿蒙系统、华为三大旗舰推4G版:或为避免P50芯片短缺...
  6. 113个JAVA计算机毕业设计项目全揭秘,一站式,省时省心
  7. 交易猫不显示服务器,交易猫上号器一直显示检查游戏环境
  8. 2021年中国研究生数学建模竞赛E题——信号干扰下的超宽带(UWB)精确定位问题
  9. 达梦数据库数据复制_yxy
  10. 【报告分享】2021花西子品牌分析报告:东方彩妆,以花养妆.pdf(附下载链接)...