如何在服务器端对PDF和图像进行OCR处理

介绍

今天我想和大家分享一个我在研究技术资料时发现的很好玩的东西——Tesseract。这不仅仅是一个普通的库,而是一个用C语言编写的OCR神器,能够识别一大堆不同国家的语言。我一直在寻找能够处理各种文档的工具,而Tesseract就像是给了我一把万能钥匙。

有时候我们手头会有一堆扫描的文件或者图片,里面有很多有用的信息,但是它们就是静静地躺在那里,不能复制粘贴,也不能搜索。这让我特别头疼。直到我发现了Tesseract,这个问题才迎刃而解。它不仅能够识别英文,还能搞定中文、日文、韩文等等,简直是多语言文档的救星。

我在这里不是要给大家上技术课,而是想分享一个我觉得特别有意思的案例。这个案例展示了如何用Tesseract和其他几个开源工具,在服务器上把PDF文件和图片里的文字给“抠”出来。这个过程我觉得既神奇又实用,我觉得你们可能会感兴趣。

接下来,我会一步步地带你们了解这个过程。我们将会用到Ghostscript、Tesseract和PDFtk这三个工具,搭建起一个完整的OCR流水线。

我相信,这个案例也可以给你带来一些关于开发上新的思路和实用的小技巧。

那么,我们就不多废话了,一起来探索OCR的奥秘吧!

前提条件

如标题所示,是在服务器端对 PDF 进行 OCR 处理,所以我们我们需要一台 Linux 服务器,我的环境是 Ubuntu,建议与我的环境一致,避免运行的过程中出错。

如果你没有服务器,那可以跟着我的步骤 ,创建一台属于自己的Linux服务器,

我将会以 雨云 为例,带大家创建一台自己的云服务器,尝试本篇文章的内容。

注册链接: https://www.rainyun.com/NTEzMTM1_?s=blog

创建云服务器

以下内容只是参考,具体按照自己的需求选择配置即可。

点击“云产品”→“云服务器”→“立即购买”。

alt text

建议选择距离您较近的区域,以降低延迟。

alt text

选择配置。

alt text

选择Ubuntu 22.04版本,并看自己需求是否勾选预装Docker。

alt text

点击“立即购买”,并完成后续购买流程。 购买完成后,等待服务器部署完毕,进入管理面板,找到远程连接信息。

alt text

alt text

使用PowerShell进行远程连接:输入ssh root@你的服务器IP (例如ssh root@154.9.227.239),首次连接需输入yes,然后回车即可登录。

alt text

alt text

到这里,我们的服务器就创建完毕,并且能够远程SSH访问了。

教程开始

第一步:安装 Ghostscript、Tesseract 和 PDFtk

OCR既能处理PDF文件(PDF文件里有时也包含图片),也能直接处理图片。处理PDF文件会多一些步骤,如果你只处理图片,可以跳过这些步骤。

我们需要三个工具:

  • Ghostscript: 能把PDF转换成图片,也能把图片转换成PDF的工具。
  • Tesseract: OCR引擎,能把图片里的文字识别出来。
  • PDFtk: 这个工具比较小巧,主要用来把PDF文件拆分成单页,或者把单页重新组合成一个完整的PDF。

在Ubuntu系统上,安装这三个工具非常简单,只需要在终端输入以下命令:

sudo apt update
sudo apt install pdftk ghostscript tesseract-ocr x11-utils

安装完成后,可以用which命令检查一下是否安装成功:

which pdftk  
# /usr/bin/pdftk
which gs     
# /usr/bin/gs
which tesseract 
# /usr/bin/tesseract

接下来,我们就可以开始提取文字了!

第二步:将 PDF 转换为图片并运行 Tesseract

如果你没有PDF文件,可以下载我这个示例PDF文件先练练手,如果你有自己的PDF文件,可以替换后面内容中的文件名。

curl -L "https://paste.c-net.org/MckennaBuzzing" -o "OCR-sample-paper.pdf"

如果你的文件是PDF,首先需要把它转换成图片。我们可以用 Ghostscript 来完成这个任务:

mkdir output  # 创建一个文件夹存放生成的图片
gs -o output/%05d.png -sDEVICE=png16m -r300 -dPDFFitPage=true OCR-sample-paper.pdf

这段命令有点长,但别怕!我会解释这些参数:

  • -o output/%05d.png表示把图片保存到output文件夹,%05d会自动给图片编号;
  • -sDEVICE=png16m指定图片格式为PNG;
  • -r300设置图片分辨率;
  • -dPDFFitPage=true确保图片大小合适。

运行后会输出一下信息,Ghostscript 将单独输出 PDF 中的每个页面:

image-20241102210021799

完成后,你可以用ls output命令查看生成的图片。

image-20241102210119650

此时看到 output 目录下有14张图片,如果你的环境中有Nodejs环境,可以使用以下命令,将当前路径设置为静态资源目录,我们来看看,这些 png 图片是什么:

