鱼C论坛

 找回密码
 立即注册
查看: 1340|回复: 1

[技术交流] python PDF扫描/图片转word/txt,音乐百度api

[复制链接]
发表于 2022-4-26 09:22:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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文件转图片(按页转换)

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Apr 25 13:54:57 2022

  4. @author: HH
  5. """

  6. '''
  7. 将PDF转化为图片
  8. pdfPath pdf文件的路径
  9. imgPath 图像要保存的路径
  10. zoom_x x方向的缩放系数
  11. zoom_y y方向的缩放系数
  12. rotation_angle 旋转角度
  13. zoom_x和zoom_y一般取相同值,值越大,图像分辨率越高
  14. 返回目标pdf的名称和页数,便于下一步操作

  15. '''
  16. def pdf_image(pdfPath, imgPath, zoom_x=5, zoom_y=5, rotation_angle=0):
  17.     # 获取pdf文件名称
  18.     name = pdfPath.split("\")[-1].split('.pdf')[0]
  19.     # 打开PDF文件
  20.     pdf = fitz.open(pdfPath)
  21.     # 获取pdf页数
  22.     num = pdf.pageCount
  23.     # 逐页读取PDF
  24.     for pg in range(0, num):
  25.         page = pdf[pg]
  26.         # 设置缩放和旋转系数
  27.         trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
  28.         pm = page.getPixmap(matrix=trans, alpha=False)
  29.         # 开始写图像
  30.         pm.writePNG(imgPath + name + "_" + str(pg) + ".png")
  31.     pdf.close()
  32.     return name, num

  33. import fitz

  34. # pdf储存路径
  35. pdfPath = r"D:\Desktop\识别\1.pdf"
  36. # 图片和生成的docx文件的储存路径
  37. imgPath = r"D:\Desktop\识别\picture2\"
  38. pdf_image(pdfPath, imgPath)
复制代码


2.图片转text

  1. #-*- coding = uft-8 -*-
  2. #@Time : 2020/5/20 10:15 上午
  3. #@Author : J哥
  4. #@File : pic_to_text.py

  5. """
  6. 利用百度api实现图片文本识别
  7. """

  8. import glob  #文件名模式匹配,不用遍历整个目录判断每个文件是不是符合
  9. import os  #操作文件的库
  10. from os import path
  11. from aip import AipOcr  #调取百度AI接口所需库
  12. from PIL import Image   #处理图片的库

  13. '''
  14. picfile:原始图片路径
  15. outdir:输出图片路径
  16. '''

  17. #调整原始图片
  18. def convertimg(picfile, outdir):

  19.     # 解决报错 cannot write mode RGBA as JPEG
  20.     im = Image.open(picfile)
  21.     rgb_im = im.convert('RGB')
  22.     rgb_im.save(picfile)
  23.    
  24.     img = Image.open(picfile)
  25.     width, height = img.size
  26.     while (width * height > 4000000):  # 该数值压缩后的图片大约两百多k
  27.         width = width // 2   # '//'表示整数除法,例5//2=2
  28.         height = height // 2
  29.     new_img = img.resize((width, height), Image.BILINEAR)   #重置图片大小和质量
  30.     '''
  31.     Image.NEAREST :低质量;Image.BILINEAR:双线性;Image.BICUBIC :三次样条插值;Image.ANTIALIAS:高质量
  32.     '''
  33.     new_img.save(path.join(outdir, os.path.basename(picfile))) #新图片保存在outdir即tmp目录下。os.path.basename(path)表示返回文件名。tmp/pic.jpg


  34. # 利用百度api识别文本,并保存提取图片中的文字
  35. def baiduOCR(picfile, outfile):
  36.     filename = path.basename(picfile) #将图片路径赋值给filename

  37.     APP_ID = 'xx'  # 刚才获取的 ID,自己申请
  38.     API_KEY = 'xx'
  39.     SECRECT_KEY = 'xx'
  40.     client = AipOcr(APP_ID, API_KEY, SECRECT_KEY)

  41.     i = open(picfile, 'rb') #以二进制只读方式打开文件

  42.     '''
  43.     "r" 以读方式打开,只能读文件 , 如果文件不存在,会发生异常      
  44.     "w"  以写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,先清空,再打开文件   
  45.     "rb" 以二进制读方式打开,只能读文件 , 如果文件不存在,会发生异常      
  46.     "wb" 以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,先清空,再打开文件
  47.     "a+": 附加读写方式打开
  48.     '''

  49.     img = i.read()  #读取图片
  50.     print("正在识别图片:\t" + filename)

  51.     '''
  52.     \t表示缩进,相当于按一下Tab键
  53.     \n表示换行,相当于按一下Enter键
  54.     \n\t表示换行加缩进
  55.     '''

  56.     message = client.basicGeneral(img)  # 通用文字识别,每天50000次免费
  57.     #message = client.basicAccurate(img)   # 通用文字高精度识别,每天500次免费
  58.     print("识别成功!")
  59.     i.close() #关闭文件

  60. # 文本识别结果输出为txt
  61.     with open(outfile, 'a+') as fo:
  62.         fo.writelines("+" * 60 + '\n')   #分隔线,60个+表示
  63.         fo.writelines("识别图片:\t" + filename + "\n" * 2)  #正在识别的图片名,并空两行
  64.         fo.writelines("文本内容:\n")
  65.         # 输出文本内容
  66.         for text in message.get('words_result'):  #words_result识别结果数组,类型为array[]
  67.             #print(text)
  68.             fo.writelines(text.get('words') + '\n')  #words识别结果字符串
  69.         fo.writelines('\n' * 2)
  70.     print("文本导出成功!")


  71. if __name__ == "__main__":

  72.     outfile = 'export.txt'  #输出文件
  73.     outdir = 'tmp'  #临时文件
  74.     if path.exists(outfile):
  75.         os.remove(outfile)  #如果输出文件已存在,删除
  76.     if not path.exists(outdir):
  77.         os.mkdir(outdir) #如果输出文件不存在,创建输出文件
  78.     print("压缩过大的图片...")
  79.     # 首先对过大的图片进行压缩,以提高识别速度,将压缩的图片保存到临时文件夹中
  80.     for picfile in glob.glob("picture2/*"):  #遍历原始图片存放的文件夹
  81.         convertimg(picfile, outdir)  #调整原始图片
  82.     print("图片识别...")
  83.     for picfile in glob.glob("tmp/*"):  #遍历调整后的图片存放的文件夹
  84.         baiduOCR(picfile, outfile)  #识别图片文本
  85.         os.remove(picfile)  #识别后删除图片
  86.     print('图片文本提取结束!文本输出结果位于 %s 文件中。' % outfile)
  87.     os.removedirs(outdir) #递归删除目录,即如果子文件夹成功删除, removedirs()才尝试它们的父文件夹
复制代码


3.图片形式的pdf转word

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Mon Apr 25 14:02:49 2022

  4. @author: HH
  5. """

  6. import fitz # pdf转为图片
  7. from aip import AipOcr # 图片文字识别
  8. import time # 程序运行时间间隔以避免出错
  9. import docx # 将识别结果保存为docx文件
  10. from docx.oxml.ns import qn # 设置docx文件的字体

  11. """ 你的 APPID AK SK """
  12. APP_ID = 'xx'  # 刚才获取的 ID,下同
  13. API_KEY = 'xx'
  14. SECRECT_KEY = 'xx'
  15. client = AipOcr(APP_ID, API_KEY, SECRECT_KEY)


  16. '''
  17. 将PDF转化为图片
  18. pdfPath pdf文件的路径
  19. imgPath 图像要保存的路径
  20. zoom_x x方向的缩放系数
  21. zoom_y y方向的缩放系数
  22. rotation_angle 旋转角度
  23. zoom_x和zoom_y一般取相同值,值越大,图像分辨率越高
  24. 返回目标pdf的名称和页数,便于下一步操作

  25. '''
  26. def pdf_image(pdfPath, imgPath, zoom_x=5, zoom_y=5, rotation_angle=0):
  27.     # 获取pdf文件名称
  28.     name = pdfPath.split("\")[-1].split('.pdf')[0]
  29.     # 打开PDF文件
  30.     pdf = fitz.open(pdfPath)
  31.     # 获取pdf页数
  32.     num = pdf.pageCount
  33.     # 逐页读取PDF
  34.     for pg in range(0, num):
  35.         page = pdf[pg]
  36.         # 设置缩放和旋转系数
  37.         trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
  38.         pm = page.getPixmap(matrix=trans, alpha=False)
  39.         # 开始写图像
  40.         pm.writePNG(imgPath + name + "_" + str(pg) + ".png")
  41.     pdf.close()
  42.     return name, num
  43.    
  44. '''
  45. 将图片读取为docx文件
  46. imgPath 图像所在路径
  47. 生成的docx也保存在图像所在路径中
  48. name为pdf名称(不含后缀)
  49. num为pdf页数
  50. name和num均可由上一个函数返回

  51. '''
  52. def ReadDetail_docx(imgPath, name, num):
  53.     # 建立一个空doc文档
  54.     doc = docx.Document()
  55.     # 设置全局字体
  56.     doc.styles["Normal"].font.name=u"宋体"
  57.     doc.styles["Normal"]._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
  58.     # 读取图片
  59.     for n in range(0,num):
  60.         i = open(imgPath+name+"_"+str(n)+".png",'rb')
  61.         time.sleep(0.1)
  62.         img = i.read()
  63.         message = client.basicGeneral(img)
  64.         content = message.get('words_result')
  65.         # 将内容写入doc文档
  66.         for i in range(len(content)):
  67.             doc.add_paragraph(content[i].get('words'))
  68.     # 保存doc文档
  69.     doc.save(imgPath + name + '.docx')
  70.    
  71.    
  72. def pdf_to_docx(pdfPath, imgPath, zoom_x=5, zoom_y=5, rotation_angle=0):
  73.     print("正在将pdf文件转换为图片...")
  74.     # 调用函数一将pdf转换为图片,并获得文件名和页数
  75.     name_, num_ = pdf_image(pdfPath, imgPath, zoom_x, zoom_y, rotation_angle)
  76.     print("转换成功!")
  77.     print("正在读取图片内容...")
  78.     # 调用函数二逐页读取图片并逐行保存在docx文件中
  79.     ReadDetail_docx(imgPath, name_, num_)
  80.     print("名为 {}.pdf 的pdf文件共有{}页,已成功转换为docx文件!".format(name_, num_))
  81.    
  82. # pdf储存路径
  83. pdf_path = r"D:\Desktop\识别\1.pdf"
  84. # 图片和生成的docx文件的储存路径
  85. img_path = r"D:\Desktop\识别\picture\"
  86. # 调用函数
  87. pdf_to_docx(pdf_path, img_path)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-26 11:40:52 | 显示全部楼层
顶!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-29 04:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表