OCR识别PDF文件_ocr识别pdf格式-程序员宅基地

技术标签: java  - - OCR  

1现有解析pdf的方法
使用org.apache.pdfbox读取pdf,只能读取pdf中的文字,有些纸件扫描成的pdf文字会错乱,有些字还是图片的方式显示的,导致读取的内容不全,常常会获取不到想要的数据。

2 OCR文字识别
pdf需要转换为图片,进行识别,识别率高。

2.1 调用百度接口
优点:识别率高,识别速度快

缺点:按次收费

2.2 使用开源工具读取pdf文档
2.2.1 下载工具包
https://github.com/tesseract-ocr/tessdata 下载chi_sim.traineddata,chi_sim_vert.traineddata

2.2.2 添加依赖

<dependencies>
        <dependency>
            <groupId>net.sourceforge.tess4j</groupId>
            <artifactId>tess4j</artifactId>
            <version>4.4.0</version>
        </dependency>
 </dependencies>

2.2.3 编写程序

import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
public class TestTess {
    
         public static void main(String[] args) {
    
        // 识别图片的路径(修改为自己的图片路径)
       String path = "C:\\work\\notebook\\prototype\\target\\qq1.jpg";
       // 语言库位置(修改为跟自己语言库文件夹的路径)
      // String lagnguagePath = "C:\\work\\projects\\tess\\resources\\tessdata";
       File file = new File(path);
       ITesseract instance = new Tesseract();
       //设置训练库的位置
       //instance.setDatapath(lagnguagePath);
       //chi_sim :简体中文, eng    根据需求选择语言库
       instance.setLanguage("chi_sim");
       String result = null;
       try {
    
           long startTime = System.currentTimeMillis();
           result =  instance.doOCR(file);
           long endTime = System.currentTimeMillis();
           System.out.println("Time is:" + (endTime - startTime) + " 毫秒");
       } catch (TesseractException e) {
    
           e.printStackTrace();
       }
       System.out.println("result: ");
       System.out.println(result);                 
         }
}

2.3 读取pdf的特定位置的数据
2.3.1 手动截取pdf指定矩形区域的材料
需要前端配合做页面,改成自动获取,这样增加文档类型时,需要配置一下。

2.3.2 Python程序获取图片标识区域在整个文档中的矩形坐标

import aircv
def matchImg(imgsrc, imgobj, confidence=0.2):
    """
        图片对比识别imgobj在imgsrc上的相对位置(批量识别统一图片中需要的部分)
    :param imgsrc: 原始图片路径(str)
    :param imgobj: 待查找图片路径(模板)(str)
    :param confidence: 识别度(0<confidence<1.0)
    :return: None or dict({'confidence': 相似度(float), 'rectangle': 原始图片上的矩形坐标(tuple), 'result': 中心坐标(tuple)})
    """
    imsrc = aircv.imread(imgsrc)
    imobj = aircv.imread(imgobj)
    match_result = aircv.find_template(imsrc, imobj,
                                    confidence)  # {'confidence': 0.5435812473297119, 'rectangle': ((394, 384), (394, 416), (450, 384), (450, 416)), 'result': (422.0, 400.0)}
    if match_result is not None:
        match_result['shape'] = (imsrc.shape[1], imsrc.shape[0])  # 0为高,1为宽
    return match_result
template = {
    'address':'dz.jpg','doc_num':'fw.jpg','doc_type':'fwlx.jpg','issue_date':'fwrq.jpg',
              'int_cls': 'splb.jpg','apply_num':'sqh.jpg','applyer':'sqr.jpg','content':'zw.jpg'}
for key, value in template.items():

    orig = matchImg("target/qq.jpg","target/"+value)

    rect = orig['rectangle']

    w = rect[3][0] - rect[0][0]

    h = rect[3][1] - rect[0][1]

    x = rect[0][0]

    y = rect[0][1]

    ret = [x,y,w,h]

    print(key,ret)

2.3.3 Java程序根据矩形区域坐标,获取指定位置信息

package odysssey.tess;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import java.awt.Rectangle;
import net.sourceforge.tess4j.ITessAPI.TessPageIteratorLevel;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
public class TestTess {
    
