利用cnocr库完成中文扫描pdf文件的文字识别
很多pdf文件文字识别软件都会收费,免费的网页版可能会带来信息泄露,还有一些类似于腾讯AI和百度AI的接口都有调用次数限制,因此,利用识别正确率极高且免费的cnocr库来自己动手做个pdf文件文字识别程序就是一个很不错的选择。以下程序利用pymupdf打开pdf文件并将页面图像数据读出,然后用numpy将pymupdf读取的页面图像转换为cnocr能够接受的np.ndarray格式的图像数据,再由cnocr进行文字识别。numpy、pymupdf和cnocr库的安装都可以用pip install指令简单完成,不多赘述。
import numpy as np
from cnocr import CnOcr
from pymupdf import pymupdfdef pdf2txt(input_file, output_file, start_page=0, page_count=-1):"""将扫描的pdf文件中指定的页面范围内的内容转换成文本文件:param input_file: 要识别的pdf文件的相对或绝对路径,包含文件名的字符串:param output_file: 保存识别结果的txt文件的相对或绝对路径:param start_page: 识别起始页面,默认为第1页:param page_count: 识别的页数,默认为所有页面:return:"""pdf = pymupdf.open(input_file)count = pdf.page_countif start_page < 0:start_page = 0if page_count < 0 or page_count + start_page > count:end_page = countelse:end_page = page_count + start_page# 如CnOcr的识别模型尚未下载,以下语句执行时CnOcr会自动下载模型并解压到用户目录下的AppData\\Roaming\\cnocr\\cnocr版本号下# 也可以在初始化时指定rec_model_fp参数给出模型所在的相对路径或绝对路径指定识别模型,如以下示例(因以下路径是我的电脑上的默认路径,# 因此下面两行代码与ocr = CnOcr()完全等价ocr = CnOcr(rec_model_fp='C:\\Users\\asus\\AppData\\Roaming\\cnocr\\2.3\\densenet_lite_136-gru''\\cnocr-v2.3-densenet_lite_136-gru-epoch=004-ft-model.onnx')print(start_page, end_page)with open(output_file, 'w', encoding='utf-8') as f:for i in range(start_page, end_page):page = pdf[i]pix = page.get_pixmap()width = pix.widthheight = pix.height# pixmap转换为nympy.ndarray,供CnOcr识别image = np.frombuffer(pix.samples, dtype=np.uint8).reshape(height, width, pix.n)res = ocr.ocr(image)string_list = []for val in res:# 注意这是2.2版本以后的cnocr读取识别结果的方式与2.1版本已经不同# 如果cnocr识别结果总是一些textscoreposition字符串,那就是用了老版的方式string_list.append(val['text'])ocr_result_string = '\n'.join(string_list)f.write(ocr_result_string) # 这行代码自带文件关闭功能,不需要再写 f.close()print(f'page{i + 1} finished.')pdf.close()input_file = f'test.pdf'
output_file = 'test.txt'
pdf2txt(input_file, output_file, 500, 522)
需要注意的是,在读取cnocr的识别结果时,如果安装的cnocr版本低于2.2,那么
以上代码中的
for val in res:string_list.append(val['text'])
要改成下面这样:
for i in range(len(res)):for j in res[i]:string_list.append(j)
但是2.2版本以后的cnocr如果仍然用以上方式,那么取出的识别结果将是一串“textscoreposition”。
下面是以上程序识别曹植集校注中一页的结果:
(本冥指隐蔽偏鲜之处。此言卡太后即使在独处之时也很谨慎,在隐
游之处电依礼行。
5〔诚(juon))洁也。〔荐)进献。〔三牲)牛、羊、猪,指祭
品。此吉请净地进献祭品。(视)条配时主持条礼之人。
3〔宜享斯祜]应该享受知此之服。精:棋。宋本作“”。〔煤
社〕即受桶。(肉特)锅奖。(勉)月“免。即超免
四〔会街尽礼)条祀折特时湖尽礼数。笃)厚,指调情加重。
[密)痊愈。(终)指生命到终点。
等〔遗州)南植自指。(在收)指在优伤久病之中。(部)指下太
后去世的内信。〔东藩)洛阳东面的藩国。曹植时时东阿王。东阿在洛
阳东。[郊甸)郊野。丁本:《艺文类聚》作“晗。”家本亦作“除”。
哈指田地里的小路、与筹义同。(中原)原野之中。
中(皇址]望号。[迁)肉去。[峡复) 经常来看我。
等〔岁字)空貌,即人去限空。(巡省阶除)在宫中的小道上巡视。
(仿佛碳轩在窗户间仿佛着见了下太行的身影容舰。银轩:窗户。
就【韩梨)指下太后的居室。(儿益)儿席。座席。〔效故)改变
原承的样子。
2〔酷指您伤全做。斯)如此。(墙)。(魏部)指邺。曹操
界于都,下太后的是权专运到部与曹操合养。(日包)指邺。〔隧)&
道。〔魄)《艺文类聚》、宋本俱作“将”。
3(叹息露兴)叹息之气粥如雾气兴起,形容送师人之多。〔幅
(r而))灵车。
容车饰驾,以合北展®
0丁本:“《文选》颜廷年《宋元泉后哀策文》李注引《上宜后请
&》.
-469.
原始扫描页面100%缩放图像如下:

