【Python】好用的办公能手:利用OCR进行PDF文档解析(附教程)

这篇具有很好参考价值的文章主要介绍了【Python】好用的办公能手:利用OCR进行PDF文档解析(附教程)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

文档解析涉及检查文档中的数据并提取有用的信息。它可以通过自动化减少了大量的手工工作。一种流行的解析策略是将文档转换为图像并使用计算机视觉进行识别。而文档图像分析(Document Image Analysis)是指从文档的图像的像素数据中获取信息的技术,在某些情况下,预期结果应该是什么样的没有明确的答案(文本、图像、图表、数字、表格、公式……)。

python识别pdf文件,徐浪老师大讲堂,python,pdf,计算机视觉
OCR (Optical Character Recognition,光学字符识别)是通过计算机视觉对图像中的文本进行检测和提取的过程。它是在第一次世界大战期间发明的,当时以色列科学家伊曼纽尔·戈德堡(Emanuel Goldberg)发明了一台能读取字符并将其转换为电报代码的机器。到了现在该领域已经达到了一个非常复杂的水平,混合图像处理、文本定位、字符分割和字符识别。基本上是一种针对文本的对象检测技术。

在本文中我将展示如何使用OCR进行文档解析。我将展示一些有用的Python代码,这些代码可以很容易地用于其他类似的情况(只需复制、粘贴、运行),并提供完整的源代码下载。

这里将以一家上市公司的PDF格式的财务报表为例(链接如下)。https://s2.q4cdn.com/470004039/files/doc_financials/2021/q4/_10-K-2021-(As-Filed).pdf

一、环境设置

文档解析令人烦恼的部分是,有太多的工具用于不同类型的数据(文本、图形、表格),但没有一个能够完美地工作。下面是一些最流行方法和软件包:

以文本方式处理文档:用PyPDF2提取文本,用Camelot或TabulaPy提取表,用PyMuPDF提取图形。将文档转换为图像(OCR):使用pdf2image进行转换,使用PyTesseract以及许多其他的库提取数据,或者只使用LayoutParser。

也许你会问:“为什么不直接处理PDF文件,而要把页面转换成图像呢?”你可以这么做。这种策略的主要缺点是编码问题:文档可以采用多种编码(即UTF-8、ASCII、Unicode),因此转换为文本可能会导致数据丢失。因此为了避免产生该问题,我将使用OCR,并用pdf2image将页面转换为图像,需要注意的是PDF渲染库Poppler是必需的。

# with pip
pip install python-poppler
# with conda
conda install -c conda-forge poppler

你可以很容易地读取文件:

# READ AS IMAGE
import pdf2imagedoc = pdf2image.convert_from_path("doc_apple.pdf")
len(doc) #<-- check num pages
doc[0]   #<-- visualize a page

跟我们的截图一模一样,如果想将页面图像保存在本地,可以使用以下代码:

# Save imgs
import osfolder = "doc"
if folder not in os.listdir():
  os.makedirs(folder)p = 1
for page in doc:
  image_name = "page_"+str(p)+".jpg"  
  page.save(os.path.join(folder, image_name), "JPEG")
  p = p+1

最后,我们需要设置将要使用的CV引擎。LayoutParser似乎是第一个基于深度学习的OCR通用包。它使用了两个著名的模型来完成任务:

Detection: Facebook最先进的目标检测库(这里将使用第二个版本Detectron2)。

Tesseract:最著名的OCR系统,由惠普公司在1985年创建,目前由谷歌开发。

pip install "layoutparser[ocr]"

现在已经准备好开始OCR程序进行信息检测和提取了。

import layoutparser as lp
import cv2
import numpy as np
import io
import pandas as pd
import matplotlib.pyplot as plt

二、检测

目标检测是在图片中找到信息片段,然后用矩形边框将其包围的过程。对于文档解析,这些信息是标题、文本、图形、表……

