Java如何識(shí)別圖片或掃描PDF中的文字詳解
前言
圖片和掃描文件通常以非文本格式存在,這使得其中的文字信息難以直接編輯、搜索或復(fù)制。為了解決這個(gè)問(wèn)題,光學(xué)字符識(shí)別(OCR)技術(shù)應(yīng)運(yùn)而生。OCR通過(guò)分析圖像中的文字區(qū)域并將其轉(zhuǎn)換為可編輯的文本,從而使用戶(hù)能夠輕松提取信息。如今,OCR已被廣泛應(yīng)用于文檔數(shù)字化、數(shù)據(jù)提取和文字搜索等多個(gè)領(lǐng)域,為各行各業(yè)帶來(lái)了便利。這篇博客將探討如何在Java中通過(guò)OCR技術(shù)識(shí)別圖片和掃描PDF文件中的文字。
使用工具
首先,我們需要選擇一個(gè)適當(dāng)?shù)腛CR庫(kù)。在Java中有許多OCR庫(kù),本文所使用的是Spire.OCR for Java。在使用該庫(kù)前,我們需要完成以下兩個(gè)步驟:
1. 在程序中引入該庫(kù)的JAR包
你可以通過(guò)官方地址下載該庫(kù)的JAR包或通過(guò)Maven倉(cāng)庫(kù)拉取,依賴(lài)如下:
<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位操作系統(tǒng)的兩種模型。我們需要根據(jù)自己的系統(tǒng)下載適合的模型:
下載完成后,將它解壓并保存到特定的目錄下。
完成以上兩個(gè)步驟后,我們就可以使用該庫(kù)實(shí)現(xiàn)識(shí)別圖片和掃描PDF中的文字。
Java識(shí)別圖片中的文字
以下是使用Spire.OCR for Java識(shí)別圖片中的文字的主要步驟:
- 創(chuàng)建OcrScanner類(lèi)的實(shí)例。
- 創(chuàng)建 ConfigureOptions 類(lèi)的實(shí)例來(lái)設(shè)置掃描器配置。
- 使用ConfigureOptions.setLanguage()方法指定文本識(shí)別的語(yǔ)言,默認(rèn)設(shè)置為English(支持語(yǔ)言:English,Chinese,Chinesetraditional,F(xiàn)rench,German,Japanese和Korean)。
- 使用ConfigureOptions.setModelPath()方法指定模型的路徑。
- 使用OcrScanner.ConfigureDependencies()方法將配置應(yīng)用于掃描器。
- 使用OcrScanner.scan()方法識(shí)別圖片中的文本。
- 使用OcrScanner.getText()方法從 OcrScanner 對(duì)象獲取已識(shí)別的文本。
- 將獲取的文本寫(xiě)入文本文件。
以下代碼示例展示了如何識(shí)別圖片中的文本并將結(jié)果保存到文本文件中:
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) {
// 從圖片中識(shí)別文字
String scannedText = scanTextFromImage("測(cè)試.png", "Chinese", "E:\\win-x64");
// 保存識(shí)別出的文字到文件
saveTextToFile(scannedText, "圖片文字.txt");
}
/**
* 方法:從圖片中識(shí)別文字
* @param imagePath 圖片路徑
* @param language OCR語(yǔ)言,支持語(yǔ)言包括 English, Chinese, Chinesetraditional, French, German, Japanese 和 Korean
* @param modelPath OCR模型路徑
* @return 識(shí)別出的文字
*/
private static String scanTextFromImage(String imagePath, String language, String modelPath) {
try {
// 創(chuàng)建OcrScanner類(lèi)的對(duì)象
OcrScanner scanner = new OcrScanner();
// 設(shè)置掃描器配置
ConfigureOptions configureOptions = new ConfigureOptions();
// 指定文本識(shí)別的語(yǔ)言
configureOptions.setLanguage(language);
// 指定模型的路徑
configureOptions.setModelPath(modelPath);
// 將配置應(yīng)用于掃描器
scanner.ConfigureDependencies(configureOptions);
// 識(shí)別圖片中的文本
scanner.scan(imagePath);
// 獲取識(shí)別出的文本
return scanner.getText().toString();
} catch (OcrException e) {
System.out.println("OCR 文字識(shí)別時(shí)發(fā)生錯(cuò)誤。");
e.printStackTrace();
return "";
}
}
/**
* 方法:將識(shí)別出的文字保存到文件
* @param text 識(shí)別出的文字
* @param filePath 保存文件路徑
*/
private static void saveTextToFile(String text, String filePath) {
// 將獲取的文本寫(xiě)入文本文件
try (FileWriter writer = new FileWriter(filePath)) {
writer.write(text);
System.out.println("文本已成功保存到 " + filePath);
} catch (IOException e) {
System.out.println("保存文本文件時(shí)發(fā)生錯(cuò)誤。");
e.printStackTrace();
}
}
}
原始圖片和識(shí)別結(jié)果:

