Java实现PDF文字内容识别,结合OCR实现PDF图片实现

使用插件:UMI-OCR、PDFBOX

实现思路:通过PDFBOX识别PDF文字,如果是图片,则识别不出来,再调用OCR进行识别返回文字;OCR识别较慢,长图识别不出来,目前HTTP方式只支持图片格式,还需使用PDFBOX要将每一页PDF转换为图片再进行识别拼接。

UMI-OCR下载地址:https://github.com/hiroi-sora/Umi-OCR/releases/latest

git仓库地址:GitHub - hiroi-sora/Umi-OCR: OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。

下载后直接在WIN系统安装(目前只支持WIN系统),安装包内含PaddleOCR-json,无需再进行下载;安装启动,设置HTTP请求参数

全局设置 --> 高级 --> 允许HTTP服务:

主机设置为:任何可用地址

端口:自己设置

PDFBOX MAVEN版本配置:

 <!-- PDF文档处理 --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.8</version></dependency>

代码实现文字识别:

String text = "";try {PDDocument pdDocument = PDDocument.load(image.getInputStream());PDFTextStripper pdfTextStripper = new PDFTextStripper();//读取pdf中所有的文件//前端HTML不识别><,需要进行更换text = pdfTextStripper.getText(pdDocument);text = text.replace(" ", "").replace("\r", "").replace("\t", "").replace("\n", "");if (StrUtil.isNotEmpty(text)){text = text.replace("<","&lt;").replace(">","&gt;");}else{/*** 如果没有识别到文字,* 则转成图片* 进行OCR识别获取文本*/text = uploadPDF2OcrGetText(accessUrl, image);}}catch (IOException e){log.error(e.getMessage());}

如果文档里面含有"<"">",前端HTML不识别,则需要进行转换

uploadPDF2OcrGetText:
    /*** 上传图片文件至OCR* @param accessUrl 访问地址* @param image 图片文件* @return*/public static String uploadPDF2OcrGetText(String accessUrl, MultipartFile image) {List<ByteArrayOutputStream> list = getStreamList(image);StringBuilder sb = new StringBuilder();if (list != null && !list.isEmpty()){for (ByteArrayOutputStream outputStream : list) {String str = getData(accessUrl, outputStream);if (StrUtil.isNotEmpty(str)){sb.append(str);}}}return sb.toString();}

将PDF转为图片流方法getStreamList:

    /*** PDFBOX将PDF转成png流* @param file 图片文件* @return List*/public static List<ByteArrayOutputStream> getStreamList(MultipartFile file) {List<ByteArrayOutputStream> list = new ArrayList<>();try{PDDocument pdf = PDDocument.load(file.getInputStream());PDFRenderer renderer = new PDFRenderer(pdf);int pageCount = pdf.getNumberOfPages();for (int i = 0; i < pageCount; i++){BufferedImage image = renderer.renderImageWithDPI(i, 120);//120为DPI根据自己设置ByteArrayOutputStream bas = new ByteArrayOutputStream();ImageIO.write(image, "png", bas);list.add(bas);}}catch (IOException e){log.error(e.getMessage());}return list;}

调用OCR识别文字方法getData:

 /*** 上传图片文件至OCR* @param accessUrl 访问地址* @param outputStream 图片流* @return*/public static String getData(String accessUrl, ByteArrayOutputStream outputStream){//转换为Base64String base64Image = new String(Base64.encodeBase64(outputStream.toByteArray()));//如果文件属于图片则进行文件转换JSONObject jb = new JSONObject();jb.set("base64", base64Image);JSONObject jb1 = new JSONObject();jb1.set("tbpu.parser", "multi_para");jb1.set("data.format", "text");jb.set("options", jb1);String result2 = HttpRequest.post(accessUrl).body(jb.toString())//表单内容.timeout(300000)//数据可能较大,超时时间调的较长.execute().body();JSONObject jsonObject = JSONUtil.parseObj(result2);String text = null;if ("100".equals(jsonObject.getStr("code"))){text = jsonObject.getStr("data");}return text;}

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

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

相关文章

【设计模式】二、UML 类图与面向对象设计原则 之 UML概述

二、UML 类图与面向对象设计原则 &#xff08;一&#xff09;UML 类图 UML 概述类与类的UML图示类之间的关系 &#xff08;二&#xff09;面向对象设计原则 单一职责原则&#xff08;Single Responsibility Principle, SRP&#xff09;开闭原则&#xff08;Open-Closed Princip…

雅特力车规级MCU-AT32A403A开发板评测 06 GC9A01 SPI-LCD 1.28圆形屏幕

雅特力车规级MCU-AT32A403A开发板评测 06 GC9A01 SPI-LCD 1.28圆形屏幕 硬件平台 AT32A403A Board开发板 1.28寸圆形彩色TFT显示屏高清IPS 模块240X240 SPI接口GC9A01 产品介绍 推荐一个屏幕资料参考网站 http://www.lcdwiki.com/1.28inch_IPS_Module 1.28寸圆形IPS彩屏&…

C语言——动态内存分配

前言&#xff1a;通过前面的学习&#xff0c;我们知道C语言中在内存中开辟空间的方法有&#xff1a;变量和数组。既然拥有了开辟空间的方法&#xff0c;我们为什么还要学习动态内存分配呢&#xff1f; int val 20; //在内存中开辟四个字节的空间 int arr[10] { 0 }; //在内…

【金三银四】掌趣科技24.3.7 H项目 服务端开发笔试题

考试题型&#xff1a; 不定项选择题 10 道 &#xff0c; 填空题 10 道 &#xff0c; 问答题 2 道 &#xff0c; 编程题 4 道 目录 不定项选择题 10 道填空题 10 道问答题 2 道编程题 4 道 不定项选择题 10 道 在TCP协议中&#xff0c;发送方的窗口大小是由两个关键因素共同决定…

鸿蒙 Harmony 初体验

前言 看现在网上传得沸沸扬扬的鸿蒙&#xff0c;打算弄个 hello world 玩一下, 不然就跟不上时代的发展了 环境安装 我的环境 Windows 11 家庭中文版HarmonyOS SDK (API 9)DevEco Studio (3.1.1 Release)Node.js (16.19.1) 开发IDE下载 官方下载链接 配置 nodejs 这里帮…

Opencascade基础教程(9):切换视图

1、切换视图 1、1 增加视图切换按钮&#xff0c;并添加消息响应函数。 void COCCDemoView::OnButtonFrontview() {//前视图m_View->SetProj(V3d_Yneg);m_View->FitAll(); }void COCCDemoView::OnButtonRearview() {//后视图m_View->SetProj(V3d_Ypos);m_View->Fit…

【华为Datacom数通认证】HCIA-HCIP-HCIE

华为认证课程概述 华为认证是华为技术有限公司(简称"华为")基于"平台生态"战略&#xff0c;围绕"云-管-端"协同的新ICT技术架构&#xff0c;打造的业界覆盖ICT领域最广的认证体系&#xff0c;包含"ICT技术架构认证"、"ICT开发者…

学习JAVA的二十二天(基础)

目录 网络编程 三要素&#xff1a; IP InetAddress类 端口号 协议 UDP协议 TCP协议 前言&#xff1a;学习JAVA的第二十一天&#xff08;基础&#xff09;-CSDN博客 网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序,进行的数据传输。 三要素&#xff1a;…

installation of package ‘RDocumentation’ had non-zero exit status

installation of package ‘RDocumentation’ had non-zero exit status Warning in install.packages :installation of package ‘httr’ had non-zero exit status Warning in install.packages :installation of package ‘openssl’ had non-zero exit status 由于项目需…

蓝桥杯(1):python排序

1 基础 1.1 输出 1.1.1 去掉输出的空格 print("Hello","World",123,sep"") print("hello",world,123,sep) print(hello,world,123) #输出结果 #HelloWorld123 #helloworld123 #hello world 123 1.1.2 以不同的方式结尾 print(&quo…

Ubuntu Flask 运行 gunicorn+Nginx 部署

linux Ubuntu 下运行python 程序出现killed 原因&#xff1a;CPU或内存限制&#xff1a;在华为云上&#xff0c;你可能有CPU或内存使用的限制。例如&#xff0c;如果你使用的是一个固定大小的实例&#xff0c;那么超过该实例的CPU或内存限制可能会导致进程被杀死。 参考&am…

Python Web开发记录 Day10:Django part4 靓号管理与优化

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 1、数据库准备2、靓号列表3、新建靓号4、编辑靓…

Vue手写模拟步骤条

效果图&#xff1a; 如果要使用element的步骤条就需要强行修改样式&#xff0c;参考之前的那篇步骤条。这里我采用手写div 代码&#xff1a; 思路是给最外层的div一个左边框&#xff0c;给里面的step-item设置左边框为图片&#xff0c;通过定位来移动。 <div class"m…

Canal实现mysql与缓存同步

什么是Canal Canal是阿里巴巴旗下的一款开源项目, 基于java开发. Canal是基于mysql的主从同步来实现的. github地址: https://github.com/alibaba/canal Canal把自己伪装成MySQL的一个slave节点, 从而监听master的binary log变化. 再把得到的变化信息通知给Canal的客户端, 进而…

个人简历主页搭建系列-02:github 仓库作为联系方式

这篇文章暂时没有开始正式搭建网站。首先是最重要的注意事项&#xff1a;隐私。 真实姓名如果大家自己不介意的话其实我觉得还好&#xff0c;现在在互联网上想扒个姓名挺简单的&#xff0c;而且很多人都实名上网hh&#xff08;比如我的几位田径队学弟笑&#xff09;。 电话&a…

小程序学习3 goods-card

pages/home/home home.wxml <goods-listwr-class"goods-list-container"goodsList"{{goodsList}}"bind:click"goodListClickHandle"bind:addcart"goodListAddCartHandle"/> <goods-list>是一个自定义组件&#xff0c;它具…

[抽象]工厂模式([Abstract] Factory)——创建型模式

[抽象]工厂模式——创建型模式 什么是抽象工厂&#xff1f; 抽象工厂模式是一种创建型设计模式&#xff0c;让你能够保证在客户端程序中创建一系列有依赖的对象组时&#xff0c;无需关心这些对象的类型。 具体来说&#xff1a; 对象的创建与使用分离&#xff1a; 抽象工厂模…

信号与系统学习笔记——信号的分类

目录 一、确定与随机 二、连续与离散 三、周期与非周期 判断是否为周期函数 离散信号的周期 结论 四、能量与功率 定义 结论 五、因果与反因果 六、阶跃函数 定义 性质 七、冲激函数 定义 重要关系 作用 一、确定与随机 确定信号&#xff1a;可以确定时间函数…

uniapp移动端 IOS系统下无法与webview通信

不知道有没有人遇到过这个问题 我的页面嵌套了一个webview&#xff08;文件位于项目的hybrif/html&#xff09;目录下 使用evalJS与webview进行通信 代码如下 在安卓里运行是没问题的&#xff0c;但在苹果手机上一直无法通信 连接真机&#xff0c;打印evalJS是个方法&#xf…

C语言中内存函数的使用

memcpy函数的使用和模拟实现 memcpy的使用 函数使用说明&#xff1a; • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 • 这个函数在遇到 \0 的时候并不会停下来。 • 如果source和destination有任何的重叠&#xff0c;复制的结…