当前位置: 首页 > news >正文

如何在服务器端对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

相关文章:

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

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

Windows 下实验视频降噪算法 MeshFlow 详细教程

MeshFlow视频降噪算法 Meshflow 视频降噪算法来自于 2017 年电子科技大学一篇高质量论文。 该论文提出了一个新的运动模型MeshFlow,它是一个空间平滑的稀疏运动场 (spatially smooth sparse motion field),其运动矢量 (motion vectors) 仅在网格顶点 (m…...

Python入门:如何正确的控制Python异步并发量(制并发量的关键技巧与易错点解析)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 异步并发量控制 📒📝 Python异步并发简介📝 为什么要限制并发量🎈 资源管理🎈 服务稳定性📝 新手容易犯的错误🎈 忽略并发量限制🎈 错误设置并发量📝 设置并发量要注意的事情🎈 了解任务类型🎈 考虑系统资…...

qt QCheckBox详解

QCheckBox 是 Qt 框架中的一个控件,用于创建复选框,允许用户进行选择和取消选择。它通常用于表单、设置界面和任何需要用户选择的场景。 QCheckBox继承自QAbstractButton类,因此继承了按钮的特性。它表示一个复选框,用户可以通过…...

PAT甲级-1041 Be Unique

题目 题目大意 从一组数字中选出第一个唯一出现的数,输出该数。如果没有,则输出None。 思路 哈希的思想,将数值作为索引,对应该数值出现的次数,然后遍历数组即可。 注意第一个数字是指数字的个数,不是数…...

【jvm】如何设置堆内存大小

目录 1. 使用命令行参数设置2. idea中设置3. 注意事项 1. 使用命令行参数设置 1.在Java命令后添加-Xms和-Xmx参数。2.-Xms参数用于设置JVM的初始堆内存大小,等价于-XX:InitialHeapSize。3.-Xmx参数用于设置JVM的最大堆内存大小,等价于-XX:MaxHeapSize。…...

kernel源码分析 do_msgsnd read_msg

笔者分析的源码是v 5.11.22 链接:msg.c - ipc/msg.c - Linux source code v5.11.22 - Bootlin do_msgsnd static long do_msgsnd(int msqid, long mtype, void __user *mtext,size_t msgsz, int msgflg) {struct msg_queue *msq;struct msg_msg *msg;int err;str…...

掌握 CTE 技巧,实现连续日期和月份的 SQL 报表统计

在 SQL 查询中,报表统计往往涉及到特定时间段内的数据汇总,如每日、每月的销售数据等。然而,面对缺少数据的日期或月份,传统 SQL 查询可能会直接跳过这些日期,使得输出的报表在视觉上并不连续。本文将展示如何利用 CTE…...

【表格解决问题】EXCEL行数过多,WPS如何按逐行分别打印多个纸张中

1 问题描述 如图:我的表格行数太多了。打印在一张纸上有点不太好看 2 解决方式 Step01:先选中你需要打印的部分,找到【页面】->【打印区域】->【设置打印区域】 Step02:先选中一行,找到【插入分页符】 Step0…...

Maven讲解从基础到高级配置与实践

一、基础认知 1.1 Maven 的主要作用 Maven 主要是用来管理 Java 项目构建流程的工具,包括以下几个方面: 依赖管理:通过 POM.xml 文件管理项目的外部依赖库,不同版本的依赖包可以通过 Maven 中央仓库自动下载,减少了…...

Vue3组件式父子传值

下面是使用 <script setup> 语法的 Vue 3 组件之间传值的示例。 示例 1:使用 Props 和 Emits 父组件 <template><div><h1>父组件</h1><ChildComponent :message="parentMessage" @reply="handleReply" /><p>…...

网页自动化测试和爬虫:Selenium库入门与进阶

网页自动化测试和爬虫&#xff1a;Selenium库入门与进阶 在现代Web开发和数据分析中&#xff0c;自动化测试和数据采集成为了开发流程中的重要部分。Python 的 Selenium 库是一种强大的工具&#xff0c;不仅用于网页自动化测试&#xff0c;也在网页爬虫中得到了广泛的应用。本…...

Cells 单元

Goto Data Grid 数据网格 Cells 单元 Content Alignment 内容对齐 显示数值的数据网格单元格会将其内容向右对齐。显示其他类型数据的单元格将其内容向左排列。若要更改单元格内容对齐方式&#xff0c;请处理 ColumnView.RowCellDefaultAlignment 事件。 Selection Modes 选…...

2024/11/2 安卓创建首页界面

‌Gradle 8.7 bin‌是指Gradle 8.7版本的二进制包&#xff0c;通常以.zip或.tar.gz格式提供。这个二进制包包含了运行Gradle所需的所有文件&#xff0c;用户可以直接下载并解压使用&#xff0c;无需从源代码编译。 首先了解最常用的布局 线性布局&#xff08;从上到下&#x…...

SpringSession源码分析

默认对常规Session的理解和使用&#xff0c;如何使用Set-Cookie。 Maven库 常见的spring-session-data-redis依赖spring-session-core <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-core</artifactId&…...

IIC

IIC 目录 IIC BH1750型号的光照传感器 IIC通信协议 iic物理层 IIC软件层协议 -- 那么一主多从&#xff0c;怎么选中与指定的从机通信呢&#xff1f; 从机设备地址 -- 从手册中查看 IIC 写操作 IIC 读操作 硬件IIC和模拟 IIC 使用 模拟 IIC 使用 &#xff01;&…...

LLM Observability: Azure OpenAI (一)

作者&#xff1a;来自 Elastic Vinay Chandrasekhar•Andres Rodriguez 我们很高兴地宣布 Azure OpenAI 集成现已全面上市&#xff0c;它提供了对 Azure OpenAI 服务性能和使用的全面可观察性&#xff01;另请参阅本博客的第 2 部分 虽然我们已经提供了对 LLM 环境的可视性一段…...

qt QBrush详解

1、概述 QBrush是Qt框架中的一个基本图形对象类&#xff0c;它主要用于定义图形的填充模式。QBrush可以用于填充如矩形、椭圆形、多边形等形状&#xff0c;也可以用于绘制背景等。通过QBrush&#xff0c;可以设置填充的颜色、样式&#xff08;如实心、渐变、纹理等&#xff09…...

Excel函数CUnique连接合并指定区域的唯一值

上一篇文章向大家介绍了如何使用VBA在低版本Excel中创建unique函数的方法&#xff0c;今天我跟大家分享一下如何使用函数连接指定区域的唯一值&#xff0c;也就是将unique函数获取的唯一值连接合并成一个&#xff0c;并指定连接符。 同样&#xff0c;我们需要先创建一个自定义的…...

机械革命屏幕设置为RGB

机械革命屏幕设置为RGB 如何设为机械革命屏幕显示为RGB如何设置1.win菜单下输入“显卡控制中心”2.选择显示器3.设置为RGB4.饱和度大家设为自己舒服的就行5.调整亮度 参考来源 如何设为机械革命屏幕显示为RGB 之前买的显示器&#xff0c;感觉调成sRGB看起来非常舒服。就想着是…...

开源项目-投票管理系统

哈喽,大家好,今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页,发起投票,管理投票,参与投票,查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户可以在此轻松创建新的投票活动,设置投票主题、选项等信息。 管理…...

LeetCode 104.二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1…...

Android启动流程_Init阶段

前言 本文将会介绍 Android 启动流程&#xff0c;将基于 Android 10 代码逻辑介绍原生启动过程。 bootloader 上电 -> 加载 recovery 镜像或者 boot 镜像 -> linux kernel 启动 -> 加载 init 进程 -> 加载 zygote 进程 -> systemserver 进程 -> 系统启动 …...

萤火虫算法优化BILSTM神经网络多输入回归分析

目录 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 代码 结果分析 展望 完整代码下载:的MATALB代码(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88755564 背影 bp神经网络是一种成熟的神经网络,应用非常广,本文用萤火虫算法…...

在线QP(QuotedPrintable)编码解码工具

具体前往&#xff1a;Quoted-printable在线编码解码工具-将给定文本编码为:可打印字符引用编码(简称&#xff1a;QP编码)&#xff0c;也支持在线解码...

【已解决】cra 配置路径别名 @ 后,出现 ts 报错:找不到模块“@/App”或其相应的类型声明。ts(2307)

cra 配置路径别名 后&#xff0c;出现 ts 报错&#xff1a;找不到模块“/App”或其相应的类型声明。ts(2307) 然后可以在 tsconfig.json 中配置 baseUrl 和 paths &#xff1a; {"compilerOptions": {"target": "es5","lib": [&quo…...

leetcode-643. 子数组最大平均数 I

文章目录 二 解法2.1 每次都重新计算2.2 使用窗口 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。任何误差小于 10-5 的答案都将被视为正确答案。二 解法 2.1 每次都重新计算 超时 pu…...

论分布式架构设计及其实现

一、引言 随着互联网用户规模的扩大和需求的多样化&#xff0c;传统的集中式架构已经难以支撑高并发、高可用的系统要求。分布式架构的出现&#xff0c;提供了将计算和存储分布到不同服务器上的解决方案&#xff0c;有效提高了系统的可扩展性和容灾能力。分布式架构目前已广泛…...

基于BP神经网络的手写体数字图像识别

基于BP神经网络的手写体数字图像识别 摘要 在信息化飞速发展的时代&#xff0c;光学字符识别是一个重要的信息录入与信息转化的手段&#xff0c;其中手写体数字的识别有着广泛地应用&#xff0c;如&#xff1a;邮政编码、统计报表、银行票据等等&#xff0c;因其广泛地应用范围…...

QT——串口调试助手

目录 1.QSerialPort类包含了很多有关串口的API 2.实现串口的打开 2.1 方法一&#xff1a;通过函数实现 2.2 方法二&#xff1a;在ui界面右下角实现 3. 实现定时发送 3.1类的私有成员中添加定时器QTimer timer并去构造函数中初始化它 3.2帮助文档中有QTimer类相关的说明 …...