ocrmypdf_pdf识别

安装

安装说明 

https://ocrmypdf.readthedocs.io/en/latest/installation.html#native-windows
提到需要的软件:
Python 3.7 (64-bit) or later
Tesseract 4.0 or later
Ghostscript 9.50 or later

安装 ocrmypdf

pip install ocrmypdf

添加语言包

https://ocrmypdf.readthedocs.io/en/latest/languages.html
从 https://github.com/tesseract-ocr/tessdata/  ,解压里面的扩展名为traineddata的文件,复制到 C:\Program Files\Tesseract-OCR\tessdata  {Tesseract-OCR安装目录}\tessdata

使用

命令行

ocrmypdf -l chi_sim --pdf-renderer tesseract --output-type pdf source.pdf ocr.pdf
-l language的意思,chi_sim对应 C:\Program Files\Tesseract-OCR\tessdata\ 路径下的 chi_sim.traineddata 文件,如果是中英文混排的情况,就把-l chi_sim改成
-l chi_sim+eng
更多使用说明 https://ocrmypdf.readthedocs.io/en/latest/cookbook.html

API

使用说明Using the OCRmyPDF API — ocrmypdf 16.0.3.dev5+g14365d1 documentation

import ocrmypdf

if __name__ == '__main__':  # To ensure correct behavior on Windows and macOS
    ocrmypdf.ocr('input.pdf', 'output.pdf', deskew=True)

中文处理

问题

由于ocrmypdf对中文pdf识别后存在空格,根据以下链接知道

preserve_interword_spaces option not working on 4.00alpha · Issue #781 · tesseract-ocr/tesseract · GitHub

extra space in the result pdf when the input pdf is in Chinese · Issue #715 · ocrmypdf/OCRmyPDF · GitHub

extra spaces in result when ocr chinese · Issue #991 · tesseract-ocr/tesseract · GitHub

 主要去设置tesseract的最关键参数是:

1

preserve_interword_spaces=1

正如这个链接所问的,extra space in the result pdf when the input pdf is in Chinese · Issue #715 · ocrmypdf/OCRmyPDF · GitHub,那么如何在ocrmypdf中设置呢?

解决过程

首先尝试的试试按照使用--tesseract-config方法(下面pdf9.2.5章节):

https://media.readthedocs.org/pdf/ocrmypdf/latest/ocrmypdf.pdf

命令:

ocrmypdf  -l chi_sim --tesseract-oem 1 --tesseract-pagesegmode 6 --tesseract-config C:\Users\Administrator\Desktop\my.cfg C:\Users\Administrator\Desktop\11.pdf 121.pdf

 或者(二者均可)

ocrmypdf  -l chi_sim --tesseract-config C:\Users\Administrator\Desktop\my.cfg C:\Users\Administrator\Desktop\11.pdf 121.pdf

其中my.cfg是一个本地文件:里面内容是

preserve_interword_spaces 1

经测试:上面的121.pdf还是无法实现pdf复制为不带空格的文字,但是导出txt可以实现不带空格。

这个评论是错的。https://github.com/ocrmypdf/OCRmyPDF/issues/885#issuecomment-1033367021 这个网友说了当你选择OEM选择LSTM模型(如下面说明,oem选择1或者2)时候,--tesseract-config不会生效,事实上会生效的。(被这个误导了很久)

下面资料来源于:All Tesseract OCR options – Muthukrishnan

也可以参考这里:用于光学字符识别的 Tesseract - 知乎

OCR options:
  --tessdata-dir PATH   Specify the location of tessdata path.
  --user-words PATH     Specify the location of user words file.
  --user-patterns PATH  Specify the location of user patterns file.
  -l LANG[+LANG]        Specify language(s) used for OCR.
  -c VAR=VALUE          Set value for config variables.
                        Multiple -c arguments are allowed.
  --psm NUM             Specify page segmentation mode.
  --oem NUM             Specify OCR Engine mode.
NOTE: These options must occur before any configfile.
Page segmentation modes:
  0    Orientation and script detection (OSD) only.
  1    Automatic page segmentation with OSD.
  2    Automatic page segmentation, but no OSD, or OCR.
  3    Fully automatic page segmentation, but no OSD. (Default)
  4    Assume a single column of text of variable sizes.
  5    Assume a single uniform block of vertically aligned text.
  6    Assume a single uniform block of text.
  7    Treat the image as a single text line.
  8    Treat the image as a single word.
  9    Treat the image as a single word in a circle.
 10    Treat the image as a single character.
 11    Sparse text. Find as much text as possible in no particular order.
 12    Sparse text with OSD.
 13    Raw line. Treat the image as a single text line,
       bypassing hacks that are Tesseract-specific.
