目录
使用工具
Java识别图片中的文字
Java识别扫描PDF中的文字
注意事项
图片和扫描文件通常以非文本格式存在,这使得其中的文字信息难以直接编辑、搜索或复制。为了解决这个问题,光学字符识别(OCR)技术应运而生。OCR通过分析图像中的文字区域并将其转换为可编辑的文本,从而使用户能够轻松提取信息。如今,OCR已被广泛应用于文档数字化、数据提取和文字搜索等多个领域,为各行各业带来了便利。这篇博客将探讨如何在Java中通过OCR技术识别图片和扫描PDF文件中的文字。
使用工具
首先,我们需要选择一个适当的OCR库。在Java中有许多OCR库,本文所使用的是Spire.OCR for Java。在使用该库前,我们需要完成以下两个步骤:
1. 在程序中引入该库的JAR包
你可以通过官方地址下载该库的JAR包或通过Maven仓库拉取,依赖如下:
<repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url></repository>
</repositories>
<dependency><groupId>e-iceblue</groupId><artifactId>spire.ocr</artifactId><version>1.9.19</version>
</dependency>
2. 下载Spire.OCR for Java的模型
Spire.OCR for Java提供了支持Win 64位和Linux 64位操作系统的两种模型。我们需要根据自己的系统下载适合的模型:
- Win-x64
- Linux
下载完成后,将它解压并保存到特定的目录下。
完成以上两个步骤后,我们就可以使用该库实现识别图片和扫描PDF中的文字。
Java识别图片中的文字
以下是使用Spire.OCR for Java识别图片中的文字的主要步骤:
- 创建OcrScanner类的实例。
- 创建 ConfigureOptions 类的实例来设置扫描器配置。
- 使用ConfigureOptions.setLanguage()方法指定文本识别的语言,默认设置为English(支持语言:English,Chinese,Chinesetraditional,French,German,Japanese和Korean)。
- 使用ConfigureOptions.setModelPath()方法指定模型的路径。
- 使用OcrScanner.ConfigureDependencies()方法将配置应用于扫描器。
- 使用OcrScanner.scan()方法识别图片中的文本。
- 使用OcrScanner.getText()方法从 OcrScanner 对象获取已识别的文本。
- 将获取的文本写入文本文件。
以下代码示例展示了如何识别图片中的文本并将结果保存到文本文件中:
import com.spire.ocr.ConfigureOptions;
import com.spire.ocr.OcrException;
import com.spire.ocr.OcrScanner;import java.io.FileWriter;
import java.io.IOException;public class ExtractTextFromImage {public static void main(String[] args) {// 从图片中识别文字String scannedText = scanTextFromImage("测试.png", "Chinese", "E:\\win-x64");// 保存识别出的文字到文件saveTextToFile(scannedText, "图片文字.txt");}/*** 方法:从图片中识别文字* @param imagePath 图片路径* @param language OCR语言,支持语言包括 English, Chinese, Chinesetraditional, French, German, Japanese 和 Korean* @param modelPath OCR模型路径* @return 识别出的文字*/private static String scanTextFromImage(String imagePath, String language, String modelPath) {try {// 创建OcrScanner类的对象OcrScanner scanner = new OcrScanner();// 设置扫描器配置ConfigureOptions configureOptions = new ConfigureOptions();// 指定文本识别的语言configureOptions.setLanguage(language);// 指定模型的路径configureOptions.setModelPath(modelPath);// 将配置应用于扫描器scanner.ConfigureDependencies(configureOptions);// 识别图片中的文本scanner.scan(imagePath);// 获取识别出的文本return scanner.getText().toString();} catch (OcrException e) {System.out.println("OCR 文字识别时发生错误。");e.printStackTrace();return "";}}/*** 方法:将识别出的文字保存到文件* @param text 识别出的文字* @param filePath 保存文件路径*/private static void saveTextToFile(String text, String filePath) {// 将获取的文本写入文本文件try (FileWriter writer = new FileWriter(filePath)) {writer.write(text);System.out.println("文本已成功保存到 " + filePath);} catch (IOException e) {System.out.println("保存文本文件时发生错误。");e.printStackTrace();}}
}
原始图片和识别结果:
Java识别扫描PDF中的文字
Spire.OCR for Java库并不支持直接处理PDF,因此要从扫描的 PDF 中提取文本,我们首先需要将 PDF 文档转换为图片。对于此任务,我们将使用Spire.PDF for Java库。转换完成后,再利用 Spire.OCR 从生成的图片中提取文本。
你可以通过该地址下载Spire.PDF for Java的JAR包或者通过Maven仓库拉取:
<repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url></repository>
</repositories>
<dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf</artifactId><version>10.10.0</version>
</dependency>
以下代码示例展示了如何识别扫描PDF中的文本并将结果保存到文本文件中:
import com.spire.ocr.ConfigureOptions;
import com.spire.ocr.OCRImageFormat;
import com.spire.ocr.OcrException;
import com.spire.ocr.OcrScanner;
import com.spire.pdf.PdfDocument;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.*;public class ExtractTextFromScannedPDF {public static void main(String[] args) throws OcrException, IOException {// 打开扫描PDF文档PdfDocument pdf = new PdfDocument();pdf.loadFromFile("扫描.pdf");// 从扫描PDF文档中识别文字并将结果保存到文本文件for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {BufferedImage image = convertPdfPageToImage(pdf, pageIndex);String scannedText = recognizeTextFromImage(image, "Chinese", "E:\\win-x64");// 将识别出的文本保存到文件saveTextToFile(scannedText, "扫描PDF文字.txt");}}/*** 方法:将PDF页面转换为图片* @param pdf PDF文档对象* @param pageIndex 页码索引,从0开始* @return 转换后的BufferedImage对象* @throws IOException 如果转换过程中发生I/O错误*/private static BufferedImage convertPdfPageToImage(PdfDocument pdf, int pageIndex) throws IOException {return pdf.saveAsImage(pageIndex);}/*** 方法:从图片中识别文字* @param image 要识别的BufferedImage对象* @param language OCR语言,支持语言包括 English, Chinese, Chinesetraditional, French, German, Japanese 和 Korean* @param modelPath OCR模型路径* @return 识别出的文字* @throws OcrException 如果OCR识别过程中发生错误* @throws IOException 如果转换BufferedImage为InputStream时发生I/O错误*/private static String recognizeTextFromImage(BufferedImage image, String language, String modelPath) throws OcrException, IOException {// 将BufferedImage转换为InputStreamByteArrayOutputStream os = new ByteArrayOutputStream();ImageIO.write(image, "PNG", os);InputStream inputStream = new ByteArrayInputStream(os.toByteArray());// 配置并初始化OCR扫描器OcrScanner scanner = new OcrScanner();ConfigureOptions configureOptions = new ConfigureOptions();configureOptions.setLanguage(language); // 设置OCR识别语言configureOptions.setModelPath(modelPath); // 设置OCR模型路径scanner.ConfigureDependencies(configureOptions); // 应用配置// 识别文本scanner.Scan(inputStream, OCRImageFormat.Png);return scanner.getText().toString(); // 返回识别出的文本}/*** 方法:将识别出的文本保存到文件* @param text 识别出的文字* @param filePath 保存文件的路径*/private static void saveTextToFile(String text, String filePath) {try (FileWriter writer = new FileWriter(filePath)) {writer.write(text);System.out.println("文本已成功保存到 " + filePath);} catch (IOException e) {System.out.println("保存文本文件时发生错误。");e.printStackTrace();}}
}
注意事项
OCR的准确性很大程度上受到图片质量的影响。使用清晰、对比度良好,不模糊、倾斜的图片,可以提高识别结果的准确性。不同OCR库可能对不同语言和字体的支持程度不同,一些特定语言或字体可能识别效果较差。因此在识别完成后,最好再人工校正一遍。
本文完结。