java读取pdf纯文本段落需用pdfbox等解析库而非直接读二进制流;pdfbox支持中文、可提取带换行文本,但段落识别需基于坐标自定义后处理,其他方案如tika、itext各有适用场景与限制。

Java 读取 PDF 的纯文本段落内容,核心是使用支持文本提取的 PDF 解析库,而非直接读取二进制流——PDF 是结构化文档,不是纯文本文件,直接用 FileReader 或 InputStream 只能得到乱码或不可读字节。
推荐用 Apache PDFBox 提取段落文本
PDFBox 是 Apache 官方维护、免费开源、对中文支持较好(需注意字体嵌入)、适合服务端批量处理的主流库。它能还原基本的阅读顺序和换行逻辑,接近“段落”语义。
- 添加 Maven 依赖(以 PDFBox 2.0.29+ 为例):
- 基础文本提取(保留换行,但不自动合并视觉上连续的段落):
PDDocument doc = PDDocument.load(new File("example.pdf"));
PDFTextStripper stripper = new PDFTextStripper();
// 设置按页面顺序提取,保留换行符
stripper.setSortByPosition(true);
String text = stripper.getText(doc);
doc.close();
⚠️ 注意:默认提取的是“线性文本流”,PDF 中的段落可能被拆成多行甚至跨页。若需更准确的段落划分,需后处理。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
按视觉块/段落切分(需自定义逻辑)
PDFBox 本身不提供“段落识别”功能(如区分标题、正文、空行分隔),需结合坐标信息做二次分析:
- 使用
PDFTextStripper的子类,重写processTextPosition()获取每个字符的TextPosition(含 x/y 坐标、字号、字体) - 按 y 坐标聚类:y 差值小于阈值(如 5px)视为同一行;连续行间 y 差值较大(如 > 行高 × 1.5)可视为段落分隔
- 合并同一“行块”内的文本,去除首尾空白,跳过纯空行
示例关键思路(简化):
class ParagraphStripper extends PDFTextStripper {private List
private float lastY = -1;
private StringBuilder currentLine = new StringBuilder();
@Override
protected void processTextPosition(TextPosition text) {
float y = text.getYDirAdj();
if (Math.abs(y - lastY) > 8 && currentLine.length() > 0) {
lines.add(currentLine.toString().trim());
currentLine = new StringBuilder();
}
currentLine.append(text.getUnicode());
lastY = y;
}
}
其他选项与注意事项
- Apache Tika:封装了 PDFBox、Tesseract 等,适合通用文档解析,但段落控制粒度较粗,调试困难
-
iText 7(with pdfOCR 或 layout module):商业友好(AGPL 限制需注意),
pdfLayout模块支持更精细的区块检测,适合复杂排版 - OCR 场景:扫描版 PDF 需先用 Tesseract 或 Adobe OCR,PDFBox 无法识别图片中的文字
-
中文字体问题:若 PDF 未嵌入中文字体或使用非标准编码,提取结果会出现方块或乱码,需检查
PDFont加载状态或预处理 PDF
不复杂但容易忽略:纯文本提取永远受原始 PDF 质量制约——无文字层的扫描件、加密 PDF、加水印干扰、复杂表格嵌套,都会导致段落识别失败。建议先用 Acrobat 或在线工具验证 PDF 是否可选中文本。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










