鱼C论坛

 找回密码
 立即注册
查看: 1180|回复: 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文件转图片(按页转换)
# -*- 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-26 11:40:52 | 显示全部楼层
顶!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 14:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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