利用Python实现PDF转文本,就是如此简单!

一、前言

对很多人来说,将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.11、将 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.12、检测和识别图像中的文本

为了检测和识别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 pytesseractdef single_pic_proc(image_file):image = np.array(Image.open(image_file).convert('RGB'))result, image_framed = ocr(image)return result,image_framedimage_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 textfilename = pathlib.Path(image_file).nameoutput_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.13、示例输出

代码如下:

import cv2 as cvoutput_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 工具来处理一些文本内容,这比依赖外部软件来说明文档要好得多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/473135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 1725. 可以形成最大正方形的矩形数目

文章目录1. 题目2. 解题1. 题目 给你一个数组 rectangles &#xff0c;其中 rectangles[i] [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi 。 如果存在 k 同时满足 k < li 和 k < wi &#xff0c;就可以将第 i 个矩形切成边长为 k 的正方形。 例如&#xff0c;矩形…

Qt pro文件语法

在Qt下做开发的时候.pro文件就是工程的配置文件&#xff0c;虽然很多时候里面的选项是工具自动生成的&#xff0c;但是难免会需要手动修改的时候&#xff0c;下面就记录一下它的基本语法 #&#xff1a;在.pro文件中表示注释&#xff0c;注释当前行 TEMPLATE&#xff1a;模板 IN…

Python实现给指定的微信朋友发信息

