SpringBoot+OCR 实现PDF 内容识别

一、SpringBoot+OCR对pdf文件内容识别提取

1、在 Spring Boot 中,您可以结合 OCR(Optical Character Recognition)库来实现对 PDF 文件内容的识别和提取。

一种常用的 OCR 库是 Tesseract,而 pdf2image 是一个用于将 PDF 转换为图像的工具,可以与 Tesseract 配合使用。

以下是一个简单的 Spring Boot 示例,演示如何使用 Tesseract 和 pdf2image 对 PDF 文件进行 OCR 识别和提取:

  1. 添加 Maven 依赖

在您的 Spring Boot 项目中,添加以下依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.5</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.30</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-debugger</artifactId><version>2.0.30</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app2</artifactId><version>2.0.30</version> <!-- 使用最新版本 -->
</dependency>
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version> <!-- 使用最新版本 -->
</dependency>
  1. 编写代码
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.apache.pdfbox.tools.PDFToImage;
import org.springframework.stereotype.Service;import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;@Service
public class OCRService {public String extractTextFromPDF(String pdfFilePath) {try {// Convert PDF to imagesList<BufferedImage> images = convertPDFToImages(pdfFilePath);// Use OCR to extract text from imagesStringBuilder extractedText = new StringBuilder();for (BufferedImage image : images) {extractedText.append(performOCR(image)).append("\n");}return extractedText.toString();} catch (Exception e) {e.printStackTrace();return "Error extracting text from PDF.";}}private List<BufferedImage> convertPDFToImages(String pdfFilePath) throws Exception {List<BufferedImage> images = new ArrayList<>();try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {PDFToImage pdfToImage = new PDFToImage();pdfToImage.setStartPage(1);pdfToImage.setEndPage(document.getNumberOfPages());pdfToImage.setOutputPrefix("outputImage");pdfToImage.processPages(document);for (int i = 1; i <= document.getNumberOfPages(); i++) {BufferedImage image = pdfToImage.getImage(i - 1);images.add(image);}}return images;}private String performOCR(BufferedImage image) throws Exception {ITesseract tesseract = new Tesseract();return tesseract.doOCR(image);}
}

在这个例子中,OCRService 类包含了两个方法。convertPDFToImages 方法将 PDF 文件转换为图像,而 performOCR 方法使用 Tesseract 对图像执行 OCR。最后,extractTextFromPDF 方法将这两个步骤结合在一起,对 PDF 中的每个页面执行 OCR,并返回提取的文本。

请注意,为了使这个示例运行,您需要在系统上安装 Tesseract OCR,并配置其环境变量,以便 Java 可以找到 Tesseract 的执行文件。此外,也需要配置 pdf2image 的相关依赖。

以上代码示例仅供参考,实际项目中可能需要根据具体情况进行适当的调整和优化。

2、Tesseract OCR

Tesseract OCR 是一个开源的光学字符识别引擎,由 Google 开发和维护。它能够识别图像中的文本并将其转换为可编辑的文本格式。以下是一些关于 Tesseract OCR 的关键信息:

主要特点:

  1. 多语言支持: Tesseract 支持多种语言的文本识别,包括但不限于英语、中文、西班牙语、法语等。
  2. 开源: Tesseract 是开源的,可以在 GitHub 上找到其源代码。这使得开发人员可以自由使用、修改和分发它。
  3. 灵活性: Tesseract 可以处理不同字体和样式的文本,并在一定程度上适应图像质量的变化。
  4. 训练自定义字体: 如果您有特定的字体需要识别,Tesseract 允许您使用训练数据来训练模型,以提高对这些字体的识别能力。

如何使用 Tesseract OCR:

