|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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)
复制代码 |
|