Python基于easyocr和fitz实现的pdf转文字

文章描述了一个竞赛项目中使用EasyOCR进行OCR文字识别的过程。由于团队缺乏人工智能知识,选择了易用的EasyOCR库,但该库仅支持图片格式。因此,借助PyMuPDF将PDF转换为图片,然后通过EasyOCR识别图片中的文字。转换过程包括使用fitz打开PDF,调整图像大小和清晰度,保存为PNG图片,最后通过EasyOCR读取和转换图片文字。
摘要由CSDN通过智能技术生成

为了完成一个竞赛作品,需要自主开发一个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,日后再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值