  1. 安装 Tesseract OCR: 在您的系统上安装 Tesseract。它支持多个操作系统,包括 Windows、Linux 和 macOS。您可以从 Tesseract GitHub Releases 页面下载预编译的二进制文件。
  2. 配置环境变量: 将 Tesseract 可执行文件所在的目录添加到系统的 PATH 环境变量中,以便在命令行中直接调用 Tesseract。
  3. 使用 Tesseract: 您可以通过命令行或通过编程语言的接口使用 Tesseract。对于 Java,您可以使用 Tesseract 的 Java API(Tess4J)。

Tess4J(Java API for Tesseract):

Tess4J 是 Tesseract 的 Java 封装库,它允许您在 Java 应用程序中使用 Tesseract OCR。以下是一个简单的 Java 示例:

import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import java.io.File;public class TesseractExample {public static void main(String[] args) {ITesseract tesseract = new Tesseract();try {File imageFile = new File("path/to/your/image.png");String result = tesseract.doOCR(imageFile);System.out.println("OCR Result:\n" + result);} catch (Exception e) {e.printStackTrace();}}
}

确保您在项目中添加了 Tess4J 的依赖:

<dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.5</version> <!-- 使用最新版本 -->
</dependency>

此示例演示了如何使用 Tess4J 从图像文件中提取文本。请根据您的实际需求进行适当的配置和扩展。

3、SpringBoot+pdf2image

在Spring Boot中使用pdf2image库进行PDF到图像的转换通常涉及以下几个步骤:

  1. 添加 Maven 依赖:

    在您的 Spring Boot 项目的 pom.xml 文件中添加以下依赖:

    <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-tools</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-debugger</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-app2</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.68</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-graphics2d</artifactId><version>2.0.30</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox-font2d</artifactId><version>2.0.30</version></dependency><dependency><groupId>com.github.jai-imageio</groupId><artifactId>jai-imageio-core</artifactId><version>1.4.0</version></dependency><dependency><groupId>com.github.jai-imageio</groupId><artifactId>jai-imageio-jpeg2000</artifactId><version>1.3.0</version></dependency>
    </dependencies>
    
  2. 编写代码:

    创建一个服务类或控制器类,用于处理 PDF 到图像的转换。以下是一个简单的示例:

    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.rendering.PDFRenderer;
    import org.apache.pdfbox.tools.imageio.ImageIOUtil;
    import org.springframework.stereotype.Service;import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.IOException;@Service
    public class PdfToImageService {public void convertPdfToImages(String pdfFilePath, String outputFolderPath) {try {PDDocument document = PDDocument.load(new File(pdfFilePath));PDFRenderer pdfRenderer = new PDFRenderer(document);for (int page = 0; page < document.getNumberOfPages(); ++page) {BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300); // 300 DPIImageIOUtil.writeImage(image, outputFolderPath + "page_" + (page + 1) + ".png", 300);}document.close();} catch (IOException e) {e.printStackTrace();}}
    }
    
  3. 使用服务类:

    在您的控制器类或其他需要的地方使用 PdfToImageService

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RestController;@RestController
    public class PdfToImageController {@Autowiredprivate PdfToImageService pdfToImageService;@GetMapping("/convertPdfToImages/{pdfFileName}")public String convertPdfToImages(@PathVariable String pdfFileName) {String pdfFilePath = "path/to/pdf/files/" + pdfFileName + ".pdf";String outputFolderPath = "path/to/output/folder/";pdfToImageService.convertPdfToImages(pdfFilePath, outputFolderPath);return "PDF to images conversion complete.";}
    }
    