Java識(shí)別掃描PDF中的文字
Spire.OCR for Java庫(kù)并不支持直接處理PDF,因此要從掃描的 PDF 中提取文本,我們首先需要將 PDF 文檔轉(zhuǎn)換為圖片。對(duì)于此任務(wù),我們將使用Spire.PDF for Java庫(kù)。轉(zhuǎn)換完成后,再利用 Spire.OCR 從生成的圖片中提取文本。
你可以通過(guò)該地址下載Spire.PDF for Java的JAR包或者通過(guò)Maven倉(cāng)庫(kù)拉?。?/p>
<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>
以下代碼示例展示了如何識(shí)別掃描PDF中的文本并將結(jié)果保存到文本文件中:
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 {
// 打開(kāi)掃描PDF文檔
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("掃描.pdf");
// 從掃描PDF文檔中識(shí)別文字并將結(jié)果保存到文本文件
for (int pageIndex = 0; pageIndex < pdf.getPages().getCount(); pageIndex++) {
BufferedImage image = convertPdfPageToImage(pdf, pageIndex);
String scannedText = recognizeTextFromImage(image, "Chinese", "E:\\win-x64");
// 將識(shí)別出的文本保存到文件
saveTextToFile(scannedText, "掃描PDF文字.txt");
}
}
/**
* 方法:將PDF頁(yè)面轉(zhuǎn)換為圖片
* @param pdf PDF文檔對(duì)象
* @param pageIndex 頁(yè)碼索引,從0開(kāi)始
* @return 轉(zhuǎn)換后的BufferedImage對(duì)象
* @throws IOException 如果轉(zhuǎn)換過(guò)程中發(fā)生I/O錯(cuò)誤
*/
private static BufferedImage convertPdfPageToImage(PdfDocument pdf, int pageIndex) throws IOException {
return pdf.saveAsImage(pageIndex);
}
/**
* 方法:從圖片中識(shí)別文字
* @param image 要識(shí)別的BufferedImage對(duì)象
* @param language OCR語(yǔ)言,支持語(yǔ)言包括 English, Chinese, Chinesetraditional, French, German, Japanese 和 Korean
* @param modelPath OCR模型路徑
* @return 識(shí)別出的文字
* @throws OcrException 如果OCR識(shí)別過(guò)程中發(fā)生錯(cuò)誤
* @throws IOException 如果轉(zhuǎn)換BufferedImage為InputStream時(shí)發(fā)生I/O錯(cuò)誤
*/
private static String recognizeTextFromImage(BufferedImage image, String language, String modelPath) throws OcrException, IOException {
// 將BufferedImage轉(zhuǎn)換為InputStream
ByteArrayOutputStream 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); // 設(shè)置OCR識(shí)別語(yǔ)言
configureOptions.setModelPath(modelPath); // 設(shè)置OCR模型路徑
scanner.ConfigureDependencies(configureOptions); // 應(yīng)用配置
// 識(shí)別文本
scanner.Scan(inputStream, OCRImageFormat.Png);
return scanner.getText().toString(); // 返回識(shí)別出的文本
}
/**
* 方法:將識(shí)別出的文本保存到文件
* @param text 識(shí)別出的文字
* @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("保存文本文件時(shí)發(fā)生錯(cuò)誤。");
e.printStackTrace();
}
}
}

注意事項(xiàng)
OCR的準(zhǔn)確性很大程度上受到圖片質(zhì)量的影響。使用清晰、對(duì)比度良好,不模糊、傾斜的圖片,可以提高識(shí)別結(jié)果的準(zhǔn)確性。不同OCR庫(kù)可能對(duì)不同語(yǔ)言和字體的支持程度不同,一些特定語(yǔ)言或字體可能識(shí)別效果較差。因此在識(shí)別完成后,最好再人工校正一遍。
總結(jié)
到此這篇關(guān)于Java如何識(shí)別圖片或掃描PDF中文字的文章就介紹到這了,更多相關(guān)Java識(shí)別圖片或掃描PDF文字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
servlet監(jiān)聽(tīng)實(shí)現(xiàn)統(tǒng)計(jì)在線人數(shù)功能 附源碼下載
這篇文章主要為大家詳細(xì)介紹了servlet監(jiān)聽(tīng)統(tǒng)計(jì)在線人數(shù)的實(shí)現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04
Java 對(duì)接飛書(shū)多維表格使用詳解(微服務(wù))
本文詳細(xì)介紹了如何基于飛書(shū)開(kāi)放平臺(tái)在微服務(wù)項(xiàng)目中操作飛書(shū)多維表格,包括應(yīng)用創(chuàng)建、授權(quán)、多維表數(shù)據(jù)操作(新增、查詢(xún)、刪除)以及Java SDK實(shí)現(xiàn)等步驟,感興趣的朋友跟隨小編一起看看吧2024-12-12
利用Java編寫(xiě)24點(diǎn)小游戲的實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于如何利用Java編寫(xiě)24點(diǎn)小游戲的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
java程序設(shè)計(jì)語(yǔ)言的優(yōu)勢(shì)及特點(diǎn)
在本篇文章里小編給大家分享的是一篇關(guān)于java程序設(shè)計(jì)語(yǔ)言的優(yōu)勢(shì)及特點(diǎn)的內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。2020-02-02
SpringMVC之DispatcherServlet配置文件應(yīng)該放在哪里呢
這篇文章主要介紹了SpringMVC之DispatcherServlet配置文件應(yīng)該放在哪里的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11