         public static void main(String[] args) throws IOException {
    
        // 识别图片的路径(修改为自己的图片路径)
       String path = "C:\\work\\notebook\\prototype\\target\\qq.jpg";
       // 语言库位置(修改为跟自己语言库文件夹的路径)
      // String lagnguagePath = "C:\\work\\projects\\tess\\resources\\tessdata";
       File file = new File(path);
       ITesseract instance = new Tesseract();
       //设置训练库的位置
       /*
                     address [61, 312, 734, 82]

                          doc_num [1002, 338, 527, 78]

                          doc_type [425, 736, 801, 82]

                          issue_date [64, 593, 495, 64]

                          int_cls [115, 969, 346, 82]

                          apply_num [676, 589, 388, 68]

                          applyer [72, 450, 481, 68]

                          content [107, 899, 1439, 70]

        */    
         int rects[][] = {
    {
    61, 312, 734, 82},

                                         {
    1002, 338, 527, 78},

                                            {
    425, 736, 801, 82},

                                            {
    64, 593, 495, 64},

                                            {
    115, 969, 346, 82},

                                            {
    676, 589, 388, 68},

                                            {
    72, 450, 481, 68},

                                            {
    107, 899, 1439, 70}};
         
       //chi_sim :简体中文, eng    根据需求选择语言库

       instance.setLanguage("chi_sim");
       instance.setTessVariable("user_defined_dpi", "96");
       String result = null;
       try {
    
           long startTime = System.currentTimeMillis();
           //result =  instance.doOCR(file);
           for(int i = 0 ;i < rects.length;i++){
    
               Rectangle rr = new Rectangle(rects[i][0],rects[i][1],rects[i][2],rects[i][3]);
                    result =instance.doOCR(file, rr);
               System.out.println(result);                 
           }
    /*       List<Rectangle> resul=instance.getSegmentedRegions(ImageIO.read(file), TessPageIteratorLevel.RIL_SYMBOL);
           for (int i = 0; i < resul.size(); i++) {
               Rectangle rect = resul.get(i);
               System.out.println(String.format("Box[%d]: x=%d, y=%d, w=%d, h=%d", i, rect.x, rect.y, rect.width, rect.height));
           }
      */     long endTime = System.currentTimeMillis();
           System.out.println("Time is:" + (endTime - startTime) + " 毫秒");
       } catch (TesseractException e) {
    
           e.printStackTrace();
       }
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_23888451/article/details/104803782

智能推荐

四年背的单词 笔记目录_log infree accountall girls cams▼filterseeyamin19m-程序员宅基地

文章浏览阅读6.4w次。 做的笔记大致就是这样子的 2014 2014-8-2 11. manual automatism automatic atom anatomy atomic audio auto video audit commission 1audit commission 1audit pass 1事务:ACID (Atomicity Consistency Isola..._log infree accountall girls cams▼filterseeyamin19milk_mm20lumifoxi23pre

k8s kubeadmin方式安装部署_yum 安装 kubeadmin-程序员宅基地

文章浏览阅读492次。这两个字段取消注释,改成我们初始化主节点里的“--pod-network-cidr=” 的字段值。其中生成的 kubeadm join字段,第一个是能把机器变成主节点的命令,第二个是能把机器变成从节点的命令。#所有机器添加master域名映射,以下需要修改为自己的。可以敲如下命令查看当前的k8s集群(只初始化了主节点)初始化主节点(下面只在主节点执行)#各个机器设置自己的主机名。#各个机器分别执行下面内容。#各个机器分别执行下面内容。#各个机器分别执行如下内容。#打印加入节点的命令。_yum 安装 kubeadmin

pytorch--自定义loss(-log BinaryCrossEntropy FocalLoss)_pytorch focal loss binary cross_entropy-程序员宅基地

文章浏览阅读851次。负log loss;binary crossentropy;focal loss;网上找到的loss写的都普遍复杂,我自己稍微写的逻辑简单一点。if inputs.is_cuda and not self.alpha.is_cuda: self.alpha = self.alpha.cuda()focal lossfocal loss仔细实践起来可以分为两..._pytorch focal loss binary cross_entropy

net搭建mybatis开发环境_.net mybatis-程序员宅基地

文章浏览阅读1.7k次。mybatis其实就是ibatis的升级版本不仅能在java上使用,asp.net照样可以使用mybatis来开发程序。mybatis是一个比较小巧的ORM框架,类似hibernate。自己试了一下用法和java上的mybatis差不多。这次在.net的平台上我也来小试牛刀,弄个小程序出来看看,开发之前要去mybatis官网上下载2个包。1.asp.net版本的mybatis下载地址是http..._.net mybatis

RK3568驱动指南|第十一篇 pinctrl 子系统-第126章 通过pinctrl状态设置引脚复用实验_rk3568 复用配置-程序员宅基地

文章浏览阅读1k次,点赞19次,收藏11次。至此,关于pinctrl_bind_pins函数的重要内容就讲解完成了,通过pinctrl_bind_pins函数实现了为给定的设备绑定引脚,并在绑定过程中选择和设置适当的pinctrl状态,在124.1小节最后提出的struct pinctrl_state *default_state跟pinctrl_map结构体是什么时候建立起联系的问题也就解决了。·对于引脚复用设置(PIN_MAP_TYPE_MUX_GROUP),调用pinmux_enable_setting()函数来启用该设置。_rk3568 复用配置

在阿里云平台部署ChatGLM2-6B模型、langchain-ChatGLM2知识库_阿里云 chatglm2-程序员宅基地

文章浏览阅读492次。首先是登录阿里云账号,如果没有阿里云账号的需要先注册,然后完成实名认证。这里企业认证和个人认证都可以。接着领取账号免费试用的权益。在权益中心免费试用里面,选择交互式建模PAI-DSW,领取后将会获得3个月的免费试用时长。进入控制台,在上述界面中选择人工智能平台PAI,在左边菜单栏选择交互式建模(DSW)。点击创造实例,填写实例名称,资源组选择GPU规格只有这个选项支持试用资源包的抵扣。镜像选择官方镜像即可,我此时的镜像为接着下一步创建实例即可。等待环境准备完毕后启动打开即可。_阿里云 chatglm2

随便推点

解决修改antd样式导致全局修改问题_antd 全局替换字体-程序员宅基地

文章浏览阅读3.8k次。找到你想修改的classname全局覆盖样式::global { .ant-table { height: 220px; overflow-x: auto; }}单个独立样式:.mytables { :global { .ant-table { height: 220px; overflow-x: auto; } }}也可以设置多个样式:.mytables { :global { .ant-table table { text-a_antd 全局替换字体

(十九)AI虚拟拍照、AI虚拟旅游、AI虚拟摄像头,实时抠像、摄像头背景移除_实时抠像摄像头-程序员宅基地

文章浏览阅读485次。视频会议普及后,对摄像头人像的处理需求倍增。腾讯会议、Zoom会议等网络会议软件虽然有摄像头加虚拟背景功能,但是其功能有限,抠像不清晰。本文实现了对摄像头视频的抠像处理,并把摄像映射在一个虚拟摄像头(AI_Camera),此虚拟摄像头可以被各种网络会议软件使用,也可拍照;3、抠图算法的模型有4种:粗糙、细致、精细、超细,可以根据需要随意选择;简陋模型处理速度最快、超细的速度最慢。快慢也与视频分辨率强相关。1、对包含人像的摄像头实时视频进行抠像,并替换背景(可以替换成纯色的、也可以替换成指定背景图片);_实时抠像摄像头

input框只能输入数字或小数点_input只能输入数字和小数点-程序员宅基地

文章浏览阅读6k次,点赞4次,收藏12次。1:只能输入数字。如果还需要调用方法或多条规则来限制该输入框,用 ; 隔开。oninput="value=value.replace(/[^\d]/g,'');lessNum(this)"2:只能输入数字和小数点。其中d{0,2}为限制小数点的位数,2代表小数点后2位。oninput="value=value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g, '..._input只能输入数字和小数点

pigx动态路由及修改至静态路由_pigx 静态路由配置-程序员宅基地

文章浏览阅读724次,点赞19次,收藏19次。pigx中作者采用了动态获取路由配置信息,即路由信息是通过数据库进行配置而不是之前固定写在yml或properties文件中。pigx框架中有几个基础微服务分别是:register(一般是nacos的注册中心和配置中心),auth(认证服务)、upms(登录和项目初始化数据加载)、gateway(网关服务)。_pigx 静态路由配置

Linux【Mac】【parallels如何为ubuntu创建新的硬盘挂载】_parallels desktop 给虚拟机添加d盘-程序员宅基地

文章浏览阅读698次,点赞2次,收藏3次。然后打开我们的虚拟机,我们打开disk工具,也可以查看到我们新添加的硬盘。这时我们就可以看到我们新的硬盘已经被创建了。(我们的虚拟机必须要是关机状态!_parallels desktop 给虚拟机添加d盘

等待唤醒机制-程序员宅基地

文章浏览阅读944次。一、线程间通信概念:多个线程在处理同一个资源,但是处理的动作(线程任务)却不同比如:线程A用来生成包子,线程B用来吃包子,包子可以理解为同一资源,线程A和线程B处理的动作,一个是生产,一个是消费,那么线程A与线程B之间就存在线程通信问题。多个线程并发执行时,在默认情况下cpu是随机切换线程的,当我们需要多个线程来共同完成一件任务,并且我们希望他们有规律的执行,那么多线程之间需要一些协调通信,以此来帮我们达到多线程共同操作一份数据。 ..._等待唤醒机制

推荐文章

热门文章

相关标签