OCR Engine modes: (see https://github.com/tesseract-ocr/tesseract/wiki#linux)
  0    Legacy engine only.
  1    Neural nets LSTM engine only.
  2    Legacy + LSTM engines.
  3    Default, based on what is available.

另外,我还测试了导出txt的结果,当你使用--tesseract-config C:\Users\Administrator\Desktop\my.cfg 之后可以保证导出的txt是不带空格的,pdf还是复制空格

再次使用命令:(其中--sidecar 121.txt表示输出txt)

ocrmypdf  --force-ocr --tesseract-config C:\Users\Administrator\Desktop\my.cfg -l chi_sim --sidecar 121.txt  C:\Users\Administrator\Desktop\11.pdf 121.pdf

效果:输出121.txt没有空格,121.pdf复制还有空格。  

经过测试:跟这个里面extra space in the result pdf when the input pdf is in Chinese · Issue #715 · ocrmypdf/OCRmyPDF · GitHub说的一样(但是他是ocrmypdf的老版本)即输出txt才会出现没有空格,pdf还是复制有空格。

Ocrmypdf的作者@jbarlow83一直说的是阅读器问题,但是事实上不是阅读器问题。 

也就是说我们只是部分解决(曲线救国)了pdf出现文本图层含有多余空格的问题。 

目前我测试了其他的大量方法均无效。作者也从未给出有效解决方案,目前日韩网友(Detection of extra spaces while running own trained tesseract for Korean OCR · Issue #1009 · tesseract-ocr/tesseract · GitHub)也存在这个问题。

以上总结:

(1)使用--tesseract-config设置可以实现:导出txt不带空格,但是pdf复制带空格。

(2)不使用--tesseract-config设置效果:导出txt带空格,pdf复制也是带空格。

最终思路

使用config设置,输出txt以复制文字。如果有大神可以继续给我提示,谢谢!

最佳思路:

 ocrmypdf --force-ocr --tesseract-config C:\Users\Administrator\Desktop\my.cfg -l chi_sim --sidecar out.txt C:\Users\Administrator\Desktop\input.pdf output.pdf 

彩蛋:测试数据与做好的my.cfg

测试数据:11.pdf官方版下载丨最新版下载丨绿色版下载丨APP下载-123云盘  提取码:newt

做好的my.cfg: https://www.123pan.com/s/9Rn9-qhQpH.html 

致谢

上面链接分享者。还有这个:https://github.com/dahuoyzs/javapdf/blob/master/OCRmyPDF%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B.md

后续

作者给我的最新回答是,"请理解这个问题是由于Tesseract产生的PDF,一些PDF阅读器不能正确解释,目前没有人有解决办法。"

我测试了tesseract v5.3.1.20230401出现的情况:

  tesseract input.png out -l chi_sim --oem 1 --psm 6 -c preserve_interword_spaces=1 pdf 

我得到了与ocrmypdf相同的结果:输出txt没有空格,但从pdf复制的文本仍然有空格。

因此,这个问题发生在Tesseract而不是ocrmypdf。这个结论需要让更多的用户知道。

最终篇

 目前看来,要想ocrmypdf使得输出pdf不出现复制文字的空格,唯一且不算特别好的解决方案就是使用oem 0(采取非LSTM模型,但是识别效果不好)

ocrmypdf  -l chi_sim --tesseract-oem 0 input.pdf output.pdf 

这种方法直接复制pdf的文字,不会出现空格,但是复制的文字有的识别不正确。

 这位网友的测试证实了我的说法:Chinese recognition was incorrectly segmented by spaces · Issue #2814 · tesseract-ocr/tesseract · GitHub

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

科研+临床观摩|牙科医生公派美国从事访问学者交流

很多临床医学专业的访问学者希望在访学从事科研的同时,能到医院进行临床观摩。对于这些申请者的要求,我们会尽量满足。本案例中的T医生,口语较弱,担心英语面试,最终我们为其取得了田纳西大学健康科学中心的邀请函&…

【QT】QStandardItemModel类的应用介绍

目录 1 概述 2 常用方法 3 QStandardItemModel的使用 3.1 界面设计与主窗口类定义 3.2 系统初始化 3.3 从文本文件导入数据 3.4 数据修改 3.5 单元格格式设置 3.6 数据另存为文件 1 概述 QStandardItemModel是标准的以项数据(itemdata)为基础的…

【Linux】set命令使用

set命令 设置所使用shell的执行方式,可依照不同的需求来做设置。 语法 set [参数]选项及作用 执行令 : man set 执行命令结果 参数 -a  标示已修改的变量,以供输出至环境变量。-b  使被中止的后台程序立刻回报执行状态。-C  转向所…

Android开发中“真正”的仓库模式

原文地址:https://proandroiddev.com/the-real-repository-pattern-in-android-efba8662b754原文发表日期:2019.9.5作者:Denis Brandi翻译:tommwq翻译日期:2024.1.3 Figure 1: 仓库模式 多年来我见过很多仓库模式的实…

liunx操作系统基础及进阶

一、基础入门 1、Linux系统简介 什么是Liunx? Linux在设计之初,是一个基于POSIX的多用户、多任务并且支持多线程和多CPU的操作系统,它是由世界各地成千上万的程序员设计和开发实现; 在当今社会,Linux 系统主要被应…

史上最细,13年老鸟总结-性能测试7大关键点,一篇打通...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 1、测试环境的鉴定…

MQTT基础下载使用

1.下载MQTT(MQTT官网) 下载完后在bin目录下启动cmd 控制台输入emqx start,注意,此时控制台是没有反应的,就回你个D:\EMQX。其实已经打开了。 打开桌面上的MQTTX 并新建连接 这是测试的数据 我订阅了一个test1的订阅 并且我发布…

跑步中位数

title: 跑步中位数 date: 2024-01-04 15:47:51 tags: 对顶堆 catefories: 算法进阶指南 题目大意 解题思路 动态维护中位数问题。可以建立两个二叉堆,一个大顶堆一个小顶堆,在依次读入整数序列的过程中,设当前序列长度为 M M M,我们始终保持…

软件测试之冒烟测试

一、什么是冒烟测试 这一术语源自硬件行业。对一个硬件或硬件组件进行更改或修复后,直接给设备加电。如果没有冒烟,则该组件就通过了测试。在软件中,“冒烟测试”这一术语描述的是在将代码更改嵌入到产品的源树中之前对这些更改进行验证的过…

通过聚道云软件连接器实现销帮帮软件与i人事软件的智能对接

客户介绍 某软件行业公司是一家专业从事软件技术服务、软件开发、应用解决方案、业务流程优化、专业服务的高科技企业。公司拥有一支经验丰富、技术精湛的服务团队,具备多年的软件开发和应用解决方案经验。他们不断追求技术的创新和进步,以满足客户不断…

CCF录用率怎么看?如何挑选合适的会议

写在前面 写此文是因为有同学问我如何确定自己能投稿的会议。首先,不建议直接用他人汇总好的数据(截稿时间和录用率),如果遇到更新不及时的很有可能耽误自己的工作。 平常,我都会自己收集预计投稿时间的会议信息&…

phpstudy_pro 关于多版本php的问题

我在phpstudy中安装了多个PHP版本 我希望不同的网站可以对应不同的PHP版本,则在nginx配置文件中需要知道不同的PHP版本的监听端口是多少,如下图所示 然而找遍了php.ini配置,并未对listen进行设置,好奇是怎么实现不同的PHP监听不同…

炼石白小勇:免改造安全技术实现数据监管合规与有序流通

2023年9月15日,2023世界计算大会在湖南长沙开幕。在开幕论坛上,全国政协副主席、民建中央常务副主席秦博勇指出,当今世界正在经历一场更大范围、更深层次的科技革命和产业变革。湖南省委书记沈晓明在致辞中说,湖南将推动计算产业开…

python的课后练习总结4(for循环)

1,for循环 for 临时变量 in 序列: 重复执行的代码1 重复执行的代码2 ........... 遍历序列 字符串 我是中国人 列表 [‘星期一,星期二,星期三,星期四] 元组 (‘星期一,星期二,星期三,星期四) 一,break 终止循环 二,con…

VS Code技巧汇总

VS Code技巧汇总 前言设置快捷键插件汇总环境搭建HTMLC/CPython 远程SSH连接被控端准备安装扩展配置SSH创建SSH连接打开终端窗口通过公钥连接SSH 前言 本文介绍VS Code的使用技巧,内容包含设置、快捷键、插件汇总、环境搭建、远程SSH连接、等等。 设置 中文界面 …

IDEA 每次新建工程都要重新配置 Maven的解决方案

文章目录 IDEA 每次新建工程都要重新配置 Maven 解决方案一、选择 File -> New Projects Setup -> Settingsfor New Projects…二、选择 Build,Execution,Deployment -> Build Tools -> Maven IDEA 每次新建工程都要重新配置 Maven 解决方案 DEA 每次新建工程都要…

完美解决Github 2fa二次验证问题

完美解决Github 2fa二次验证问题 原文阅读 https://onedayxyy.cn/docs/github-2fa 前言 你的 Github 账户可能被封禁! 教你应对 Github 最新的 2FA 二次验证! 无地区限制, 无额外设备的全网最完美方案 1、2FA 的定义 双因素身份验证 (2FA) 是一种身份和访管理安全方法&…

程序媛的mac修炼手册-- 终端shell的驾驭 zsh vs bash

进入终端(Terminal)为新下载的应用配置环境,是Mac生产力up up的关键一步,更是编程小白装大神的第一步。Fake it till you make it , 硅谷大神标准路径~ shell的基本原理 为应用配置环境,相当于在应用和操作系统间架桥。由此&…

Flask入门教程

Flask入门教程 简介 Flask是由Armin ronacher于2010年用Python语言基于 Werkzeug 工具箱编写的轻量级Web开发框架。 特点 Flask只提供核心功能,其他几乎所有的功能都需要用到拓展,比如可以通过Flask-SQLAlchemy拓展对数据库进行操作等等。 核心 由…

LeetCode(33) 搜索旋转排序数组

整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], ..., nums[n-1], nums[0], nums[1], ..…