Python 实现 PDF 文件转换为图片 / PaddleOCR

2023-09-22 15:24:34

文章用于学习记录


前言

文字识别(Optical Character Recognition,简称OCR)是指将图片、扫描件或PDF、OFD文档中的打印字符进行检测识别成可编辑的文本格式。


一、PDF 文件转换为图片

import datetime
import os

import fitz  #pip install PyMuPDF


def pyMuPDF_fitz(pdfPath, imagePath):
    startTime_pdf2img = datetime.datetime.now()  # 开始时间

    print("imagePath=" + imagePath)
    pdfDoc = fitz.open(pdfPath)
    for pg in range(pdfDoc.pageCount):
        page = pdfDoc[pg]
        rotate = int(0)
        # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
        # 此处若是不做设置,默认图片大小为:792X612, dpi=96
        zoom_x = 1.33333333  # (1.33333333-->1056x816)   (2-->1584x1224)
        zoom_y = 1.33333333
        mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pix = page.getPixmap(matrix=mat, alpha=False)

        if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
            os.makedirs(imagePath)  # 若图片文件夹不存在就创建

        pix.writePNG(imagePath + '/' + 'images_%s.png' % pg)  # 将图片写入指定的文件夹内

    endTime_pdf2img = datetime.datetime.now()  # 结束时间
    print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)


if __name__ == "__main__":
    # 1、PDF地址
    pdfPath = './pdf/note.pdf'
    # 2、需要储存图片的目录
    imagePath = 'pdf'
    pyMuPDF_fitz(pdfPath, imagePath)

在这里插入图片描述

在这里插入图片描述

  • 将 preRotate 改为 prerotate

在这里插入图片描述

  • 将 getPixmap 改为 get_pixmap

在这里插入图片描述

  • 将 writePNG 改为 save
  • 这是要转换的 PDF 文件

在这里插入图片描述

  • 修改后
import datetime
import os

import fitz  # fitz就是pip install PyMuPDF


def pyMuPDF_fitz(pdfPath, imagePath):
    startTime_pdf2img = datetime.datetime.now()  # 开始时间

    print("imagePath=" + imagePath)
    pdfDoc = fitz.open(pdfPath)
    for pg in range(pdfDoc.page_count):
        page = pdfDoc[pg]
        rotate = int(0)
        # 每个尺寸的缩放系数为1.3,这将为我们生成分辨率提高2.6的图像。
        # 此处若是不做设置,默认图片大小为:792X612, dpi=96
        zoom_x = 1.33333333  # (1.33333333-->1056x816)   (2-->1584x1224)
        zoom_y = 1.33333333
        mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
        pix = page.get_pixmap(matrix=mat, alpha=False)

        if not os.path.exists(imagePath):  # 判断存放图片的文件夹是否存在
            os.makedirs(imagePath)  # 若图片文件夹不存在就创建

        pix.save(imagePath + '/' + 'images_%s.png' % pg)  # 将图片写入指定的文件夹内

    endTime_pdf2img = datetime.datetime.now()  # 结束时间
    print('pdf2img时间=', (endTime_pdf2img - startTime_pdf2img).seconds)


if __name__ == "__main__":
    # 1、PDF地址
    pdfPath = r'D:\BaiduNetdiskDownload\PaddleOCR-release-2.7\PaddleOCR-release-2.7\pdf\note.pdf'
    # 2、需要储存图片的目录
    imagePath = r'D:\BaiduNetdiskDownload\PaddleOCR-release-2.7\PaddleOCR-release-2.7\pdf'
    pyMuPDF_fitz(pdfPath, imagePath)
  • 这是转换后的两张图片

在这里插入图片描述

二、OCR 图片文字识别提取

from paddleocr import PaddleOCR, draw_ocr

# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch")  # need to run only once to download and load model into memory
img_path = './pdf/images_0.png'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
    res = result[idx]
    for line in res:
        print(line)

# 显示结果
# 如果本地没有simfang.ttf,可以在doc/fonts目录下下载
from PIL import Image

result = result[0]
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、服务器端下载运行 PaddleOCR

git clone https://github.com/PaddlePaddle/PaddleOCR.git

在这里插入图片描述

# 进入 pytorch 虚拟环境
conda activate pytorch

# 命令行进入 PaddleOCR 文件夹下
cd PaddleOCR

# 识别单张图片
python tools/infer/predict_system.py --image_dir="./doc/imgs/11.jpg" --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer/"  --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/" --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" --use_angle_cls=True --use_space_char=True --use_gpu=False

在这里插入图片描述

报错 not find model.pdmodel or inference.pdmodel in ./inference/ch_ppocr_mobile_v2.0_det_infer/

四、下载权重文件

# 检测权重
https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_det_infer.tar

# 方向分类权重
https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar

# 识别权重
https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_rec_infer.tar
  • 创建一个 inference 文件夹,把前面解压后的三个文件夹放入 inference 中,
  • 再把 inference 文件夹放入 PaddleOCR 中,最终树形目录结构效果如下:

