SpringBoot+OCR实现PDF内容识别的示例代码

 更新时间:2023年12月20日 11:04:28   作者:北执南念  
在SpringBoot中,您可以结合OCR库来实现对PDF文件内容的识别和提取,本文就来介绍一下如何使用 Tesseract 和 pdf2image 对 PDF 文件进行OCR识别和提取,具有一定的参考价值,感兴趣的可以了解一下

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

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

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

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

  • 添加 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>
  • 编写代码
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 images
            List<BufferedImage> images = convertPDFToImages(pdfFilePath);

            // Use OCR to extract text from images
            StringBuilder 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 的关键信息:

主要特点:

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

如何使用 Tesseract OCR:

  • 安装 Tesseract OCR: 在您的系统上安装 Tesseract。它支持多个操作系统,包括 Windows、Linux 和 macOS。您可以从 Tesseract GitHub Releases 页面下载预编译的二进制文件。
  • 配置环境变量: 将 Tesseract 可执行文件所在的目录添加到系统的 PATH 环境变量中,以便在命令行中直接调用 Tesseract。
  • 使用 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到图像的转换通常涉及以下几个步骤:

  • 添加 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>
    
  • 编写代码:

    创建一个服务类或控制器类,用于处理 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 DPI
                    ImageIOUtil.writeImage(image, outputFolderPath + "page_" + (page + 1) + ".png", 300);
                }
    
                document.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
  • 使用服务类:

    在您的控制器类或其他需要的地方使用 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 {
    
        @Autowired
        private 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 {

    @Autowired
    private 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库对指定区域的文本进行识别。

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

到此这篇关于SpringBoot+OCR实现PDF内容识别的示例代码的文章就介绍到这了,更多相关SpringBoot实现PDF内容识别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • springboot的控制反转和自动装配示例代码

    springboot的控制反转和自动装配示例代码

    这篇文章主要介绍了springboot的控制反转和自动装配的相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • Mybatis 在 insert 插入操作后返回主键 id的操作方法

    Mybatis 在 insert 插入操作后返回主键 id的操作方法

    这篇文章主要介绍了Mybatis 在 insert 插入操作后返回主键 id的操作方法,本文结合示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • 详解Java字节码编程之非常好用的javassist

    详解Java字节码编程之非常好用的javassist

    这篇文章主要介绍了详解Java字节码编程之非常好用的javassist,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • java后台接收app上传的图片的示例代码

    java后台接收app上传的图片的示例代码

    本篇文章主要介绍了java后台接受app上传的图片的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Java通过wait()和notifyAll()方法实现线程间通信

    Java通过wait()和notifyAll()方法实现线程间通信

    这篇文章主要为大家详细介绍了Java通过wait()和notifyAll()方法实现线程间通信的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • SpringBoot实现发送邮件功能过程图解

    SpringBoot实现发送邮件功能过程图解

    这篇文章主要介绍了SpringBoot实现发送邮件功能过程图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java设计模式之适配器模式简介

    Java设计模式之适配器模式简介

    这篇文章主要介绍了Java设计模式之适配器模式,需要的朋友可以参考下
    2014-07-07
  • Java中Stream流Map分组方式详细汇总

    Java中Stream流Map分组方式详细汇总

    Stream将要处理的元素集合看作一种流,在流的过程中借助Stream API对流中的元素进行操作,比如筛选、排序、聚合等,下面这篇文章主要给大家介绍了关于Java中Stream流Map分组方式的相关资料,需要的朋友可以参考下
    2024-01-01
  • Java线程的全方位详解

    Java线程的全方位详解

    Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销
    2021-10-10
  • java  工厂方法详解及实例代码

    java 工厂方法详解及实例代码

    这篇文章主要介绍了java 工厂方法详解及实例代码的相关资料,需要的朋友可以参考下
    2017-01-01

最新评论