python提取pdf文字包括直接解析和ocr两种方式

1、可以直接提取的pdf

from io import StringIO
from io import open
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfinterp import PDFResourceManager, process_pdf
 
def read_pdf(pdf):
    # resource manager
    rsrcmgr = PDFResourceManager()
    retstr = StringIO()
    laparams = LAParams()
    # device
    device = TextConverter(rsrcmgr, retstr, laparams=laparams)
    process_pdf(rsrcmgr, device, pdf)
    device.close()
    content = retstr.getvalue()
    retstr.close()
    # 获取所有行
    lines = str(content).split("\n")
    return lines

with open('123.pdf', "rb") as my_pdf:
    with open('result.txt','w+') as f:
        for x in read_pdf(my_pdf):
            f.write(x)

2、需要ocr的pdf

选用了百度飞桨paddleocr解析

# 安装fitz需要安装PyMuPDF才能使用

import fitz
import time
import os
from paddleocr import PaddleOCR
ocr = PaddleOCR(det=False,use_gpu= False,enable_mkldnn=True,use_tensorrt=True,use_angle_cls=True,lang='ch')
def pdf_to_jpg(name):

    pdfdoc=fitz.open(name)
    temp = 0
    for pg in range(pdfdoc.page_count):
        page = pdfdoc[pg]
        rotate = int(0)
        # 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
        zoom_x = 2.0
        zoom_y =2.0
        trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
        pm = page.get_pixmap(matrix=trans, alpha=False)
        pm._writeIMG('temp.jpg',1)

        #ocr识别
        result =ocr.ocr('temp.jpg', cls=True)

        #提取文件名
        xx=os.path.splitext(name)
        filename=xx[0].split('\\')[-1]+'.txt'
        #存储结果
        with open(filename,mode='a') as f:
            for line in result:
                if line[1][1]>0.5:
                    f.write(line[1][0]+'\n')
        print(pg)
pdf_to_jpg(r'234.pdf')

mkldnn的作用是为cpu运行网络加速;

mkldnn是intel开发的开源项目,就是针对cpu上运行神经网络做了一些并行优化;但并不是针对所有模型都有效,比如:你跑一个模型,这些指令集应该是会加速一部分操作的速度,但是可能你跑的最耗时的操作并没有被加速,即使一部分速度的提升也看不出效果。比如最耗时的操作要2秒,被加速的指令需要100ms,这样即使快了几倍,最终的时间也没有太大差别。

posted on 2022-07-19 15:35  耀扬  阅读(2734)  评论(0编辑  收藏  举报

导航