Python实现PDF转换文本详解
作者:幸福清风 发布时间:2022-09-04 13:40:52
一、前言
对很多人来说,将PDF转换为可编辑的文本是个刚需,却苦于没有简单的方法。发现 pdf 幻灯片,效果还不错。
传统的讲座通常伴随有很多pdf幻灯片。一般来说,想要对自己的讲座做笔记,需要从pdf复制、补充大量内容。
最近,来自 K1 Digital 的高级机器工程师 Lucas Soares 一直在尝试通过使用 CR(光学字符识别)自动 pdf 幻灯片,以便直接在 Markdown 文件中操作它们的内容,从而避免手动复制和粘贴 pdf 内容,实现这个过程的自动化。
图为项目作者卢卡斯·苏亚雷斯。
1.1、为什么不使用传统的pdf 转文本工具呢?
Lucas Soares 发现传统工具往往会带来更多的问题,需要花时间解决。他曾尝试使用传统的 Python 软件包,但遇到了很多问题(例如必须使用复杂的正则表达式模式解析最终输出等),因此决定尝试使用目标检测和 OCR 来解决。
二、实现过程
基本过程可分为以下几个步骤:
将 pdf 转换为图片;
检测和识别图像中的文本;
展示示例输出。
2.1、基于深度学习的 OCR 将 pdf 为文本
2.1.1、将 pdf 转换为图像
Soares 使用的 pdf 幻灯片来自于 David Silver 的增长学习(参见以下 pdf 幻灯片地址)。使用「pdf2image」包将每张幻灯片转换为 png 图像格式。
pdf 幻灯片示例。
地址:https://www.davidsilver.uk/wp-content/uploads/2020/03/intro_RL.pdf
代码如下:
from pdf2image import convert_from_path
from pdf2image.exceptions import (
PDFInfoNotInstalledError,
PDFPageCountError,
PDFSyntaxError
)
pdf_path = "path/to/file/intro_RL_Lecture1.pdf"
images = convert_from_path(pdf_path)
for i, image in enumerate(images):
fname = "image" + str(i) + ".png"
image.save(fname, "PNG")
经过处理后,所有的pdf幻灯片都转换成png格式的图片:
2.1.2、检测和识别图像中的文本
为了检测和识别png图像中的文本,Soares使用ocr.pytorch库中的文本检测器。按照说明下载模型保存模型保存在检查点文件夹中。
ocr.pytorch 库地址:https://github.com/courao/ocr.pytorch
代码如下:
# adapted from this source: https://github.com/courao/ocr.pytorch
%load_ext autoreload
%autoreload 2
import os
from ocr import ocr
import time
import shutil
import numpy as np
import pathlib
from PIL import Image
from glob import glob
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
import pytesseract
def single_pic_proc(image_file):
image = np.array(Image.open(image_file).convert('RGB'))
result, image_framed = ocr(image)
return result,image_framed
image_files = glob('./input_images/*.*')
result_dir = './output_images_with_boxes/'
# If the output folder exists we will remove it and redo it.
if os.path.exists(result_dir):
shutil.rmtree(result_dir)
os.mkdir(result_dir)
for image_file in sorted(image_files):
result, image_framed = single_pic_proc(image_file) # detecting and recognizing the text
filename = pathlib.Path(image_file).name
output_file = os.path.join(result_dir, image_file.split('/')[-1])
txt_file = os.path.join(result_dir, image_file.split('/')[-1].split('.')[0]+'.txt')
txt_f = open(txt_file, 'w')
Image.fromarray(image_framed).save(output_file)
for key in result:
txt_f.write(result[key][1]+'\n')
txt_f.close()
设置输入和输出文件夹,接着遍历所有输入图像(转换后的pdf幻灯片),然后通过single_pic_proc()函数运行OCR模块中的检测和识别模型,最后将输出保存到输出文件夹。
从检测继承(inherit)了Pytorch CTPN,识别了Pytorch CRNN,模型都存在于OCR模块中。
2.1.3、示例输出
代码如下:
import cv2 as cv
output_dir = pathlib.Path("./output_images_with_boxes")
# image = cv.imread(str(np.random.choice(list(output_dir.iterdir()),1)[0]))
image = cv.imread(f"{output_dir}/image7.png")
size_reshaped = (int(image.shape[1]),int(image.shape[0]))
image = cv.resize(image, size_reshaped)
cv.imshow("image", image)
cv.waitKey(0)
cv.destroyAllWindows()
下图左为原始pdf 幻灯片,图右为脑后的输出文本,准确率非常高。
文本识别输出如下:
filename = f"{output_dir}/image7.txt"
with open(filename, "r") as text:
for line in text.readlines():
print(line.strip("\n"))
通过上述方法,最终可以得到一个非常强大的工具来讨论文档,从检测和识别手写笔记到检测和识别照片中的随机。
拥有文本的 OCR 工具来处理一些文本内容,这比依赖外部软件来说明文档要好得多。
来源:https://blog.csdn.net/xun527/article/details/120651886