在这里插入图片描述

  • 再次检测,报错问题解决

在这里插入图片描述
在这里插入图片描述


总结

以上就是 Python 实现 PDF 文件转换为图片以及快速使用 PaddleOCR 过程。
更多推荐

【web开发】10、数据统计(echarts)--柱状图、折线图、饼图

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、echarts是什么?二、使用步骤1.引入CDN2.设置高度&宽度3.后端4.前端前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础

CAD丢失mfc140u.dll怎么办,mfc140u.dll丢失的解决方法分享

许多用户在运行AutoCAD时可能会遇到一个问题:丢失mfc140u.dll文件,导致软件无法正常运行。本文将详细介绍mfc140u.dll文件的作用,以及如何解决丢失mfc140u.dll文件的问题。一、mfc140u.dll文件的作用MFC(MicrosoftFoundationClass)是一个由微软公司开发的C

量子计算基础知识—Part1

1.什么是量子计算机?量子计算机是基于量子力学原理构建的机器,采用了一种新的方法来处理信息,从而使其具有超强的功能。量子计算机使用Qubits处理信息。2.什么是量子系统?一个量子系统指的是由量子力学规则描述和控制的物理系统。在量子力学中,物理系统的状态不再是经典物理中的确定性值,而是由一个称为波函数的数学对象描述的概

接入国家能源平台MQTT应用案例

一、项目介绍随着国家对节能环保措施的力度不断加大,基于物联网技术搭建的国家能源平台在国家相关部门的建设下逐渐成熟。致力于利用实际能耗数据建立能效仿真模型,通过实时寻优运算,获得当前的最优化运行策略,并将控制指令下发控制系统,快速帮助能源全面实现自身能源管理的信息化、流程化、可视化和可操作性。二、项目所面临的问题1.常规

Mac电脑系统怎么样才能干干净净地卸载应用程序?

Mac系统怎么样才能干干净净地卸载应用程序,不留下隐私数据和用户信息呢?如果有方法的话,那么该方法对于Mac电脑小白是否友好呢?CleanMyMac就是一款用于清理Mac系统下应用程序的一款清理工具,其内置了应用程序的安全卸载功能,保证了软件的彻底卸载。下面小编使用CleanMyMacX版本,带大家看看如何使用它干净地

Scotch: Combining SGX and SMM to Monitor Cloud Resource Usage【TEE的应用】

目录摘要引言贡献背景SMMXenCreditScheduler与资源核算SGX威胁模型SchedulerattacksResourceinterferenceattacksVMEscapeattacks架构ResourceAccountingWorkflowCostofAccounting具体的部署和评估见论文相关工作

自监督学习之对比学习:MoCo模型超级详解解读+总结

文章目录一、MoCo简介1.1整体思想1.2动量1.3正负样本如何选取二、动态字典2.1query和key2.2字典特点三、编码器的动量更新3.1编码器的更新规则3.2使用动量更新的原因四、实验过程4.1目标函数:infoNCE4.1.1softmax4.1.2交叉熵损失4.1.3交叉熵损失函数和softmax的关系4

比特币 ZK 赏金系列:第 2 部分——查找哈希冲突

在我们的零知识赏金(ZKB)系列的第二部分中,我们将其应用于解决哈希冲突难题。在这样的谜题中,两个不同的输入散列到相同的输出。此类赏金可用于:充当煤矿中的金丝雀,给我们一个有价值的提醒。存在冲突是散列函数较弱的标志,因此我们可以尽早升级以减轻损失。资助研究以发现哈希函数中的漏洞,特别是对于MiMC等新函数。碰撞攻击历史

前端工程化面试题

下面的模块导出了什么结果?exports.a='a';module.exports.b='b';this.c='c';module.exports={d:'d'}参考答案:{d:'d'}说一下你对前端工程化,模块化,组件化的理解?参考答案:这三者中,模块化是基础,没有模块化,就没有组件化和工程化模块化的出现,解决了困扰

4 vCPU 实例达成 100 万 JSON API 请求/秒的优化实践

“性能工程”(Performanceengineering)是个日渐流行的概念。顾名思义“性能工程”是包含在系统开发生命周期中所应用的一个技术分支,其目的就是确保满足非功能性的性能需求,例如:性能、可靠性等。由于现代软件系统变得日益复杂,我们在对抗性能这个凸显的挑战的时候往往显得无措手足,或者照本宣科的尝试一些偏方,寄

人脸修复祛马赛克算法CodeFormer——C++与Python模型部署

一、人脸修复算法1.算法简介CodeFormer是一种基于AI技术深度学习的人脸复原模型,由南洋理工大学和商汤科技联合研究中心联合开发,它能够接收模糊或马赛克图像作为输入,并生成更清晰的原始图像。算法源码地址:https://github.com/sczhou/CodeFormer这种技术在图像修复、图像增强和隐私保护

热文推荐