npx http-server

image-20241102210535236

运行好后浏览器打开网址,我这里是: http://you_server_ip:8080 并进入output目录

image-20241102210717639

我点击打开 00003.png ,发现是一张图片,图片并不能够复制文字。

接下来,我们用Tesseract把图片转换成可复制文字的PDF:

for png in $(ls output); do 
    tesseract -l eng \
        -c preserve_interword_spaces=0 \
        output/$png \
        output/$(echo $png | sed -e "s/\.png//g") \
        pdf
done

这段命令有点复杂,但核心就是用Tesseract识别图片里的文字,并生成PDF文件。-l eng表示使用英语语言模型,如果你需要识别其他语言,需要安装对应的语言包。

Tesseract会逐页处理图片,完成后,你可以在output文件夹里看到生成的PDF文件。

继续列出 output 目录下的内容,会看到多了同名的 PDF 文件。

image-20241102211444478

我们继续浏览器查看这些文件,还是打开00003.pdf

image-20241102211847225

发现这次就可以任意复制了,并且识别正确率还是很高的。

小提示: Ubuntu系统默认只安装了英语语言包,如果你需要识别其他语言,需要安装对应的语言包,例如sudo apt install tesseract-ocr-all安装所有语言包。

安装好后浏览器打开 https://tesseract-ocr.github.io/tessdoc/Data-Files-in-different-versions.html 这个网址,可以找到对应的 LangCode ,如果你需要识别中文,那么 -l 参数后面将 eng 修改为 chi_sim 即可。

第三步:把单页PDF合并成一个

如果你处理的是PDF文件,现在需要把第二步生成的单页PDF文件合并成一个完整的PDF文件。我们可以用 **PDFtk **来完成这个任务:

