使用Java提取PDF中的文字的三種常見(jiàn)方法
使用 Java 提取 PDF 中的文字
在日常開(kāi)發(fā)中,我們經(jīng)常需要從 PDF 文件中提取文本,比如用于文檔分析、搜索功能、數(shù)據(jù)挖掘等。本篇文章將介紹三種常見(jiàn)的方法:
- Apache PDFBox(適用于大部分 PDF)
- iText(支持復(fù)雜格式 PDF)
- Tesseract OCR(適用于掃描版 PDF)
1. 使用 Apache PDFBox 提取 PDF 文本
1.1 添加 Maven 依賴(lài)
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
1.2 代碼示例
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import java.io.File;
import java.io.IOException;
public class PDFTextExtractor {
public static void main(String[] args) {
String pdfPath = "sample.pdf"; // 替換為你的 PDF 文件路徑
try (PDDocument document = PDDocument.load(new File(pdfPath))) {
PDFTextStripper pdfStripper = new PDFTextStripper();
String text = pdfStripper.getText(document);
System.out.println("提取的文本內(nèi)容:\n" + text);
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.3 說(shuō)明
PDDocument.load(File):加載 PDF 文件。PDFTextStripper.getText(document):提取文本。- 適用于大部分 PDF,但如果 PDF 采用了圖片格式(掃描版),無(wú)法提取。
2. 使用 iText 提取 PDF 文本
2.1 添加 Maven 依賴(lài)
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.1.17</version>
</dependency>
2.2 代碼示例
import com.itextpdf.kernel.pdf.*;
import com.itextpdf.kernel.pdf.canvas.parser.PdfTextExtractor;
import java.io.File;
import java.io.IOException;
public class ITextPDFTextExtractor {
public static void main(String[] args) {
String pdfPath = "sample.pdf"; // 替換為你的 PDF 文件路徑
try (PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfPath))) {
StringBuilder extractedText = new StringBuilder();
for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
extractedText.append(PdfTextExtractor.getTextFromPage(pdfDoc.getPage(i))).append("\n");
}
System.out.println("提取的文本內(nèi)容:\n" + extractedText);
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.3 說(shuō)明
PdfReader(pdfPath):加載 PDF 文件。PdfTextExtractor.getTextFromPage(pdfDoc.getPage(i)):逐頁(yè)提取文本。- 適用于大部分 PDF,支持更復(fù)雜的文本解析。
3. 使用 Tesseract OCR 處理掃描版 PDF
如果 PDF 是掃描版(僅包含圖片),需要 OCR 識(shí)別文本。
3.1 添加 Maven 依賴(lài)
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.5</version>
</dependency>
3.2 代碼示例
import net.sourceforge.tess4j.Tesseract;
import net.sourceforge.tess4j.TesseractException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class OCRPDFExtractor {
public static void main(String[] args) throws IOException, TesseractException {
String pdfPath = "scanned.pdf"; // 替換為你的 PDF 文件路徑
PDDocument document = PDDocument.load(new File(pdfPath));
PDFRenderer pdfRenderer = new PDFRenderer(document);
Tesseract tesseract = new Tesseract();
tesseract.setDatapath("tessdata"); // 設(shè)置 Tesseract 訓(xùn)練數(shù)據(jù)路徑
tesseract.setLanguage("eng"); // 設(shè)置語(yǔ)言
StringBuilder extractedText = new StringBuilder();
for (int i = 0; i < document.getNumberOfPages(); i++) {
BufferedImage image = pdfRenderer.renderImage(i);
extractedText.append(tesseract.doOCR(image)).append("\n");
}
document.close();
System.out.println("OCR 提取的文本內(nèi)容:\n" + extractedText);
}
}
3.3 說(shuō)明
PDFRenderer.renderImage(i):將 PDF 頁(yè)轉(zhuǎn)換為圖片。tesseract.doOCR(image):執(zhí)行 OCR 識(shí)別文本。- 適用于無(wú)可選文本的掃描版 PDF。
4. 總結(jié)
| 方法 | 適用場(chǎng)景 | 主要特點(diǎn) |
|---|---|---|
| Apache PDFBox | 普通 PDF | 輕量、易用,適用于大部分 PDF |
| iText | 復(fù)雜格式 PDF | 功能強(qiáng)大,適合更復(fù)雜的文本解析 |
| Tesseract OCR | 掃描版 PDF | 需要 OCR 識(shí)別,適用于無(wú)文本層的 PDF |
推薦選擇:
- 普通文本 PDF:使用 PDFBox 或 iText。
- 復(fù)雜格式 PDF:推薦 iText。
- 掃描版 PDF:使用 Tesseract OCR 進(jìn)行識(shí)別。
到此這篇關(guān)于使用Java提取PDF中的文字的三種常見(jiàn)方法的文章就介紹到這了,更多相關(guān)Java提取PDF文字內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java報(bào)錯(cuò):FileNotFoundException的解決方案
在Java編程中,FileNotFoundException 是一種常見(jiàn)的受檢異常,通常發(fā)生在試圖打開(kāi)一個(gè)不存在的文件或文件路徑錯(cuò)誤時(shí),本文將詳細(xì)探討FileNotFoundException的成因、解決方案以及預(yù)防措施,幫助開(kāi)發(fā)者理解和避免此類(lèi)問(wèn)題,需要的朋友可以參考下2024-06-06
Java?lambda表達(dá)式與泛型整理總結(jié)
Lambda?表達(dá)式(lambda?expression)是一個(gè)匿名函數(shù),Lambda表達(dá)式基于數(shù)學(xué)中的λ演算得名。泛型編程,故如其名,是一個(gè)泛化的編程方式。其實(shí)現(xiàn)原理為程序員編寫(xiě)一個(gè)函數(shù)/類(lèi)的代碼示例,讓編譯器去填補(bǔ)出不同的函數(shù)實(shí)現(xiàn)2022-07-07
Spring Boot集成教程之異步調(diào)用Async
在項(xiàng)目中,當(dāng)訪(fǎng)問(wèn)其他人的接口較慢或者做耗時(shí)任務(wù)時(shí),不想程序一直卡在耗時(shí)任務(wù)上,想程序能夠并行執(zhí)行,我們可以使用多線(xiàn)程來(lái)并行的處理任務(wù),也可以使用spring提供的異步處理方式@Async。需要的朋友們下面來(lái)一起看看吧。2018-03-03
Java中設(shè)置JAVA_HOME無(wú)效的解決方法
最近遇到一個(gè)問(wèn)題,就是配置JAVA_HOME無(wú)效,不管怎么改,運(yùn)行Java -version始終是最初的那個(gè)java版本,所以這篇文章主要給大家介紹了關(guān)于Java中設(shè)置JAVA_HOME無(wú)效的解決方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-09-09
Java設(shè)計(jì)模式編程中簡(jiǎn)單工廠(chǎng)與抽象工廠(chǎng)模式的使用實(shí)例
這篇文章主要介紹了Java設(shè)計(jì)模式編程中簡(jiǎn)單工廠(chǎng)與抽象工廠(chǎng)模式的使用實(shí)例,簡(jiǎn)單工廠(chǎng)與抽象工廠(chǎng)都可以歸類(lèi)于設(shè)計(jì)模式中的創(chuàng)建型模式,需要的朋友可以參考下2016-04-04
MyBatis?核心組件Configuration實(shí)例詳解
Configuration用于描述 MyBatis 的主配置信息,其他組件需要獲取配置信息時(shí),直接通過(guò) Configuration 對(duì)象獲取,這篇文章主要介紹了MyBatis核心組件Configuration,需要的朋友可以參考下2023-08-08
解決使用@RequestParam注解和泛型遇到的問(wèn)題
這篇文章主要介紹了解決使用@RequestParam注解和泛型遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
通過(guò)FeignClient調(diào)用微服務(wù)提供的分頁(yè)對(duì)象IPage報(bào)錯(cuò)的解決
這篇文章主要介紹了通過(guò)FeignClient調(diào)用微服務(wù)提供的分頁(yè)對(duì)象IPage報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
手?jǐn)]一個(gè) spring-boot-starter的全過(guò)程
這篇文章主要介紹了手?jǐn)]一個(gè) spring-boot-starter的全過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01