可见准确率也还勉强可以接受。如果将图像做个对比度增强并适当放大再识别,还可以进一步提高准确率。下面是使用OpenCV将图片放大2倍后的识别结果,对比可以看出准确率有所提高:
(本冥〕指隐蔽偏解之处。此言卡太后即使在独处之时也很谨慎,在隐
游之处也依礼间行。
S(砖(juon))洁也。〔荐〕进献。(三牲〕牛、羊、猪.指祭
品。此言洁净地进献祭品。(祝〕祭祀时主持祭礼之人。
3(宜享斯祜)应该享受知此之福。精:摄、宋本作“猪”。〔蒙
社〕即受福。〔凶咎)祸火。〔勉)月“免”.即避免。
四〔云传尽礼)条祀祈传时湖尽礼数。笃)厚,指病情加重。
(疮)经。〔终)指生命到终点。
多〔逸弧)曹植自指。(在款)指在优伤久病之中。(讳)指下太
后去世的内信。〔东洛)洛阳东面的等国。、曹植时村东阿王。东阿在洛
阳东。(郊甸)郊野。丁本:《艺文类聚》作“峰。”宋本亦作“时”。
哈指田地里的小路。与年义同。(中原)原野之中。
9(皇址)皇号。[迁〕肉去。[峡复〕经常来看我。
0〔岁凯)空貌,即人去屋空。〔巡省阶涂)在宫中的小道上巡视。
(仿佛候轩)在窗户间仿佛看见了卡太后的身影容颜。领轩:窗户。
就〔韩蟹)指下太后的店室。〔儿流)儿席。座席。〔烫故)改变
原来的样子。
心〔酷)指悲伤至极。〔斯)如此。(秦)到。〔魏都)指邺。曹操
养于郎,下太后的是框要运到第与曹操合养。(旧色)指邺。(能)众
道。〔魄)《艺文类聚》、宋木供作“将”。
3(叹息露兴)叹息之气宛如雾气兴起,形容送葬人之多。〔幅
(r而))灵车。
容车饰驾,以合北辰®
0丁本:“《文选》颜廷年《宋元皇后哀策文》李注引《上宣后请
表.”
.469.
真正要提高识别准确率,需要出钱买它的专业版预训练模型,但对于我这种坚决的白嫖党来说,即使售价1分钱,花出去我也觉得掉面子——还不如忍受腾讯AI百度AI限制次数限制文件大小去搞免费识别,话说我用百度AI接口识别的同一页内容结果如下(代码参阅https://blog.csdn.net/yivifu/article/details/116836686):
〔幽冥〕指隐蔽偏僻之处。此言卞太后即使在独处之时也很谨慎,在隐
僻之处也依礼而行。
②〔蠲(juān)〕洁也。〔荐〕进献。〔三牲〕牛、羊、猪,指祭
品。此言洁净地进献祭品。〔祝〕祭祀时主持祭礼之人。
〔宜享斯祜〕应该享受如此之福。祜:福。宋本作“祐”。〔蒙
祉〕即受福。〔凶咎〕祸灾。〔勉〕同“免”,即避免。
②〔尝祷尽礼〕祭祀祈祷时竭尽礼数。〔笃〕厚,指病情加重。
〔痊〕痊愈。〔终〕指生命到终点。
②〔遗孤〕曹植自指。〔在疚〕指在忧伤久病之中。〔讳〕指卞太
后去世的凶信。〔东藩〕洛阳东面的藩国。曹植时封东阿王,东阿在洛
阳东。〔郊甸〕郊野。丁本:“《艺文类聚》作‘畛’。”宋本亦作“畛”,
畛指田地里的小路。与郊义同。〔中原〕原野之中。
②9〔皇妣〕皇母。〔迁〕离去。〔顾复〕经常来看我。
③〔寥廓〕空貌,即人去屋空。〔巡省阶涂〕在宫中的小道上巡视。
[仿佛棂轩〕在窗户间仿佛看见了卞太后的身影容颜。棂轩:窗户。
③〔帏幄〕指卞太后的居室。〔几筵〕几席,座席。〔毁故〕改变
原来的样子。
〔酷〕指悲伤至极。〔斯〕如此。〔臻〕到。〔魏都〕指邺。曹操
葬于邺,卞太后的灵柩要运到邺与曹操合葬。〔旧邑〕指邺。〔隧〕墓
道。〔魄〕《艺文类聚》、宋本俱作“将”。
③〔叹息雾兴〕叹息之气宛如雾气兴起,形容送葬人之多。〔輀
(ér而)〕灵车。
容车饰驾,以合北辰①。
①丁本:“《文选》颜延年《宋元皇后哀策文》李注引《上宣后诔
表》。”
·469.
几乎没有错误!用腾讯的ocrdemo(https://ocrdemo.cloud.tencent.com/)识别,更是连格式都能基本保持。
相关文章:
利用cnocr库完成中文扫描pdf文件的文字识别
很多pdf文件文字识别软件都会收费,免费的网页版可能会带来信息泄露,还有一些类似于腾讯AI和百度AI的接口都有调用次数限制,因此,利用识别正确率极高且免费的cnocr库来自己动手做个pdf文件文字识别程序就是一个很不错的选择。以下程…...
pythonselenium自动化初始配置
基础配置 更新pip: 在Terminal中使用命令‘python -m pip install --upgrade pip’就可以安装pip最新版本。 python -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simple 常用的镜像源: 清华: https://pypi.tuna.tsinghua.edu.cn/simpl…...
【C++】数的性质问题分析与优化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目解析与分析题目描述题目分析 💯我的解法与详细解读初始代码实现解法分析 💯老师解法与其改进思路老师代码实现改进与优势 💯对比分析…...
ASP.NET Core WebAPI中使用Jwt实现鉴权授权-System.IdentityModel.Tokens.Jwt
使用 System.IdentityModel.Tokens.Jwt 直接实现基于 JWT 的鉴权和授权,可以在 ASP.NET Core 中手动生成、解析、验证 JWT Token。System.IdentityModel.Tokens.Jwt 提供了 JWT 的生成和解析的 API。以下是如何使用该库实现鉴权授权的详细步骤。 步骤 1: 安装 NuGe…...
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)
目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则: 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…...
嵌入式软考学习笔记(1)超详细!!!
目录 第一章计算机系统基础知识 1、逻辑运算 2、数的表示 3、总线系统 5、流水线 6、存储器 7、可靠性、校验码 第一章计算机系统基础知识 1、逻辑运算 与:有0则0,全1才1 或:有1则1,全0才0 异或:相同为0…...
【数据分享】2013-2023年我国省市县三级的逐年CO数据(免费获取\excel\shp格式)
空气质量数据是在我们日常研究中经常使用的数据!之前我们给大家分享了2000-2023年的省市县三级的逐年PM2.5数据、2000-2023年的省市县三级的逐年PM10数据、2013-2023年的省市县三级的逐年SO2数据、2000-2023年省市县三级的逐年O3数据和2008-2023年我国省市县三级的逐…...
C# 探险之旅:第十六节 - 整数类型:与八位数字精灵的奇幻舞会
嘿,勇敢的探险家们!欢迎再次踏上C#编程的奇幻之旅。今天,我们将进入一个充满魔法与数字的世界——整数类型的王国。想象一下,你站在一个华丽的舞池中,周围是八位身着华丽舞裙(其实是二进制位啦)…...
Cleo文件传输软件存在任意文件读取漏洞(CVE-2024-50623)
免责声明: 本文旨在提供有关特定漏洞的深入信息,帮助用户充分了解潜在的安全风险。发布此信息的目的在于提升网络安全意识和推动技术进步,未经授权访问系统、网络或应用程序,可能会导致法律责任或严重后果。因此,作者不对读者基于本文内容所采取的任何行为承担责任。读者在…...
Java 小抄|解析 JSON 并提取特定层级数据
文章目录 前言环境准备依赖库 示例代码JSON 数据Java 类定义解析 JSON 数据代码解释 结论 前言 在日常开发中,我们经常需要从 JSON 数据中提取特定的信息。本文将介绍如何使用 Java 和 Gson 库解析 JSON 数据,并通过流式处理提取特定层级的数据。我们将…...
活动报名:Voice Agent 开发者分享会丨RTE Meetup
引入 voice agent 的口语学习应用 Speak 估值已达 10 亿美元 Voice Agent 开发者分享会 一同探索语音驱动的下一代人机交互界面,一场 voice agent builder 的小规模深度交流会。 RTE Meetup 迎来第六期!12 月 15 日(周日)上午&…...
DOA估计算法——ESPRIT算法
1 简介 ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)最早是由Roy等人于1986年提出,是一种广泛应用于高分辨率方向到达(DOA)估计和频率估计的子空间方法。其核心思想基于信号子空间的…...
CEF 数据加密与网络安全
随着网络攻击的日益猖獗,确保应用的安全性已经成为开发者的首要任务。特别是在现代Web应用中,如何确保数据的加密存储、网络通信的安全性以及有效的认证机制成为至关重要的问题。对于基于 Chromium Embedded Framework (CEF) 的应用,开发者必…...
go build command
文章目录 1.简介2.格式3.选项4.示例5.小结参考文献 1.简介 go build 是 Go 语言工具链中的一个命令,它用于编译 Go 源代码并生成可执行文件。 2.格式 go build [-o output] [build flags] [packages]可选的 -o 选项强制 build 将生成的可执行文件或对象写入指定的…...
理解音频采样率和transformer模型:给Python小白的简单解释
理解音频采样率和transformer模型:给Python小白的简单解释 引言什么是采样率?举个例子有趣的现象Python小实验总结 引言 大家好!今天我们来聊一个有趣的话题:音频采样率和AI模型。不要被这些专业术语吓到,我会用最简单…...
【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用
📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...
大模型qiming面试内容整理-系统设计与架构
在大模型和机器学习相关岗位的面试中,系统设计与架构的考察通常会涉及如何设计一个可扩展、可靠且高效的机器学习系统,特别是在面对大规模数据和复杂模型时。这一部分的考察不仅测试候选人对机器学习和深度学习的理解,还会评估其如何设计实际生产环境中的系统来满足需求。以…...
Mac/Windows端长期破解myBase8方法(无需安装火绒)
提醒 不管哪个端,都需要先退出myBase。 Mac 进入用户根目录/Users/c0ny100,即下边是Macintosh HD > 用户 > [你的用户名]这个界面然后按ShiftCommond.,显示隐藏文件。找到.Mybase8.ini文件 打开.Mybase8.ini文件,删除Fir…...
firewall
firewall 如果系统使用 firewalld 作为防火墙管理工具,可以使用以下命令: 查看防火墙是否运行: systemctl status firewalld查看防火墙的状态(简洁输出): firewall-cmd --state输出示例: r…...
XSS(跨站攻击)
XSS漏洞(跨站脚本) 1.XSS 漏洞简介 XSS又叫CSS(Cross Site Script)跨站脚本攻击是指恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里
写一个shell脚本,把局域网内,把能ping通的IP和不能ping通的IP分类,并保存到两个文本文件里 脚本1 #!/bin/bash #定义变量 ip10.1.1 #循环去ping主机的IP for ((i1;i<10;i)) doping -c1 $ip.$i &>/dev/null[ $? -eq 0 ] &&am…...
Shell 解释器 bash 和 dash 区别
bash 和 dash 都是 Unix/Linux 系统中的 Shell 解释器,但它们在功能、语法和性能上有显著区别。以下是它们的详细对比: 1. 基本区别 特性bash (Bourne-Again SHell)dash (Debian Almquist SHell)来源G…...
Neo4j 完全指南:从入门到精通
第1章:Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…...
