利用cnocr库完成中文扫描pdf文件的文字识别

news2024/12/17 1:52:32

很多pdf文件文字识别软件都会收费,免费的网页版可能会带来信息泄露,还有一些类似于腾讯AI和百度AI的接口都有调用次数限制,因此,利用识别正确率极高且免费的cnocr库来自己动手做个pdf文件文字识别程序就是一个很不错的选择。以下程序利用pymupdf打开pdf文件并将页面图像数据读出,然后用numpypymupdf读取的页面图像转换为cnocr能够接受的np.ndarray格式的图像数据,再由cnocr进行文字识别。numpypymupdfcnocr库的安装都可以用pip install指令简单完成,不多赘述。

import numpy as np
from cnocr import CnOcr
from pymupdf import pymupdf


def 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_count

    if start_page < 0:
        start_page = 0
    if page_count < 0 or page_count + start_page > count:
        end_page = count
    else:
        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.width
            height = 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/)识别,更是连格式都能基本保持。

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

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

相关文章

大数据笔记之flink-cdc实时同步数据

大数据笔记之flink-cdc实时同步数据(mysql -->doris) 一、基本概念 Flink CDC 是一个基于流的数据集成工具&#xff0c;旨在为用户提供一套功能更加全面的编程接口&#xff08;API&#xff09;。 该工具使得用户能够以 YAML配置文件的形式&#xff0c;优雅地定义其 ETL&…

【数学】矩阵的逆与伪逆 EEGLAB

文章目录 前言matlab代码作用EEGLAB 中的代码总结参考文献 前言 在 EEGLAB 的使用中&#xff0c;运行程序时出现了矩阵接近奇异值&#xff0c;或者缩放错误。结果可能不准确。RCOND 1.873732e-20 的 bug&#xff0c;调查 EEGLAB 后发现是 raw 数据的问题。 matlab代码 A_1 …

RTMP推流平台EasyDSS在无人机推流直播安防监控中的创新应用

无人机与低空经济的关系密切&#xff0c;并且正在快速发展。2024年中国低空经济行业市场规模达到5800亿元&#xff0c;其中低空制造产业占整个低空经济产业的88%。预计未来五年复合增速将达到16.03%。 随着科技的飞速发展&#xff0c;公共安防关乎每一个市民的生命财产安全。在…

【记录49】vue2 vue-office在线预览 docx、pdf、excel文档

vue2 在线预览 docx、pdf、excel文档 docx npm install vue-office/docx vue-demi0.14.6 指定版本 npm install vue-office/docx vue-demi <template><VueOfficeDocx :src"pdf" style"height: 100vh;" rendere"rendereHandler" error&…

C# 探险之旅:第二十四节 - 类型class基础,一场“类”似的奇妙冒险

嘿&#xff0c;勇敢的探险家们&#xff01;欢迎来到C#王国的“类”似奇妙冒险&#xff01;今天&#xff0c;我们要深入探索一个神秘而强大的领域——class&#xff08;类&#xff09;。想象一下&#xff0c;class就像C#世界里的一块魔法土地&#xff0c;每块土地上都能孕育出独…

Burp suite 3 (泷羽sec)

声明 学习视频来自B站UP主 泷羽sec,如涉及侵泷羽sec权马上删除文章。 笔记只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 这节课旨在扩大自己在网络安全方面的知识面&#xff0c;了解网络安全领域的见闻&#xff0c;了…

cpptoml介绍

cpptoml 是一个用于 C 的开源库&#xff0c;旨在提供对 TOML&#xff08;Toms Obvious, Minimal Language&#xff09;格式的支持。它允许开发者轻松地在 C 项目中读取、解析和生成 TOML 格式的配置文件。cpptoml 是一个轻量级、易于使用的库&#xff0c;适用于那些希望将 TOML…

用户认证系统登录界面

下面是使用HTML和JavaScript实现的一个中文版登录界面&#xff0c;包含登录、注册和修改密码功能。注册成功后会显示提示信息&#xff0c;在登录成功后进入一个大大的欢迎页面。 1.代码展示 <!DOCTYPE html> <html lang"zh-CN"> <head><meta …

Pyside6 --Qt设计师--简单了解各个控件的作用之:Item Views