pdftk output/*.pdf cat output joined.pdf

image-20241102212644531

这段命令很简单,就是把output文件夹里的所有PDF文件合并成一个名为joined.pdf的文件。

最后,我们用 Ghostscript 调整一下PDF文件的格式,让它看起来更漂亮:

gs -sDEVICE=pdfwrite -sPAPERSIZE=letter -dFIXEDMEDIA -dPDFFitPage -o final.pdf joined.pdf

这段命令主要用来调整PDF的尺寸和格式。-sPAPERSIZE=letter表示使用Letter纸张大小,你可以根据需要修改。

现在,你已经成功地完成了OCR!如果实际应用到开发中,你可以使用这一系列工具,自动化完成,并且使用pdftotext final.pdf命令把PDF文件转换成文本文件,可以开发一个知识库的全文检索,将原本内容为图片扫描件的PDF提取文字。

相关链接
雨云 - 新一代云服务提供商: https://www.rainyun.com/NTEzMTM1_?s=blog
我的博客:https://blog.ivwv.site

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

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

相关文章

QT——TCP网络调试助手

目录 一.项目展示 ​编辑 二.开发流程 三.QTcpServer、QTcpSocket、QUdpSocket类的学习 1.QTcpServer服务端 2.QTcpSocket客户端 3.Udp通信 四.网络调试助手 1.首先我们实现当用户选择不同协议类型时不同的UI组件如何切换 2.实现打开/关闭按键图片的切换 方式一&…

eclipse下载与安装(汉化教程)超详细

目录 一、下载eclipse安装包 三、配置eclipse 代码自动补全功能 安装汉化包 中英文切换 四、用eclipse写hello world 一、下载eclipse安装包 1、首先进入 eclipse官网 如下: 2、这里面有很多版本;我们小白一般选择第二个,向下滑动&…

[FE] React 初窥门径(四):React 组件的加载过程(render 阶段)

1. 回顾 前几篇文章中,我们采用了 VSCode 插件 CodeTour 来记录代码的执行过程, 并把相关的数据 .tour/ 放到了 github: thzt/react-tour 中。 截止到本文为之,我们总共记录了这些 code-tour, .tour/ ├── 2. 构建过程.tour ├─…

什么是数字签名技术?

信息安全五要素 名称说明机密性机密性是指网络信息不泄露给非授权的用户、实体或程序,能够防止非授权者获取信息完整性完整性是指网络信息或系统未经授权不能进行更改的特性可用性可用性是指合法许可的用户能够及时获取网络信息或服务的特性可控性可控性是指可以控…

人工智能原理实验一:知识的表示与推理实验

一、实验目的 本实验课程是计算机、智能、物联网等专业学生的一门专业课程,通过实验,帮助学生更好地掌握人工智能相关概念、技术、原理、应用等;通过实验提高学生编写实验报告、总结实验结果的能力;使学生对智能程序、智能算法等有…

虚拟机 Email 恢复专用工具:Virtual Machine Email Recovery

天津鸿萌科贸发展有限公司从事数据安全服务二十余年,致力于为各领域客户提供专业的数据恢复、数据备份解决方案与服务,并针对企业面临的数据安全风险,提供专业的相关数据安全培训。 天津鸿萌科贸发展有限公司是 SysTools 系列数据恢复、取证及…

HTML 基础标签——表单标签<form>

文章目录 1. `<form>` 标签:定义表单容器2. `<input>` 标签:多用途输入控件3. `<textarea>` 标签:多行文本输入框4. `<select>` 标签:下拉选择框5. `<option>` 标签:下拉菜单选项6. `<button>` 标签:按钮元素7. `<label>` 标签…

使用Jupyter Notebook进行数据科学项目

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Jupyter Notebook进行数据科学项目 Jupyter Notebook 简介 安装 Jupyter Notebook 创建和管理 Notebook 编写和运行代码 示例…

详解RabbitMQ三种队列类型

RabbitMQ 是一个强大的消息队列系统&#xff0c;它提供了多种队列类型以满足不同的使用需求。本文将探讨三种主要队列类型&#xff1a;经典队列、仲裁队列和流式队列&#xff0c;并讨论它们的区别和选型建议。 经典队列&#xff08;Classic Queues&#xff09; 简介&#xff…

【AD】2-1 元件符号的绘制创建实例-电阻容/CHIP类器件

1.新建工程后&#xff0c;双击原理图库&#xff0c;点击Panels后&#xff0c;选择SCH Library&#xff0c;双击元器件可在右侧进行更改名称 2.点击视图&#xff0c;栅格&#xff0c;设置捕捉栅格为100mil 3.点击放置管脚&#xff0c;可按空格键进行旋转&#xff0c;按TAB键可以…

JDBC2(防止sql注入,数据库连接池)

防止SQL注入 sql注入&#xff1a;利用sql语句的语法特点&#xff0c;应用层输入特殊格式&#xff0c;让原有的sql语句失效 创建表结构 并加入数据 create table login(lid int primary key auto_increment,lname varchar(20),lpwd varchar(20),lsex varchar(2),laddr varcha…

基于SSM+微信小程序的订餐管理系统(点餐2)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的订餐管理系统实现了管理员和用户。管理端实现了 首页、个人中心、用户管理、菜品分类管理、菜品信息管理、订单信息管理、配送信息管理、菜品评价管理、订单投诉管理、…

MRCTF2020:你传你ma呢

文件上传题先判断黑白名单过滤&#xff0c;先传个最简单的木马 这里上传不了php文件&#xff0c;猜测可能是对php文件进行了过滤&#xff0c;将文件改为任意后缀这里改为.abc 还是上传不成功&#xff0c;猜测可能对MIME也做了过滤&#xff0c;将Content-Type更改为image/jpeg再…

设计模式09-行为型模式2(状态模式/策略模式/Java)

5.4 状态模式 5.4.1 状态模式的定义 1.模式动机&#xff1a;有些对象具有多种状态&#xff0c;这些状态在某些情况下能够相互转换&#xff0c;对象在不同的状态下将具有不同的行为&#xff0c;将拥有状态的对象中和状态的行为分离。 2.模式定义&#xff1a;允许一个对象在其…

tauri中shell的特殊字符

tauri中shell的特殊字符 官网例子&#xff1a;https://tauri.app/plugin/shell/ 中的入参是 \S 入参&#xff0c;但如果入参存在空格等特殊字符串&#xff0c;将无法传入 "permissions": [{"identifier": "shell:allow-execute","allow&qu…

电子电气架构 --- Trace 32(劳特巴赫)多核系统的调试

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…

使用Web Workers实现JavaScript的多线程编程

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 使用Web Workers实现JavaScript的多线程编程 引言 Web Workers 简介 创建和使用 Worker 通信机制 主线程向 Worker 发送消息 Wor…

【uni-app】创建自定义模板

1. 步骤 打开自定义模板文件夹 在此文件夹下创建模板文件&#xff08;注意后缀名&#xff09; 重新点击“新建页面” 即可看到新建的模板 2. 注意事项 创建的模板必须文件类型对应&#xff08;vue模板就创建*.vue文件, uvue模板就创建*.uvue文件&#xff09;

【云原生】Docker搭建开源翻译组件Deepl使用详解

目录 一、前言 二、微服务项目使用翻译组件的场景 2.1 多语言用户界面 2.2 业务逻辑中的翻译需求 2.3 满足实时通信的要求 2.4 内容管理系统 2.5 个性化推荐系统 2.6 日志和监控 三、开源类翻译组件解决方案 3.1 国内翻译组件方案汇总 3.1.1 百度翻译 3.1.2 腾讯翻…

Hms?: 1渗透测试

靶机&#xff1a;Hms?: 1 Hms?: 1 ~ VulnHub 攻击机&#xff1a;kail linux 2024 主机扫描阶段发现不了靶机&#xff0c;所以需要按DriftingBlues2一样手动配置网卡 1,将两台虚拟机网络连接都改为NAT模式&#xff0c;并查看靶机的MAC地址 2&#xff0c;攻击机上做主机扫描发现…