猜你喜欢
- 下面就是JavaScript实现大文件上传功能的代码bigFileUpload.jsconst path = require('pa
- 详解python中 os._exit() 和 sys.exit(), exit(0)和exit(1) 的用法和区别os._exit() 和
- 本文实例讲述了Python过滤列表用法。分享给大家供大家参考,具体如下:过滤列表[mapping-expression for elemen
- 本文实例讲述了golang的HTTP基本认证机制。分享给大家供大家参考,具体如下:看了<<http权威指南>>第12
- iframe的背景颜色在IE下为window的当前窗口颜色(默认白色,可以在显示外观处对其进行设置),这导致在大幅背景上插入iframe时,
- 关于SQL查询效率,100w数据,查询只要1秒,与您分享:机器情况:p4: 2.4内存: 1 Gos: windows 2003数据库:SQ
- 在django操作数据库的时候如何找出内容不为空的数据呢?from django.db.models import Qclass Index
- 编写Python SDK代码工程目录结构├──── easyhttp
- 测试环境为Windows 10 系统,Python3.7,转换需要提前安装pydub、ffmpeg,安装和加入环境变量配置方法自行解决,至于
- git和svn有什么区别呢?git采用分布式版本库管理,而svn采用集中式版本库管理。集中式版本库管理需要有一台存放版本库的服务器,开发人员
- 1. OS标准库简介顾名思义,OS表示Operating System,即操作系统。OS标准库是一个操作系统接口模块,提供一些方便使用操作系
- 问题怎样实现一个按优先级排序的队列? 并且在这个队列上面每次 pop 操作总是返回优先级最高的那个元素解决方案下面的类利用 heapq 模块
- 需要准备的环境:一个B站账号,需要先登录,否则不能查看历史弹幕记录联网的电脑和顺手的浏览器,我用的ChromePython3环境以及requ
- Python获取时间范围内日期列表和周列表的函数 1、获取日期列表# -*- coding=utf-8 -*-import datetime
- 目录执行原生 SQL 查询1、执行原生查询1.1 普通查询1.2 将查询字段映射为模型字段1.3 索引查询1.4 将参数传给 raw()2、
- 1 关联查询的执行关联查询的执行过程是:先遍历关联表t1(驱动表,全表扫描),然后根据从表t1中取出的每行数据中的a值,去表t2(被关联表,
- 前言上一次简单了解了协程的工作原理 前文链接最后提到了几个使用协程时会遇到的问题,其中一个就是主线程不会等待子线程结束,在这里记录两种比较简
- 计时器setTimeout()和setInterval()两个都是js的计时功能的函数两个有些区别。 setTimeout(): 在js手册
- 最小化安装Python8后安装Python3.8.1,网上找了一圈教程,没有一个能完全成功的。或者能安装成功,但pip无法使用。最后根据多个
- 写了个小程序:功能1.测试远程ssh连接是否成功,2.批量执行远程ssh命令效果如下:代码如下:#-*- coding:utf-8 -*-i