Java如何識別圖片或掃描PDF中的文字詳解
前言
圖片和掃描文件通常以非文本格式存在,這使得其中的文字信息難以直接編輯、搜索或復(fù)制。為了解決這個問題,光學(xué)字符識別(OCR)技術(shù)應(yīng)運而生。OCR通過分析圖像中的文字區(qū)域并將其轉(zhuǎn)換為可編輯的文本,從而使用戶能夠輕松提取信息。如今,OCR已被廣泛應(yīng)用于文檔數(shù)字化、數(shù)據(jù)提取和文字搜索等多個領(lǐng)域,為各行各業(yè)帶來了便利。這篇博客將探討如何在Java中通過OCR技術(shù)識別圖片和掃描PDF文件中的文字。
使用工具
首先,我們需要選擇一個適當(dāng)?shù)腛CR庫。在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位操作系統(tǒng)的兩種模型。我們需要根據(jù)自己的系統(tǒng)下載適合的模型:
下載完成后,將它解壓并保存到特定的目錄下。
完成以上兩個步驟后,我們就可以使用該庫實現(xiàn)識別圖片和掃描PDF中的文字。
Java識別圖片中的文字
以下是使用Spire.OCR for Java識別圖片中的文字的主要步驟:
- 創(chuàng)建OcrScanner類的實例。
- 創(chuàng)建 ConfigureOptions 類的實例來設(shè)置掃描器配置。
- 使用ConfigureOptions.setLanguage()方法指定文本識別的語言,默認(rèn)設(shè)置為English(支持語言:English,Chinese,Chinesetraditional,F(xiàn)rench,German,Japanese和Korean)。
- 使用ConfigureOptions.setModelPath()方法指定模型的路徑。
- 使用OcrScanner.ConfigureDependencies()方法將配置應(yīng)用于掃描器。
- 使用OcrScanner.scan()方法識別圖片中的文本。
- 使用OcrScanner.getText()方法從 OcrScanner 對象獲取已識別的文本。
- 將獲取的文本寫入文本文件。
以下代碼示例展示了如何識別圖片中的文本并將結(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) { // 從圖片中識別文字 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 { // 創(chuàng)建OcrScanner類的對象 OcrScanner scanner = new OcrScanner(); // 設(shè)置掃描器配置 ConfigureOptions configureOptions = new ConfigureOptions(); // 指定文本識別的語言 configureOptions.setLanguage(language); // 指定模型的路徑 configureOptions.setModelPath(modelPath); // 將配置應(yīng)用于掃描器 scanner.ConfigureDependencies(configureOptions); // 識別圖片中的文本 scanner.scan(imagePath); // 獲取識別出的文本 return scanner.getText().toString(); } catch (OcrException e) { System.out.println("OCR 文字識別時發(fā)生錯誤。"); 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("保存文本文件時發(fā)生錯誤。"); e.printStackTrace(); } } }
原始圖片和識別結(jié)果:
Java識別掃描PDF中的文字
Spire.OCR for Java庫并不支持直接處理PDF,因此要從掃描的 PDF 中提取文本,我們首先需要將 PDF 文檔轉(zhuǎn)換為圖片。對于此任務(wù),我們將使用Spire.PDF for Java庫。轉(zhuǎn)換完成后,再利用 Spire.OCR 從生成的圖片中提取文本。
你可以通過該地址下載Spire.PDF for Java的JAR包或者通過Maven倉庫拉?。?/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>
以下代碼示例展示了如何識別掃描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 { // 打開掃描PDF文檔 PdfDocument pdf = new PdfDocument(); pdf.loadFromFile("掃描.pdf"); // 從掃描PDF文檔中識別文字并將結(jié)果保存到文本文件 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頁面轉(zhuǎn)換為圖片 * @param pdf PDF文檔對象 * @param pageIndex 頁碼索引,從0開始 * @return 轉(zhuǎn)換后的BufferedImage對象 * @throws IOException 如果轉(zhuǎn)換過程中發(fā)生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識別過程中發(fā)生錯誤 * @throws IOException 如果轉(zhuǎn)換BufferedImage為InputStream時發(fā)生I/O錯誤 */ 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識別語言 configureOptions.setModelPath(modelPath); // 設(shè)置OCR模型路徑 scanner.ConfigureDependencies(configureOptions); // 應(yīng)用配置 // 識別文本 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("保存文本文件時發(fā)生錯誤。"); e.printStackTrace(); } } }
注意事項
OCR的準(zhǔn)確性很大程度上受到圖片質(zhì)量的影響。使用清晰、對比度良好,不模糊、傾斜的圖片,可以提高識別結(jié)果的準(zhǔn)確性。不同OCR庫可能對不同語言和字體的支持程度不同,一些特定語言或字體可能識別效果較差。因此在識別完成后,最好再人工校正一遍。
總結(jié)
到此這篇關(guān)于Java如何識別圖片或掃描PDF中文字的文章就介紹到這了,更多相關(guān)Java識別圖片或掃描PDF文字內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
servlet監(jiān)聽實現(xiàn)統(tǒng)計在線人數(shù)功能 附源碼下載
這篇文章主要為大家詳細(xì)介紹了servlet監(jiān)聽統(tǒng)計在線人數(shù)的實現(xiàn)方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-04-04SpringMVC之DispatcherServlet配置文件應(yīng)該放在哪里呢
這篇文章主要介紹了SpringMVC之DispatcherServlet配置文件應(yīng)該放在哪里的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11