首页 > 编程语言 >Java识别获取PDF中文字信息(此方法任意PDF的信息都可以拿到)

Java识别获取PDF中文字信息(此方法任意PDF的信息都可以拿到)

时间:2023-04-01 14:24:30浏览次数:30  
标签:index Java text 代码 信息 发票 PDF

Java识别获取PDF中文字信息

一、举例需求(拿较难的发票识别举例)
    平时工作或者开发过程中如果遇到需要识别pdf发票中信息的情况,如获取发票代码号码,开票日期,校验码等,比如下面的发票,项目中需要读取发票中信息。

二、方法原理
    使用java中的pdfbox组件引用jar包使用,其中PDFTextStripper负责读取pdf中的文字信息,使用正则表达式寻找文字信息或者使用字符串定位寻找信息

    首先在pom文件中引用pdfbox, 引用pdfbox代码如下:

        <dependency>

            <groupId>org.apache.pdfbox</groupId>

            <artifactId>pdfbox</artifactId>

            <version>2.0.23</version>

        </dependency>

三、代码实现
    在引入pdfbox后,我们之间获取pdf文件信息,从前台传的文件中进行如下操作,

//multipartFile为multipartFile文件类型,将文件转化为文件流被PDDocument加载

PDDocument document = PDDocument.load(multipartFile.getInputStream());

document.getClass();

//使用PDFTextStripper 工具

PDFTextStripper tStripper = new PDFTextStripper();

//设置文本排序,有规则输出

tStripper.setSortByPosition(true);

//获取所有文字信息

String info = tStripper.getText(document);

    获取得到的发票信息如下所示是一些杂乱的文字信息

    我们现在目的是从这些杂乱信息中获取我们想要的信息,如发票代码,发票号码,开票日期,校验码

    下面就有两种方式获取这些信息,两种方式原理不同,可以分开使用也可以结合使用(更加万无一失)

方式一:使用正则表达式寻找关键信息

    寻找相似点,例如发票代码附近就有换行符的存在【\r\n】其他信息周围存在着空格或者年月日等字眼,通过这种方式我们来写正则匹配方式(正则其实我也不很会,看着其他正则写的)

    例如发票号码就是一个8位1-9的数字,周围都是是【\r\n】于是我们可以写成这样

[\r\n][0-9]{8}[\r\n]

其他的正则表达式可以写成

//发票代码

[0-9]{12}[\r]

//开票日期

\\d{4}[年]\\d{2}[月]\\d{2}[日]

//校验码

[ ]\d{5}[ ]\d{5}[ ]\d{5}[ ]\d{5}

    这样正则表达式就写完成了,通过表达式可以从散乱的信息中找到我们要的信息了

方式二:通过String寻找关键词位置

    这项有个缺点就是需要【发票代码:013002100111】这种形式的数据,如果不是的话就定位不到数据信息,原理是需找到【发票代码】的位置,然后取对应数量位的数字值,代码如下:

        int index = info.indexOf("发票代码");

        if (index == -1) {

            index = info.indexOf(key2);

            if (index == -1 || index == 0) {

                index = info.indexOf(key + " :");

            }

        }

        if ("发票代码".equals(key)) {

            String fpdm = info.substring(index + 5, index + 18);

            text = fpdm.replace(" ", "").replace(":", "").trim();

            text = text.length() > 12 ? text.substring(0, 12) : text;

            text = text.length() == 12 ? text : "";

        }

    通过定位找到对应的信息

四、总结
    这种方式不单单可以识别发票的PDF,其他PDF也可以识别获取。

 

标签:index,Java,text,代码,信息,发票,PDF
From: https://www.cnblogs.com/maybaco/p/17278543.html

相关文章

  • 剑指offer42(Java)-连续子数组的最大和(简单)
    题目:输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入:nums=[-2,1,-3,4,-1,2,1,-5,4]输出:6解释: 连续子数组 [4,-1,2,1]的和最大,为 6。提示:1<= arr.length<=10^5-100<=arr[i]<=1......
  • 信息搜寻理论-Information Foraging in Information Access Environments
    信息搜寻环境中的信息搜寻P.Pirolli和S.K.CardPeterPirolli,StuartK.Card(1995).InformationForaginginInformationAccessEnvironments.Conference:HumanFactorsinComputingSystems,CHI'95ConferenceProceedings,Denver,Colorado,USA,May7-11,1995摘要......
  • 【专题】2022年中国企业ESG战略与实践白皮书报告PDF合集分享(附原数据表)
    当前,随着气候变化、新冠疫情和地缘政治等重大突发事件的冲击,公司所处的宏观环境面临着越来越多的不确定性。在中国,伴随着“双碳”目标的实施和“共同富裕”的实施,我国的经济增长方式正在转向一种新的、同时也是一种生态与福利并重的增长方式。在这种情况下,ESG成为了许多公司关注的......
  • javascript 学习笔记3
    和let一样,通过const定义的变量不会被提升到顶端。const变量不能在声明之前使用。回调函数曾经是JavaScript中实现异步函数的主要方式。=>的使用:functiondoStep1(init,callback){constresult=init+1;callback(result);}functiondoStep2(init,callback){......
  • java reflection exception--can not access a member of class XXX with modifiers "
    Ifyoutrytovisitthevalueofanobject'sprivatefieldusingreflection,suchasField#getorField#set,youshouldcallField#setAccessibleahead.lookatthesampleprogrambelow.ItworkswhenIrunit.Field[]fields=ref......
  • Java 数组
    数组数组是相同类型数据的有序集合数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们数组的声明和创建首先必须声明数组变量,才能在程序中使用数组。Java语言使用new操作符来创建数组,语......
  • 微信小程序登录、获取用户信息的流程及实现
    微信小程序登录、获取用户信息的流程及实现本篇文章将通过以下三步,让你了解到小程序登录、和用户信息获取的微信生态变迁,和流程上前后端技术实现。小程序登录流程小程序获取手机号小程序获取头像昵称小程序登录小程序登录是通过微信官方提供的登录能力,获取微信提供的用......
  • Java 冒泡排序
    冒泡排序冒泡排序由嵌套循环完成,并分为外循环和内循环内循环负责比较数组中,两个相邻的元素,如果第一个数比第二个数大,则交换两者的位置,相邻两数依次循环进行比较每完成一次内循环比较(即外循环走完一步)都会产生一个当次内循环最大或者最小的数字并放在数组末尾所以外循......
  • Java 稀疏数组
    稀疏数组当一个数组中大部分元素为0时,或者为同一值的数组时,可以使用稀疏数组来保存该数组。稀疏数组的处理方式是:记录数组一共有几行几列,有多少个不同值把具有不同值的元素和行列及值记录在一个小规模的数组中,从而缩小程序的规模下面对该原始数组进行压缩,求出其稀疏数......
  • java方法- 冒泡排序
    冒泡排序冒泡排序是最为出名的排序之一,总共有八大排序冒泡的代码是两层循环,外层冒泡轮数,里层依次比较算法时间复杂度为O(n2)优化优化方法之一 ......