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,这样即使快了几倍,最终的时间也没有太大差别。