    这是一个简单的示例,您可以根据实际需求进行扩展和修改。确保您的项目中有适当的文件读取和写入权限,并根据需要添加错误处理。

二、SpringBoot+OCR对pdf文件内指定区域的内容识别提取

在Spring Boot中使用OCR对PDF文件的指定区域进行内容识别和提取,您需要结合PDF处理库和OCR库。以下是一个基本的步骤,其中使用了Apache PDFBox作为PDF处理库,Tesseract作为OCR库。

1. 添加 Maven 依赖:

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.30</version></dependency><dependency><groupId>net.sourceforge.tess4j</groupId><artifactId>tess4j</artifactId><version>4.5.5</version></dependency><!-- 其他可能需要的依赖 -->
</dependencies>

2. 编写服务类:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import net.sourceforge.tess4j.ITesseract;
import net.sourceforge.tess4j.Tesseract;
import org.springframework.stereotype.Service;import java.awt.Rectangle;
import java.io.File;
import java.io.IOException;@Service
public class PdfOcrService {public String extractTextFromPdfRegion(String pdfFilePath, Rectangle region) {try {PDDocument document = PDDocument.load(new File(pdfFilePath));PDFTextStripper pdfStripper = new PDFTextStripper();pdfStripper.setSortByPosition(true);String pdfText = pdfStripper.getText(document);String extractedText = performOCR(pdfText, region);document.close();return extractedText;} catch (IOException e) {e.printStackTrace();return "Error extracting text from PDF.";}}private String performOCR(String pdfText, Rectangle region) {ITesseract tesseract = new Tesseract();String extractedText = "";try {extractedText = tesseract.doOCR(pdfText, region);} catch (Exception e) {e.printStackTrace();}return extractedText;}
}

3. 使用服务类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;import java.awt.Rectangle;@RestController
public class PdfOcrController {@Autowiredprivate PdfOcrService pdfOcrService;@GetMapping("/extractText/{pdfFileName}")public String extractTextFromPdfRegion(@PathVariable String pdfFileName) {String pdfFilePath = "path/to/pdf/files/" + pdfFileName + ".pdf";// Define the region you want to extract (x, y, width, height)Rectangle region = new Rectangle(100, 100, 300, 200);return pdfOcrService.extractTextFromPdfRegion(pdfFilePath, region);}
}

在上述代码中,PdfOcrService 类加载PDF文档并使用PDFBox提取文本。然后,它调用performOCR 方法,该方法使用Tesseract OCR库对指定区域的文本进行识别。

请注意,这只是一个基本示例,您可能需要根据实际需求进行调整。确保在生产环境中处理异常和错误,以确保应用程序的稳定性。

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

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

相关文章

结构体基础全家桶(2)结构体指针

目录 指向结构体类型数据的指针&#xff1a; 指向结构体变量的指针&#xff1a; 创建&#xff1a; 应用&#xff1a; 注意事项&#xff1a; 指向结构体数组的指针 创建&#xff1a; 应用&#xff1a; 注意&#xff1a; 用结构体变量和指向结构体的指针做函数的参数 …

eNSP小实验---(简单混合)

实验目的&#xff1a;实现vlan10 vlan20 172网段用户互访 1.拓扑图 2.配置 PC1 其它同理 SW4 <Huawei> <Huawei>u t m Info: Current terminal monitor is off. <Huawei>sys <Huawei>sys Enter system view, return user view with CtrlZ. [Hua…

K8s(九)—volume.md

目录 volumeconfigMap介绍官网例子基于文件生成 ConfigMap使用 ConfigMap 数据定义容器环境变量使用单个 ConfigMap 中的数据定义容器环境变量 EmptyDirhostPathhostPath 配置示例 nfspersistentVolumeClaim volume https://kubernetes.io/zh-cn/docs/concepts/storage/volume…

深度学习小白学习路线规划

作为深度学习的初学者&#xff0c;以下是一个建议的学习路线&#xff0c;可以帮助你逐步掌握图像分类、目标检测与跟踪、实例分割和姿态估计&#xff1a; 掌握这些&#xff0c;计算机视觉算是入门了&#xff01; 1. 基础知识&#xff1a; 学习Python编程语言&#xff0c;它是…

当在VMware Workstation Pro 中查询不到ens33网卡的IP

在学习中我们经常要去查询ens33的IP&#xff0c;但是有时候会查询不到&#xff0c;今天就遇到了这样的问题并且找到了解决方法 记录一下 ip a 查询不到IP 显示代码为 ens33: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000 link/ether …

day18 根据一棵树的中序遍历与后序遍历构造二叉树

第一步&#xff1a;如果数组大小为零的话&#xff0c;说明是空节点了 第二步&#xff1a;如果不为空&#xff0c;那么取后序数组最后一个元素作为节点元素&#xff0c;找到根节点 第三步&#xff1a;找到后序数组最后一个元素在中序数组的位置&#xff0c;作为切割点 第四步…

[论文笔记] GAMMA: A Graph Pattern Mining Framework for Large Graphs on GPU

GAMMA: A Graph Pattern Mining Framework for Large Graphs on GPU GAMMA: 基于 GPU 的针对大型图的图模式挖掘框架 [Paper] [Code] ICDE’23 摘要 提出了一个基于 GPU 的核外(out-of-core) 图模式挖掘框架(Graph Pattern Mining, GPM) GAMMA, 充分利用主机内存来处理大型图…

〖大前端 - 基础入门三大核心之JS篇(55)〗- 内置对象

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;哈哥撩编程&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xff0c;目前在公司…

如何禁止孩子在电脑中浏览某些网页?

在使用电脑的过程中&#xff0c;我们会使用浏览器来查看网页。而在孩子使用电脑的过程中&#xff0c;有些网页并不适合孩子查看。因此&#xff0c;我们需要禁止孩子浏览不健康的网页。那么&#xff0c;该如何禁止孩子在电脑中浏览某些网页呢&#xff1f; 定时关机3000简介 定时…

LeetCode231. Power of Two

文章目录 一、题目二、题解 一、题目 Given an integer n, return true if it is a power of two. Otherwise, return false. An integer n is a power of two, if there exists an integer x such that n 2x. Example 1: Input: n 1 Output: true Explanation: 20 1 Ex…

QML 自定义进度条组件开发

一、效果预览 二、介绍&#xff1a; 自定义的QML 屏幕亮度拖动进度条组件CusProgressBar 可跟鼠标移动 更改进度条样式 三、代码 import QtQuick 2.12 import QtQuick.Controls 2.12 import QtQuick.Controls.Material 2.12/***author:Zwj*csdn:来份煎蛋吧*date:2023/12/16*…

c/c++中 qsort 与 bsearch 算法的使用

------------------------------------------------------------ author: hjjdebug date: 2023年 12月 13日 星期三 17:30:41 CST descriptor: qsort & bsearch 算法的使用 ------------------------------------------------------------ qsort 用来排序,bsearch用来搜索…

2k小权值和

package tgb.第二章;import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Scanner;public class okt2k小权值和 {static int N(int) (2e57); // static Map<Integer, Integer> S new HashMap<Integer, Integer>() ;stat…

复盘理解/实验报告梳理 数据结构PTA实验二

一、列车厢调度 感觉这道题的题干有点难以读懂&#xff0c;或是有些地方介绍的比较含蓄。 先设置两个字符串&#xff0c;来接收进道顺序与出道顺序&#xff0c;题目的内容和那个知道入栈顺序求出栈顺序比较像。 从头循环遍历&#xff0c;检查配对&#xff0c;不配对的就入栈&am…

如何禁止服务器自动休眠

如何禁止服务器自动休眠 有时候服务器自己休眠&#xff0c;导致系统web站点无法访问&#xff0c;下面是解决办法&#xff01; 禁止服务器自动进入休眠状态的具体方法可能会因使用的Linux发行版而有所不同。以下是一些通用的方法&#xff0c;你可以根据你的系统选择适用的&#…

python之画动态图 gif效果图

import pandas as pd import matplotlib import matplotlib.pyplot as plt import os# set up matplotlib is_ipython inline in matplotlib.get_backend() if is_ipython:from IPython import displayplt.ion()def find_csv_files(directory):csv_files [] # 用于存储找到的…

【机器学习】044_Kaggle房价预测(机器学习模型实战)

参考自《动手学深度学习》中“Kaggle比赛实战&#xff1a;预测房价”一节 一、数据准备 首先从网站上下载要获取的房价数据。 DATA_HUB是一个字典&#xff0c;用来将数据集名称的字符串和数据集相关的二元组一一对应。 二元组包含两个值&#xff1a;数据集的URL和用来验证文…

python实现最小二叉堆---最小堆结构

#来源于MOOC学习以及数据结构与算法分析# 在我们学习最小二叉堆代码实现之前&#xff0c;我们需要去了解一下&#xff0c;什么是最小二叉堆&#xff08;也有最大二叉堆&#xff0c;也叫最大堆&#xff09;。 也就是说什么是二叉堆&#xff1f;&#xff1f;&#xff1f;&#…

HiveSql语法优化三 :join优化

前面提到过&#xff1a;Hive拥有多种join算法&#xff0c;包括Common Join&#xff0c;Map Join&#xff0c;Bucket Map Join&#xff0c;Sort Merge Buckt Map Join等&#xff1b;每种join算法都有对应的优化方案。 Map Join 在优化阶段&#xff0c;如果能将Common Join优化为…

Excel中的INDIRECT函数用法

当在 Excel 中使用 INDIRECT 函数时&#xff0c;它可以帮助我们通过引用字符串中的单元格地址来获取对应单元格的值。这个函数非常有用&#xff0c;特别是在需要动态地引用其他单元格的情况下。下面是 INDIRECT 函数的一些用法和示例&#xff1a; 基本用法&#xff1a; INDIREC…