一、环境准备 1、Python3.6 2、itchat第三方库 pip install itchat-uos 3、pyinstaller第三方库 pip install pyinstaller 二、核心代码 import itchatimport timeprint("请扫描弹出的扫二维码")itchat.auto_login(hotReloadTrue)boom_name input("请输…

LeetCode 1726. 同积元组(排列组合)

文章目录1. 题目2. 解题1. 题目 给你一个由 不同 正整数组成的数组 nums &#xff0c;请你返回满足 a * b c * d 的元组 (a, b, c, d) 的数量。其中 a、b、c 和 d 都是 nums 中的元素&#xff0c;且 a ! b ! c ! d 。 示例 1&#xff1a; 输入&#xff1a;nums [2,3,4,6] 输…

vuedraggle choose_如何拆分员工工资条,教你一招一学就会。(五)函数CHOOSE

作为人事管理者&#xff0c;我们最重要的一个工作就是工资表&#xff0c;那么如何将工资表拆分成工资条呢&#xff1f;我们最后看一下函数CHOOSE对函数MOD、ROW、OFFSET 、INT的嵌套使用。第一步&#xff0c;我们输入函数CHOOSE&#xff0c;第一个值是序号&#xff0c;我们将之…

about window.onload

在前几天一次练习中因为我要在页面加载完成后调用一个函数&#xff0c;于是我在javascript中用了window. onload&#xff0c;这个方法以前从学习js就在使用&#xff0c;有时还用来调用多个函数。然而我在这次想偷懒&#xff0c;就这样写了一段代码&#xff1a; window.οnlοad…

用pythone画棵圣诞树,祝大家圣诞快乐

一、python环境&#xff1a; 根据电脑的情况去下载对应的python安装包&#xff0c;我使用的是python3.7.0的版本 二、python编译器&#xff1a; 打开pycharm&#xff0c;然后我们创建一个project&#xff0c;在project下创建一个python file&#xff0c;建议取名字不要使用中…

LeetCode 1727. 重新排列后的最大子矩阵(前缀和+排序)

文章目录1. 题目2. 解题1. 题目 给你一个二进制矩阵 matrix &#xff0c;它的大小为 m x n &#xff0c;你可以将 matrix 中的 列 按任意顺序重新排列。 请你返回最优方案下将 matrix 重新排列后&#xff0c;全是 1 的子矩阵面积。 示例 1&#xff1a; 输入&#xff1a;ma…

亚马逊出的平板电脑_亚马逊Fire HD 8 Plus评测:适合看视频和轻度游戏的廉价平板...

导语&#xff1a;近日&#xff0c;亚马逊升级了旗下的Fire HD 8和Fire HD 8 Plus平板电脑&#xff0c;使其具有更多的内存&#xff0c;更快的处理器和USB-C充电功能。亚马逊Fire HD 8 Plus是Fire HD 8 的一个增强版本&#xff0c;它提供了较HD8更快的速度&#xff0c;拥有一些通…

利用python转换图片格式

前言 常见的图像任务通常需要把照片统一成相同的格式&#xff0c;所以此文章正是为了统一格式而生&#xff0c;常见的主要有cv2和PIL.Image的相关操作&#xff0c;照片格式是一串数字加上后缀名 工具一&#xff1a;cv2 pip install opencv-python 之后就可以 import cv2 1.…

C# 6.0语法新特性体验(二)

之前我在文章通过Roslyn体验C# 6.0的新语法中介绍了一些C# 6.0的语法特性&#xff0c;现在随着Visual Studio 14 CTP3的发布&#xff0c;又陆续可以体验一些新的特性了&#xff0c;这里简单的介绍一下之前没有介绍的新语法。 属性表达式&#xff08;Property Expressions&#…

TensorFlow 2.0 - 张量/自动求导/梯度下降

文章目录1. 张量2. 自动求导、梯度下降学习于&#xff1a;简单粗暴 TensorFlow 2 1. 张量 import tensorflow as tf print(tf.__version__) # 2.3.1random_float tf.random.uniform(shape()) # tf.Tensor(0.80420315, shape(), dtypefloat32) zero_vec tf.zeros(shape(2)) …

苹果台式机_苹果史上最强台式机来了:顶配售价45万

12月11日消息&#xff0c;国行版Mac Pro正式在苹果官网上架开售。根据苹果官网显示&#xff0c;Mac Pro最基础版本需要花费47999元&#xff0c;基础版Mac Pro配置上采用3.5GHz 8核Intel Xeon W处理器&#xff0c;32GB (4x8GB) DDR4 ECC内存&#xff0c;Radeon Pro 580X图形处理…

Python多进程及多参数的处理方法

一、多进程pool.map()方法一 import time from multiprocessing.pool import Pooldef numsCheng(i):return i * 2if __name__ __main__:time1 time.time()nums_list [1, 2, 3, 4, 5, 6, 7, 8, 9]pool Pool(processes5)result pool.map(numsCheng, nums_list)pool.close()…

【floyd】HDU 1874 畅通project续

之后的题解偏重有用/总结性质&#xff0c;尽量理解算法本身而不是题&#xff0c;时间复杂度什么的也能够放放。 非常久之前做过这个题&#xff0c;当时使用dijkstra做的&#xff0c;关于几个最短路算法&#xff0c;分类的话能够分为下面几种。 1、单源最短路&#xff1a;已知起…

利用python寻找列表中相邻元素之差绝对值为1的所有最长链

一、前言&#xff1a; 今天工作遇到一个问题&#xff0c;根据不同的柜子选取能连接在一起的所有柜子&#xff0c;有可能一组&#xff0c;也有可能几组&#xff1b;把这个问题简单化&#xff0c;就是给你一组列表[2, 1, 3, 4, 5, 7, 9, 8, 12, 13, 14, 15]&#xff0c;得到相邻…

LeetCode 1489. 找到最小生成树里的关键边和伪关键边(并查集+kruskal最小生成树)

文章目录1. 题目2. 解题1. 题目 给你一个 n 个点的带权无向连通图&#xff0c;节点编号为 0 到 n-1 &#xff0c;同时还有一个数组 edges &#xff0c;其中 edges[i] [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。 最小生成树 (MST) 是给定图中边的…

斯特林发动机图纸尺寸_南昌教学模型订做,航空发动机模型_境海模型

首页 > 新闻中心发布时间&#xff1a;2020-11-08 13:57:07 导读&#xff1a;境海模型为您提供南昌教学模型订做,航空发动机模型的相关知识与详情&#xff1a; 曾经的沙盘模型一般只有模型自身&#xff0c;没有现代的视觉作用例如&#xff1a;灯火声音形象等动态的作用。景观…

C# 关于列表List<T>排序总结与整理

一、概述 SortedList 类代表了一系列按照键来排序的键/值对&#xff0c;这些键值对可以通过键和索引来访问。排序列表是数组和哈希表的组合。它包含一个可使用键或索引访问各项的列表。 如果您使用索引访问各项&#xff0c;则它是一个动态数组&#xff08;ArrayList&#xff0…

iOS给图片打水印,并将打过水印的图片生成到沙盒中

- (void)WaterImage{ UIImage *bgImage [UIImage imageNamed:"scene"]; // 上下文 : 基于位图(bitmap) , 所有的东西需要绘制到一张新的图片上去 // 1.创建一个基于位图的上下文(开启一个基于位图的上下文) // size : 新图片的尺寸 // opaq…