使用 Java 提取 PDF 中的文字
在日常开发中,我们经常需要从 PDF 文件中提取文本,比如用于文档分析、搜索功能、数据挖掘等。本篇文章将介绍三种常见的方法:
- Apache PDFBox(适用于大部分 PDF)
- iText(支持复杂格式 PDF)
- Tesseract OCR(适用于扫描版 PDF)
1. 使用 Apache PDFBox 提取 PDF 文本
1.1 添加 Maven 依赖
xml
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.27</version>
</dependency>
1.2 代码示例
java
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" + text);
} catch (IOException e) {
e.printStackTrace();
}
}
}
1.3 说明
PDDocument.load(File)
:加载 PDF 文件。PDFTextStripper.getText(document)
:提取文本。- 适用于大部分 PDF,但如果 PDF 采用了图片格式(扫描版),无法提取。
2. 使用 iText 提取 PDF 文本
2.1 添加 Maven 依赖
xml
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.1.17</version>
</dependency>
2.2 代码示例
java
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" + extractedText);
} catch (IOException e) {
e.printStackTrace();
}
}
}
2.3 说明
PdfReader(pdfPath)
:加载 PDF 文件。PdfTextExtractor.getTextFromPage(pdfDoc.getPage(i))
:逐页提取文本。- 适用于大部分 PDF,支持更复杂的文本解析。
3. 使用 Tesseract OCR 处理扫描版 PDF
如果 PDF 是扫描版(仅包含图片),需要 OCR 识别文本。
3.1 添加 Maven 依赖
xml
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.5</version>
</dependency>
3.2 代码示例
java
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"); // 设置 Tesseract 训练数据路径
tesseract.setLanguage("eng"); // 设置语言
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" + extractedText);
}
}
3.3 说明
PDFRenderer.renderImage(i)
:将 PDF 页转换为图片。tesseract.doOCR(image)
:执行 OCR 识别文本。- 适用于无可选文本的扫描版 PDF。
4. 总结
方法 | 适用场景 | 主要特点 |
---|---|---|
Apache PDFBox | 普通 PDF | 轻量、易用,适用于大部分 PDF |
iText | 复杂格式 PDF | 功能强大,适合更复杂的文本解析 |
Tesseract OCR | 扫描版 PDF | 需要 OCR 识别,适用于无文本层的 PDF |
推荐选择:
- 普通文本 PDF :使用 PDFBox 或 iText。
- 复杂格式 PDF :推荐 iText。
- 扫描版 PDF :使用 Tesseract OCR 进行识别。
通过上述方法,你可以根据不同的 PDF 类型选择合适的方式来提取文本。如果有任何问题或改进建议,欢迎留言交流!🚀