马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
使用百度 ,识别图片文本这里要用到百度AI接口
需要的部分库
pip install baidu-aip
from aip import AipOcr
import fitz # pdf转为图片
pip install PyMuPDF -i https://pypi.tuna.tsinghua.edu.cn/simple
import docx # 将识别结果保存为docx文件
pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple
1、PDF文件转图片(按页转换)
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 25 13:54:57 2022
@author: HH
"""
'''
将PDF转化为图片
pdfPath pdf文件的路径
imgPath 图像要保存的路径
zoom_x x方向的缩放系数
zoom_y y方向的缩放系数
rotation_angle 旋转角度
zoom_x和zoom_y一般取相同值,值越大,图像分辨率越高
返回目标pdf的名称和页数,便于下一步操作
'''
def pdf_image(pdfPath, imgPath, zoom_x=5, zoom_y=5, rotation_angle=0):
# 获取pdf文件名称
name = pdfPath.split("\")[-1].split('.pdf')[0]
# 打开PDF文件
pdf = fitz.open(pdfPath)
# 获取pdf页数
num = pdf.pageCount
# 逐页读取PDF
for pg in range(0, num):
page = pdf[pg]
# 设置缩放和旋转系数
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 开始写图像
pm.writePNG(imgPath + name + "_" + str(pg) + ".png")
pdf.close()
return name, num
import fitz
# pdf储存路径
pdfPath = r"D:\Desktop\识别\1.pdf"
# 图片和生成的docx文件的储存路径
imgPath = r"D:\Desktop\识别\picture2\"
pdf_image(pdfPath, imgPath)
2.图片转text
#-*- coding = uft-8 -*-
#@Time : 2020/5/20 10:15 上午
#@Author : J哥
#@File : pic_to_text.py
"""
利用百度api实现图片文本识别
"""
import glob #文件名模式匹配,不用遍历整个目录判断每个文件是不是符合
import os #操作文件的库
from os import path
from aip import AipOcr #调取百度AI接口所需库
from PIL import Image #处理图片的库
'''
picfile:原始图片路径
outdir:输出图片路径
'''
#调整原始图片
def convertimg(picfile, outdir):
# 解决报错 cannot write mode RGBA as JPEG
im = Image.open(picfile)
rgb_im = im.convert('RGB')
rgb_im.save(picfile)
img = Image.open(picfile)
width, height = img.size
while (width * height > 4000000): # 该数值压缩后的图片大约两百多k
width = width // 2 # '//'表示整数除法,例5//2=2
height = height // 2
new_img = img.resize((width, height), Image.BILINEAR) #重置图片大小和质量
'''
Image.NEAREST :低质量;Image.BILINEAR:双线性;Image.BICUBIC :三次样条插值;Image.ANTIALIAS:高质量
'''
new_img.save(path.join(outdir, os.path.basename(picfile))) #新图片保存在outdir即tmp目录下。os.path.basename(path)表示返回文件名。tmp/pic.jpg
# 利用百度api识别文本,并保存提取图片中的文字
def baiduOCR(picfile, outfile):
filename = path.basename(picfile) #将图片路径赋值给filename
APP_ID = 'xx' # 刚才获取的 ID,自己申请
API_KEY = 'xx'
SECRECT_KEY = 'xx'
client = AipOcr(APP_ID, API_KEY, SECRECT_KEY)
i = open(picfile, 'rb') #以二进制只读方式打开文件
'''
"r" 以读方式打开,只能读文件 , 如果文件不存在,会发生异常
"w" 以写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,先清空,再打开文件
"rb" 以二进制读方式打开,只能读文件 , 如果文件不存在,会发生异常
"wb" 以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,先清空,再打开文件
"a+": 附加读写方式打开
'''
img = i.read() #读取图片
print("正在识别图片:\t" + filename)
'''
\t表示缩进,相当于按一下Tab键
\n表示换行,相当于按一下Enter键
\n\t表示换行加缩进
'''
message = client.basicGeneral(img) # 通用文字识别,每天50000次免费
#message = client.basicAccurate(img) # 通用文字高精度识别,每天500次免费
print("识别成功!")
i.close() #关闭文件
# 文本识别结果输出为txt
with open(outfile, 'a+') as fo:
fo.writelines("+" * 60 + '\n') #分隔线,60个+表示
fo.writelines("识别图片:\t" + filename + "\n" * 2) #正在识别的图片名,并空两行
fo.writelines("文本内容:\n")
# 输出文本内容
for text in message.get('words_result'): #words_result识别结果数组,类型为array[]
#print(text)
fo.writelines(text.get('words') + '\n') #words识别结果字符串
fo.writelines('\n' * 2)
print("文本导出成功!")
if __name__ == "__main__":
outfile = 'export.txt' #输出文件
outdir = 'tmp' #临时文件
if path.exists(outfile):
os.remove(outfile) #如果输出文件已存在,删除
if not path.exists(outdir):
os.mkdir(outdir) #如果输出文件不存在,创建输出文件
print("压缩过大的图片...")
# 首先对过大的图片进行压缩,以提高识别速度,将压缩的图片保存到临时文件夹中
for picfile in glob.glob("picture2/*"): #遍历原始图片存放的文件夹
convertimg(picfile, outdir) #调整原始图片
print("图片识别...")
for picfile in glob.glob("tmp/*"): #遍历调整后的图片存放的文件夹
baiduOCR(picfile, outfile) #识别图片文本
os.remove(picfile) #识别后删除图片
print('图片文本提取结束!文本输出结果位于 %s 文件中。' % outfile)
os.removedirs(outdir) #递归删除目录,即如果子文件夹成功删除, removedirs()才尝试它们的父文件夹
3.图片形式的pdf转word
# -*- coding: utf-8 -*-
"""
Created on Mon Apr 25 14:02:49 2022
@author: HH
"""
import fitz # pdf转为图片
from aip import AipOcr # 图片文字识别
import time # 程序运行时间间隔以避免出错
import docx # 将识别结果保存为docx文件
from docx.oxml.ns import qn # 设置docx文件的字体
""" 你的 APPID AK SK """
APP_ID = 'xx' # 刚才获取的 ID,下同
API_KEY = 'xx'
SECRECT_KEY = 'xx'
client = AipOcr(APP_ID, API_KEY, SECRECT_KEY)
'''
将PDF转化为图片
pdfPath pdf文件的路径
imgPath 图像要保存的路径
zoom_x x方向的缩放系数
zoom_y y方向的缩放系数
rotation_angle 旋转角度
zoom_x和zoom_y一般取相同值,值越大,图像分辨率越高
返回目标pdf的名称和页数,便于下一步操作
'''
def pdf_image(pdfPath, imgPath, zoom_x=5, zoom_y=5, rotation_angle=0):
# 获取pdf文件名称
name = pdfPath.split("\")[-1].split('.pdf')[0]
# 打开PDF文件
pdf = fitz.open(pdfPath)
# 获取pdf页数
num = pdf.pageCount
# 逐页读取PDF
for pg in range(0, num):
page = pdf[pg]
# 设置缩放和旋转系数
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 开始写图像
pm.writePNG(imgPath + name + "_" + str(pg) + ".png")
pdf.close()
return name, num
'''
将图片读取为docx文件
imgPath 图像所在路径
生成的docx也保存在图像所在路径中
name为pdf名称(不含后缀)
num为pdf页数
name和num均可由上一个函数返回
'''
def ReadDetail_docx(imgPath, name, num):
# 建立一个空doc文档
doc = docx.Document()
# 设置全局字体
doc.styles["Normal"].font.name=u"宋体"
doc.styles["Normal"]._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 读取图片
for n in range(0,num):
i = open(imgPath+name+"_"+str(n)+".png",'rb')
time.sleep(0.1)
img = i.read()
message = client.basicGeneral(img)
content = message.get('words_result')
# 将内容写入doc文档
for i in range(len(content)):
doc.add_paragraph(content[i].get('words'))
# 保存doc文档
doc.save(imgPath + name + '.docx')
def pdf_to_docx(pdfPath, imgPath, zoom_x=5, zoom_y=5, rotation_angle=0):
print("正在将pdf文件转换为图片...")
# 调用函数一将pdf转换为图片,并获得文件名和页数
name_, num_ = pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle)
print("转换成功!")
print("正在读取图片内容...")
# 调用函数二逐页读取图片并逐行保存在docx文件中
ReadDetail_docx(imgPath, name_, num_)
print("名为 {}.pdf 的pdf文件共有{}页,已成功转换为docx文件!".format(name_, num_))
# pdf储存路径
pdf_path = r"D:\Desktop\识别\1.pdf"
# 图片和生成的docx文件的储存路径
img_path = r"D:\Desktop\识别\picture\"
# 调用函数
pdf_to_docx(pdf_path, img_path)
|