让我们来看一个复杂的页面,它包含了一些东西:
`python识别pdf文件,徐浪老师大讲堂,python,pdf,计算机视觉
``

这个页面以一个标题开始,有一个文本块,然后是一个图和一个表,因此我们需要一个经过训练的模型来识别这些对象。幸运的是,Detectron能够完成这项任务,我们只需从这里选择一个模型,并在代码中指定它的路径。

python识别pdf文件,徐浪老师大讲堂,python,pdf,计算机视觉
我将要使用的模型只能检测4个对象(文本、标题、列表、表格、图形)。因此,如果你需要识别其他东西(如方程),你就必须使用其他模型。

## load pre-trained model
model = lp.Detectron2LayoutModel(
  "lp://PubLayNet/mask_rcnn_X_101_32x8d_FPN_3x/config",
  extra_config=["MODEL.ROI_HEADS.SCORE_THRESH_TEST", 0.8],
  label_map={0:"Text", 1:"Title", 2:"List", 3:"Table", 4:"Figure"})

## turn img into array
i = 21
img = np.asarray(doc[i])

## predict
detected = model.detect(img)

## plot
lp.draw_box(img, detected, box_width=5, box_alpha=0.2,
          show_element_type=True)

python识别pdf文件,徐浪老师大讲堂,python,pdf,计算机视觉
结果包含每个检测到的布局的细节,例如边界框的坐标。根据页面上显示的顺序对输出进行排序是很有用的:

## sort
new_detected = detected.sort(key=lambda x: x.coordinates[1])
## assign ids
detected = lp.Layout([block.set(id=idx) for idx,block in
                    enumerate(new_detected)])## check
for block in detected:
  print("---", str(block.id)+":", block.type, "---")
  print(block, end='\n\n')

完成OCR的下一步是正确提取检测到内容中的有用信息。

三.提取

我们已经对图像完成了分割,然后就需要使用另外一个模型处理分段的图像,并将提取的输出保存到字典中。

由于有不同类型的输出(文本,标题,图形,表格),所以这里准备了一个函数用来显示结果。

'''
{'0-Title': '...',
'1-Text': '...',
'2-Figure': array([[ [0,0,0], ...]]),
'3-Table': pd.DataFrame,
}
'''
def parse_doc(dic):
  for k,v in dic.items():
      if "Title" in k:
          print('\x1b[1;31m'+ v +'\x1b[0m')
      elif "Figure" in k:
          plt.figure(figsize=(10,5))
          plt.imshow(v)
          plt.show()
      else:
          print(v)
      print(" ")

首先看看文字:

# load model
model = lp.TesseractAgent(languages='eng')
dic_predicted = {}
for block in [block for block in detected if block.type in ["Title","Text"]]:
  ## segmentation
  segmented = block.pad(left=15, right=15, top=5,
              bottom=5).crop_image(img)
  ## extraction
  extracted = model.detect(segmented)
  ## save
  dic_predicted[str(block.id)+"-"+block.type] =
                extracted.replace('\n',' ').strip()

# check
parse_doc(dic_predicted)

再看看图形报表

for block in [block for block in detected if block.type == "Figure"]:
  ## segmentation
  segmented = block.pad(left=15, right=15, top=5,
                        bottom=5).crop_image(img)
  ## save
  dic_predicted[str(block.id)+"-"+block.type] = segmented

# check
parse_doc(dic_predicted)

python识别pdf文件,徐浪老师大讲堂,python,pdf,计算机视觉
上面两个看着很不错,那是因为这两种类型相对简单,但是表格就要复杂得多。尤其是我们上看看到的的这个,因为它的行和列都是进行了合并后产生的。


for block in [block for block in detected if block.type == "Table"]:
  ## segmentation
  segmented = block.pad(left=15, right=15, top=5,
              bottom=5).crop_image(img)
  ## extraction
  extracted = model.detect(segmented)
  ## save
  dic_predicted[str(block.id)+"-"+block.type] = pd.read_csv(
                io.StringIO(extracted) )
# check
parse_doc(dic_predicted)

python识别pdf文件,徐浪老师大讲堂,python,pdf,计算机视觉
正如我们的预料提取的表格不是很好。好在Python有专门处理表格的包,我们可以直接处理而不将其转换为图像。这里使用TabulaPy包:

import tabula
tables = tabula.read_pdf(“doc_apple.pdf”, pages=i+1)
tables[0]
python识别pdf文件,徐浪老师大讲堂,python,pdf,计算机视觉

结果要好一些,但是名称仍然错了,但是效果要比直接OCR好的多。

总结

本文是一个简单教程,演示了如何使用OCR进行文档解析。使用Layoutpars软件包进行了整个检测和提取过程。并展示了如何处理PDF文档中的文本,数字和表格。文章来源地址https://www.toymoban.com/news/detail-607761.html

到了这里,关于【Python】好用的办公能手:利用OCR进行PDF文档解析(附教程)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python自动办公之合并多个PDF文件

    本文基于使用pycharm平台,使用glob库和PyPDF2库实现 首先将需要合并的文件放于一个文件中 如下图 addpdf文件夹为需要合并的文件位置 good.py为代码块  代码如下 代码并没有对输入内容进行限制,可能会出现很大问题,但是正常使用是可以的.

    2024年02月11日
    浏览(46)
  • Python - 利用 OCR 技术提取视频台词、字幕

    目录 一.引言 二.视频处理 1.视频样式 2.视频截取 ◆ 裁切降帧 ◆ 处理效果 3.视频分段 三.OCR 处理 1.视频帧处理 2.文本识别结果 3.后续工作与优化 ◆ 识别去重 ◆ 多线程提效 ◆ 片头片尾优化 四.总结 视频经常会配套对应的台词或者字幕,通过文本与字幕可以更好地理解视频

    2024年02月03日
    浏览(72)
  • 【python】15.图像和办公文档处理

    用程序来处理图像和办公文档经常出现在实际开发中,Python的标准库中虽然没有直接支持这些操作的模块,但我们可以通过Python生态圈中的第三方模块来完成这些操作。 操作图像 计算机图像相关知识 颜色。如果你有使用颜料画画的经历,那么一定知道混合红、黄、蓝三种颜

    2024年01月18日
    浏览(37)
  • python-自动化篇-办公-将PDF文件转存为图片

    因工作中的某些奇葩要求,需要将PDF文件的每页内容转存成按顺序编号的图片。用第三方软件或者在线转换也可以,但批量操作还是Python方便,所谓搞定办公自动化,Python出山,一统天下;Python出征,寸草不生~ O(∩_∩)O 不过这个需要用到 PyMuPDF 库,电脑运行cmd,输入“pip

    2024年02月19日
    浏览(58)
  • python办公自动化(6)——读取word文档

    因为我们要进行文件相关的操作,所以需要在一开始使用import导入Python内置的os模块。 我们需要先获取该文件夹下所有的答题卡列表,再使用for循环遍历文件夹中所有学生的答题卡,以便之后逐个读取信息。 完成了第一个步骤,接下来,我们就需要在for循环里,依次获取每位

    2023年04月08日
    浏览(61)
  • Python发送电子邮件及图像办公文档处理

    结合自身经验和内部资料总结的Python教程,每天3章,1个月就能全方位的完成Python的学习并进行实战开发。加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础》

    2024年02月13日
    浏览(64)
  • selenium利用javascript进行自动打印网页为PDF

    selenium爬取页面的时候有时需要保持页面为PDF格式 并且不能使用pdfkit 模块(有的网址限制必须浏览器打开) 一:导入模块 二:在初始化driver对象的时候设定,浏览器静默保存(即保存时不弹出另存为按钮)和默认保存位置 三:打开所需网页 四:调用js打开打印窗口 修改当前页面标题(因

    2024年02月15日
    浏览(50)
  • 【办公自动化】使用Python一键提取PDF中的表格到Excel

      🤵‍♂️ 个人主页:@艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收藏 📂加关注+ 目录 一、Python处理Excel 二、提取PDF表格到excel 三、往期推荐 文末推荐  文末福利   Pyth

    2024年02月13日
    浏览(57)
  • 利用Python实现电脑鼠标和键盘办公自动化

    Python的确是一个了不起的编程语言和工具,它可以用来构建各种脚本和实用程序,这些脚本和实用程序可以帮助你化繁为简、让很多事情都实现自动化…以下是从海外博客上学习积累到的,做个分享,如果感兴趣,会陆陆续续做些编辑补充。 ( 文末领取读者福利 ) 这次,我

    2024年02月15日
    浏览(44)
  • python自动化办公——定制化将电子签名批量签写到PDF文件

    首先需要下载所需要的库 此外还需要下载poppler,这里使用的是poppler-0.67.0 这是一个处理PDF文件的工具包,里面包含了非常多的功能供我们使用。 下载地址:https://blog.alivate.com.au/poppler-windows/ 下载完压缩包之后,将压缩包解压到本地的某个地方,并记好路径。 现需要将类似这

    2024年02月09日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包