其他分享
首页 > 其他分享> > 通过PaddleOCR识别pdf数据

通过PaddleOCR识别pdf数据

作者:互联网

之所以要做这件事情,是因为子平的书有很多影印版,我们既要实证,又要有对应的断语。但一个个字手工输入,就会很麻烦而且辛苦,所以就想到是否通过Paddle识别再修正,这样自己一个人可以节省很多时间。
并不能直接识别pdf,需要做一些转换
1 将pdf转换为图片

import datetime
import os

import fitz  # fitz就是pip install PyMuPDF


def pyMuPDF_fitz(pdfPath, imagePath):
    startTime_pdf2img = datetime.datetime.now()  # 开始时间

    print("imagePath=" + imagePath)
    pdfDoc = fitz.open(pdfPath)
    for pg in range(76,pdfDoc.pageCount):
        page = pdfDoc[pg]
        rotate = int(0)
        # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
        # 此处若是不做设置,默认图片大小为:792X612, dpi=96
        zoom_x = 2  # (1.33333333-->1056x816)   (2-->1584x1224)
        zoom_y = 2
        mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pix = page.getPixmap(matrix=mat, alpha=False)

        if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
            os.makedirs(imagePath)  # 若图片文件夹不存在就创建

        pix.writePNG(imagePath + '/' + 'images_%s.png' % pg)  # 将图片写入指定的文件夹内

    endTime_pdf2img = datetime.datetime.now()  # 结束时间
    print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)


if __name__ == "__main__":
    # 1、PDF地址
    pdfPath = r'./file/006172_陈柏谕-专论企业家八字学.pdf'
    # 2、需要储存图片的目录
    imagePath = './imgs/qyj'
    pyMuPDF_fitz(pdfPath, imagePath)

2 图片识别数据

import os
from paddleocr import PaddleOCR
import datetime
import ocr_util
import re

def traversal_file(img_path,out_path):
    list = os.listdir(img_path)
    for i in range(0,len(list)):
        path = os.path.join(img_path,list[i])
        file_name = list[i][:-4]
        ocr_img(path, file_name, out_path)


def ocr_img(path,name,out_path):
    startTime_pdf2img = datetime.datetime.now()  # 开始时间
    ocr = PaddleOCR(use_angle_cls=True, lang='ch')
    result = ocr.ocr(path, cls=True)
    xy_info = ocr_util.xy_info(result)
    # xy_info.sort(key=lambda x:(x[2],-x[1]))
    # xy_info = sorted(xy_info, key=lambda x:(x[2],-x[1]))
    # xy_info = sorted(xy_info, key=lambda x:-x[1])
    xy_info.sort(key=lambda x:-x[1])
    # data = xy_info.sort(key=takeSecond)
    datas = []
    for xy in xy_info:
        if (len(xy[0])>4) and re.match(r'[\u4e00-\u9fa5]+',xy[0],re.S):
            datas.append(xy[0])
        # print(xy[0],xy[1],xy[2])
    # print(xy_info[0])
    if datas:
        file_path = os.path.join(out_path,name+'.txt')
        with open(file_path,'w',encoding='utf-8') as f:
            for line in datas:
                f.write(line+'\n')
    endTime_pdf2img = datetime.datetime.now()  # 结束时间
    print(name,'时间消耗', (endTime_pdf2img - startTime_pdf2img).seconds,'S')

if __name__ == "__main__":
    # img_path = r'imgs/qyj/images_76.png'
    # ocr_img(img_path, 'images_76', r'./txt')
    img_path = r'imgs/qyj'
    out_path = r'./txt'

根据左上角定点排序

def xy_info(results):
    '''

    :param results:
    :return:
    '''
    data_list = []
    for result in results:
        info = result[1][0]
        boxx,boxy = result[0][0]
        data_list.append([info,int(boxx),int(boxy)])
    return data_list

1
识别后的数据,准确率还是要调整

松下電器王厨的創業人丨經管之神:松下·幸之助
本造是享餐世界,
姓名督下幸之助
下幸之助之八字
松下氏之八字是身强之锡官格,命局以食傷澳秀生财需用
情又有力,加上一路吉通相助,故能建立麗大之企業王國·命局年月
雨柱喜神多松忌神,松下原本出身松良好家庭,但因子運(比月通)
父规經商失败,家境疑得赤贫如洗,使得松下氏小學果業之後就到工
氏在十除之年纪即已展现其商業才華·成通中数立松下電氣器具裂
作所,首先代事自行車橙之裂造版费,在其锐意經坐之下,公司不断
成長奥摘大,在联争结束之前即罐有一萬五千名作業员规模之事業
松下企業年营業额近五百镜美元之多
中未午已辰卵寅开子
甲类工辛庚己戊丁丙
新富且之經管之神
企業家的命例研究

标签:info,img,PaddleOCR,pdf2img,datetime,xy,pdf,path,识别
来源: https://blog.csdn.net/warrah/article/details/122647224