使用 pytesseract 实现PDF中文识别(附源码及解释)

pytesseract是基于Python的OCR工具, 底层使用的是Tesseract-OCR 引擎,支持识别图片中的文字,支持jpeg, png, gif, bmp, tiff等图片格式。

本文概要
  • tesseract-ocr安装,以及python开发环境搭建
  • PDF转为imge后
  • 通过 pytesseract 识别中文的示例

环境搭建

1)安装 tesseract-ocr

操作系统 : Ubuntu 22.04
apt install tesseract-ocr
安装中文语言包
apt install tesseract-ocr-chi-sim
添加环境变量TESSDATA_PREFIX
cd ~
vim .bashrc , 添加环境变量,将路径更换为本机路径。
export TESSDATA_PREFIX=/usr/share/tesseract-ocr/4.00/tessdata

2)准备Python环境

创建虚拟环境
mkdir tess
python3 –m venv tess
cd tess
激活虚拟环境
source bin/activate

安装相关库
pip3 install pillow
pip3 install pytesseract
pip3 install pdf2image

新建1个测试项目目录
mkdir myproject
cd myproject

准备1个pdf文件,本例主要是验证pytesseract 基本功能,未涉及图像增强处理,因此测试用的 PDF要求文字清晰。

编写代码

新建1个文件,内容如下

import pytesseract
from PIL import  Image
import os
from pdf2image import convert_from_path
from io import BytesIO

if os.path.exists("result.txt"):
     os.remove("result.txt")
fo = open("result.txt","w")

pages=convert_from_path("text-2.pdf")

for i,page in enumerate(pages):
     buf = BytesIO()
     page.save(buf,format="JPEG")
     buf.seek(0)
     img_page=Image.open(buf)
     txt=pytesseract.image_to_string(img_page,lang='chi_sim')
     fo.write(txt+"\n")
     print(f"No {i} page result: {txt}")

fo.close()

说明如下

  • pages=convert_from_path("text-2.pdf"), 读取pdf文件,并将其转换为 image 列表,每页pdf转为1页page.
  • for i,page in enumerate(pages) 循环处理所有图片
  • buf = BytesIO() 这里使用 ByteIO 缓存来模拟文件流,操作与读写文件类似,不需要保存为实际Image文件了, 可加快速度,
  • img_page=Image.open(buf) , 用pillow读取图像,其格式可做为 tesseract 的输入。
  • txt=pytesseract.image_to_string(img_page,lang='chi_sim') , 调用 tesseract的 imgage_to_string() 方法识别图片中的文字, lang=“chi_sim” 是指文字类型为中文简体,识别后的文字保存在txt变量中。
  • fo.write(txt+"\n") , 保存识别结果到文件

测试

原PDF文件为
在这里插入图片描述
识别结果:

靖难之役与建文帝生死之谜(1)
 

明太祖朱元璋有二十六个儿子,他因自己出身插微,当上旦帝后,生怕那些
开国元勋“尾大不掉” 将长子立为太子,九子、二十六子早死,其余二十三个
儿子都封王建藩。燕王朱棣、晋王朱桐、宁王朱权等率兵驻守北方,抵御蒙古;
轩王朱、齐王朱村等驻于内地各省, 监督地方官吏。朱元璋规定, 如遇奸臣专权,
洲王可以声讨奸臣,甚至可以发兵“清君侧” 他的本意是企图     室亲戚来维
护星权,丈不知事与愿违。
位理应由朱多习的父亲朱标继承,朱标作为长子,早就被立为太子。可惜
岂英年早逝,死于洪武二十五年(1392 年),朱元璋按照病长子继承的原则,把
长孙朱允蚊立为皇储。洪武三十一年 (1398 年) 朱元璋病逝,长孙朱允灼即位。
出生于洪武十年(1377 年) 的朱允,此时已是一个英姿勃发的青年了,书生气
十足而又温文尔雅, 却缺少祖父与报父们雄才大略的草苦习气。他在位仅仅四年,
就被叔父一一燕王朱棣赶下台,祸根是他的祖父朱元璋种下的。
朱元璋给儿子们封王建藩,并授予他们“清君人出”特权的做法,同样出身插
微的刘邦也采用过。刘邦建立汉朝后,立即分封同姓诸侯王,作为刘家天下的屏
障。出乎意料的是,那些同姓诸侯王野心勃勃,与中央分庭抗礼。汉景帝接受晃
错的“削藩”主张,引来了洲王的反叛一一吴楚七国之乱,他们的借口就是“请
诛晃错,以清君侧”

还可以调整配置参数,获取更好效果:

custom_oem_psm_config = r'--oem 2 --psm 6'
pytesseract.image_to_string(image, config=custom_oem_psm_config, lang="chi_sim")

更详细请参考
pytesseract 项目目录
tesseract 官方文档

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现web端的PDF在线批注,以下是一个简单的示例源代码,可以作为参考: HTML文件: ```html <!DOCTYPE html> <html> <head> <title>PDF在线批注</title> <style> #pdf-container { width: 100%; height: 500px; } </style> </head> <body> <input type="file" id="pdf-file" accept=".pdf"> <div id="pdf-container"></div> <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.3.200/pdf.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script> $(document).ready(function() { $('#pdf-file').on('change', function() { var file = this.files[0]; var fileReader = new FileReader(); fileReader.onload = function() { var typedarray = new Uint8Array(this.result); PDFJS.getDocument(typedarray).promise.then(function(pdf) { for (var i = 1; i <= pdf.numPages; i++) { pdf.getPage(i).then(function(page) { var scale = 1.5; var viewport = page.getViewport({ scale: scale }); var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); canvas.height = viewport.height; canvas.width = viewport.width; var container = document.getElementById('pdf-container'); container.appendChild(canvas); page.render({ canvasContext: context, viewport: viewport }); // 在这里可以添加批注功能 }); } }); }; fileReader.readAsArrayBuffer(file); }); }); </script> </body> </html> ``` 这个示例使用PDF.js库来在web页面中显示PDF文件。当用户选择一个PDF文件时,它使用FileReader API读取文件的内容,并将其转换为Uint8Array类型。然后,使用PDF.js库加载PDF文件,并将每一页渲染到一个Canvas元素中。你可以在页面上添加自定义批注功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值