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
猜你喜欢
- 多线程锁lock=threading.Lock()使用疑问多线程任务是同时执行的,如果我们需要先执行线程a,再执行线程b,需要怎么办呢?解决
- 在项目里碰到需要把类似'450000'的数字转换为会计记账所用的格式,'450,000.00',分隔千分位和
- Function getIpvalue(clientIP)'得到客户端的IP转换成长整型,返回值getIpvalue&nb
- 环境:A机器和B机器都是LINUX系统,但由于B机器已经空间不足,所以停掉不停操作数据库的服务后 ,准备在A机器进行导出操作。导出语句 ex
- 一:什么是数据库镜像?Robidoux:数据库镜像是将数据库事务处理从一个SQL Server数据库移动到不同SQL Server环境中的另
- bytes 和 bytearraybytes 和 bytearray 都是二进制世界的成员,用二进制的方式去理解才能看清他的本质。理解byt
- 前言数据来源:population_data.json,先看一下数据长啥样[ { "Coun
- 记录训练过程中的每一步的loss变化 if verbose and step % verbose == 0: sys.stdout.writ
- 1.数据集分割通过datasets可以直接分别获取训练集和测试集。通常我们会将训练集进行分割,通过torch.utils.data.rand
- PDO::inTransactionPDO::inTransaction — 检查是否在一个事务内(PHP 5 >= 5.3.3, B
- 例如我们有如下结构的文件:pkg/ __init__.py libs/ some_lib.py __init__.py components
- 相信很多与页面打过交道的同学都对 Yahoo 的 Best Practices for Speeding Up Your Web Site
- 学了python后,之前一些我们常用的方法,也可以换一种思路用python中的知识来解决。相信操作出来后,能收获一大批小粉丝们。就像我们没学
- ip正则式为:r'(([12][0-9][0-9]|[1-9][0-9]|[1-9])\.){3,3}([12][0-9][0-9]
- 本文实例讲述了python根据开头和结尾字符串获取中间字符串的方法。分享给大家供大家参考。具体分析如下:这里给定一个字符串,指定开头和结尾的
- Python的turtle模块画国旗主要用到两个函数:draw_rentangle和draw_star。至于函数的调用就和我们学的C,C++
- 1.什么是labelpandas处理数据时,我们会经常看到dataframe结构使用loc, iloc, ix等方法。那么这些方法到底有啥区
- 要想从命令行启动mysqld服务器,你应当启动控制台窗口(或“DOS window”)并输入命令:C
- 概述I/O操作不仅包括屏幕输入输出,还包括文件的读取与写入,Python提供了很多必要的方法和功能,进行文件及文件夹的相关操作。本文主要通过
- MySQL有6种日志,监控数据库系统的时候必须知道select日志slow select日志变更日志二进制变更日志(binlog)