目录 一、List View二、Tree View三、Table View四、Column View 一、List View 学习方法和Buttons一样&#xff0c;大家自己在qt设计师上面在属性编辑区进行相应的学习&#xff01; 我就先紧着qt设计师的页面进行讲解&#xff0c;部分内容查自AI。 后面有什么好用的控件或者…

ArcGIS MultiPatch数据转换Obj数据

文章目录 ArcGIS MultiPatch数据转换Obj数据1 效果2 技术路线2.1 Multipatch To Collada2.2 Collada To Obj3 代码实现4 附录4.1 环境4.2 一些坑ArcGIS MultiPatch数据转换Obj数据 1 效果 2 技术路线 MultiPatch --MultipatchToCollada–> Collada --Assimp–> Obj 2.…

【mybatis】缓存

目录 1. mybatis的运行 1.1 引言 1.2 具体运行&#xff1a; 1.3 sqlSession 介绍local catch 2. 缓存 2.1 概念 2.2 使用缓存的原因 2.3 什么样的数据能使用缓存 3. Mybatis缓存 3.1 一级缓存 3.1.1 测试一级缓存 3.1.2 缓存失效的四种情况 $1 sqlSession不同 $…

ElasticSearch - 理解doc Values与Inverted Index倒排索引

文章目录 概述倒排索引&#xff1a;从图书馆的索引卡片谈起倒排索引的工作原理 docValues&#xff1a;从数据库的列式存储说起docValues的工作原理 docValues与倒排索引的对比两者的联系&#xff1a;组合使用&#xff0c;优化搜索与分析 小结 概述 在使用 Elasticsearch 进行大…

Python | 数据可视化中常见的4种标注及示例

在Python的数据可视化中&#xff0c;标注&#xff08;Annotation&#xff09;技术是一种非常有用的工具&#xff0c;它可以帮助用户更准确地解释图表中的数据和模式。在本文中&#xff0c;将带您了解使用Python实现数据可视化时应该了解的4种标注。 常见的标注方式 文本标注箭…

【原生js案例】如何实现一个穿透字体颜色的导航

普通的导航大家都会做&#xff0c;像这种穿透字体的导航应该很少见吧。高亮不是通过单独设置一个active类来设置字体高亮颜色&#xff0c;鼠标滑过导航项&#xff0c;字体可以部分是黑色&#xff0c;不分是白色&#xff0c;这种效果的实现 感兴趣的可以关注下我的系列课程【we…

前端中图标的使用

1 antd 使用inconfont.cn中的图标 <template><div class"icons-list"><icon-font type"icon-tuichu" /><icon-font type"icon-facebook" /><icon-font type"icon-twitter" /></div> </templ…

回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测

回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测 目录 回归预测 | MATLAB实现CNN-BiGRU卷积神经网络结合双向门控循环单元多输入单输出回归预测预测效果基本介绍程序设计参考资料预测效果 基本介绍 CNN-BiGRU,即卷积神经网络(CNN)与双…

医学分割数据集B超图片肝脏分割数据集labelme格式271张1类别

数据集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数)&#xff1a;271 标注数量(json文件个数)&#xff1a;271 标注类别数&#xff1a;1 标注类别名称:["liver"] 每个类别标注的框数&#xf…

【目标检查】YOLO系列之:Triton 推理服务器Ultralytics YOLO11

Triton 推理服务器 1、引言2、Triton服务器2.1 什么是Triton Inference Server2.2 将YOLO11 导出为ONNX 格式2.3 设置Triton 模型库2.3.1 创建目录结构2.3.2 将导出的ONNX 模型移至Triton 资源库 2.4 运行Triton 推断服务器2.4.1 使用 Docker 运行Triton Inference Server2.4.2…

论文学习——多种变化环境下基于多种群进化的动态约束多目标优化

论文题目&#xff1a;Multipopulation Evolution-Based Dynamic Constrained Multiobjective Optimization Under Diverse Changing Environments 多种变化环境下基于多种群进化的动态约束多目标优化&#xff08;Qingda Chen , Member, IEEE, Jinliang Ding , Senior Member, …

【C++】判断能否被 3, 5, 7 整除问题解析与优化

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述&#x1f4af;老师代码实现与分析老师代码逻辑分析优点缺点 &#x1f4af;学生代码实现与分析学生代码逻辑分析优点缺点 &#x1f4af;改进与优化优化代码实现优化…