在数据驱动的现代开发中,高效处理 PDF 文档已成为 Java 开发者不可或缺的核心能力。无论是处理各类发票扫描件、业务分析报告,还是包含丰富图表的技术文档,掌握 Java 版的 PDF 解析技术都将大幅提升数据处理效率,充分释放文档中的商业价值。
本指南将介绍如何使用Spire.PDF for Java 读取 PDF 文档 ,涵盖从可搜索的 PDF 提取文本 、表格和 图片 ,以及通过 OCR 技术从扫描版 PDF 中读取文本。
Spire.PDF for Java试用下载
用于读取 PDF 内容的 Java 库
选择适合的库是成功读取 PDF 的关键。Spire.PDF 以其稳定性和丰富功能脱颖而出,支持文本提取、图片获取、表格解析及 OCR 集成,其直观 API 和完善的教程对新手和专家同样友好。
开始前请从官网下载 Spire.PDF for Java 并添加至项目依赖。Maven 用户请在 pom.xml 中添加:
<repositories><repository><id>com.e-iceblue</id><name>e-iceblue</name><url>https://repo.e-iceblue.cn/repository/maven-public/</url></repository> </repositories> <dependencies><dependency><groupId>e-iceblue</groupId><artifactId>spire.pdf</artifactId><version>11.6.2</version></dependency> </dependencies>
下文将演示如何运用 Spire.PDF 完成各类 PDF 读取任务。
Java 从可搜索 PDF 读取文本
可搜索 PDF 以机器可读的格式存储文本,便于高效提取内容。Spire.PDF 中的 PdfTextExtractor 类可直接获取可搜索PDF的页面文本,而 PdfTextExtractOptions 能灵活设置提取参数,包括文本布局处理策略和指定提取区域。
以下示例展示如何使用 Java 提取 PDF 所有页面的文本并输出到TXT文件:
import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.texts.PdfTextExtractOptions; import com.spire.pdf.texts.PdfTextExtractor; import com.spire.pdf.texts.PdfTextStrategy;import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths;public class ExtractTextFromSearchablePdf {public static void main(String[] args) throws IOException {// 创建一个 PdfDocument 对象PdfDocument doc = new PdfDocument();// 加载 PDF 文件doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");// 遍历所有页面for (int i = 0; i < doc.getPages().getCount(); i++) {// 获取当前页面PdfPageBase page = doc.getPages().get(i);// 创建一个 PdfTextExtractor 对象PdfTextExtractor textExtractor = new PdfTextExtractor(page);// 创建一个 PdfTextExtractOptions 对象PdfTextExtractOptions extractOptions = new PdfTextExtractOptions();// 指定提取策略extractOptions.setStrategy(PdfTextStrategy.None);// 从页面中提取文本String text = textExtractor.extract(extractOptions);// 定义输出文件路径Path outputPath = Paths.get("output/Extracted_Page_" + (i + 1) + ".txt");// 写入 txt 文件Files.write(outputPath, text.getBytes());}// 关闭文档doc.close();} }
效果图:
Java 从 PDF 文档读取图片
对于包含图形的 PDF,PdfImageHelper 类能精准提取所有嵌入式图片。通过 PdfImageInfo 对象可将图片保存为标准图像文件,特别适用于产品图册等视觉内容重要的文档。
以下Java示例将 PDF 文档中的所有图片提取为 PNG 文件:
import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.utilities.PdfImageHelper; import com.spire.pdf.utilities.PdfImageInfo;import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException;public class ExtractAllImages {public static void main(String[] args) throws IOException {// 创建一个 PdfDocument 对象PdfDocument doc = new PdfDocument();// 加载 PDF 文档doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");// 创建一个 PdfImageHelper 对象PdfImageHelper imageHelper = new PdfImageHelper();// 声明一个整型变量int m = 0;// 遍历页面for (int i = 0; i < doc.getPages().getCount(); i++) {// 获取特定页面PdfPageBase page = doc.getPages().get(i);// 获取页面中的所有图像信息PdfImageInfo[] imageInfos = imageHelper.getImagesInfo(page);// 遍历图像信息for (int j = 0; j < imageInfos.length; j++){// 获取特定图像信息PdfImageInfo imageInfo = imageInfos[j];// 获取图像BufferedImage image = imageInfo.getImage();File file = new File(String.format("output/Image-%d.png",m));m++;// 以 PNG 格式保存图像文件ImageIO.write(image, "PNG", file);}}// 清理资源doc.dispose();} }
效果图:
Java 从 PDF 文件读取表格数据
Spire.PDF 提供的 PdfTableExtractor 类能智能识别表格边界,生成的 PdfTable 对象保持原始结构,并支持使用 PdfTable.getText() 方法获取具体单元格中的文本。该功能特别适用于从财务报表等结构化文档提取数据。
以下 Java 代码将 PDF 中的每一个表格导出为单独的TXT文件:
import com.spire.pdf.PdfDocument; import com.spire.pdf.utilities.PdfTable; import com.spire.pdf.utilities.PdfTableExtractor;import java.io.FileWriter;public class ExtractTableData {public static void main(String[] args) throws Exception {// 创建一个 PdfDocument 对象PdfDocument doc = new PdfDocument();// 加载 PDF 文档doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");// 创建一个 PdfTableExtractor 实例PdfTableExtractor extractor = new PdfTableExtractor(doc);// 初始化表计数器int tableCounter = 1;// 遍历 PDF 中的页面for (int pageIndex = 0; pageIndex < doc.getPages().getCount(); pageIndex++) {// 从当前页面提取表格到 PdfTable 数组PdfTable[] tableLists = extractor.extractTable(pageIndex);// 如果找到任何表格if (tableLists != null && tableLists.length > 0) {// 遍历数组中的表格for (PdfTable table : tableLists) {// 为当前表格创建一个 StringBuilderStringBuilder builder = new StringBuilder();// 遍历当前表格中的行for (int i = 0; i < table.getRowCount(); i++) {// 遍历当前表格中的列for (int j = 0; j < table.getColumnCount(); j++) {// 从当前表格单元格中提取数据并附加到 StringBuilderString text = table.getText(i, j);builder.append(text).append(" | ");}builder.append("\r\n");}// 为每个表格写入一个单独的 .txt 文档FileWriter fw = new FileWriter("output/Table_" + tableCounter + ".txt");fw.write(builder.toString());fw.flush();fw.close();// 增加表计数器tableCounter++;}}}// 清理资源doc.dispose();} }
效果图:
通过 OCR 将扫描版 PDF 转为文本
从扫描版的 PDF 提取文本需要依赖 OCR 引擎,如Spire.OCR for Java。本解决方案首先使用 Spire.PDF 的渲染引擎将页面转换为图片,然后通过 Spire.OCR 的 OcrScanner 类从图片识别文字。通过这两步法,可以有效地将实体文档扫描转换为可编辑文本,且支持多种语言。
步骤 1. 安装Spire.OCR 并配置环境
- 下载 Spire.OCR for Java,并将 Jar 文件作为依赖添加到您的项目中。
- 从以下链接中下载适合您操作系统的模型,并将压缩包解压到您磁盘上的某个位置。
- Windows x64
- Linux x64
- macOS 10.15 及更高版本
- 在您的代码中配置模型。
OcrScanner scanner = new OcrScanner(); configureOptions.setModelPath("D:\\win-x64"); // 模型路径
步骤 2. 将扫描的 PDF 转换为文本
此代码示例将扫描 PDF 的每一页转换为图像文件,应用 OCR 提取文本,并将结果保存到文本文件中。
import com.spire.ocr.OcrException; import com.spire.ocr.OcrScanner; import com.spire.ocr.ConfigureOptions; import com.spire.pdf.PdfDocument; import com.spire.pdf.graphics.PdfImageType;import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths;public class ExtractTextFromScannedPdf {public static void main(String[] args) throws IOException, OcrException {// 创建 OcrScanner 类的实例OcrScanner scanner = new OcrScanner();// 配置扫描器ConfigureOptions configureOptions = new ConfigureOptions();configureOptions.setModelPath("D:\\win-x64"); // 设置模型路径configureOptions.setLanguage("Chinese"); // 设置语言// 应用配置选项scanner.ConfigureDependencies(configureOptions);// 加载 PDF 文档PdfDocument doc = new PdfDocument();doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");// 准备临时目录String tempDirPath = "temp";new File(tempDirPath).mkdirs(); // 创建临时目录StringBuilder allText = new StringBuilder();// 遍历所有页面for (int i = 0; i < doc.getPages().getCount(); i++) {// 将页面转换为图像BufferedImage bufferedImage = doc.saveAsImage(i, PdfImageType.Bitmap);String imagePath = tempDirPath + File.separator + String.format("page_%d.png", i);ImageIO.write(bufferedImage, "PNG", new File(imagePath));// 执行 OCRscanner.scan(imagePath);String pageText = scanner.getText().toString();allText.append(String.format("\n--- PAGE %d ---\n%s\n", i + 1, pageText));// 清理临时图像new File(imagePath).delete();}// 将所有提取的文本保存到文件Path outputTxtPath = Paths.get("output", "extracted_text.txt");Files.write(outputTxtPath, allText.toString().getBytes());// 关闭文档doc.close();System.out.println("文本已提取到 " + outputTxtPath);} }
效果图:
结语
在数字化转型的浪潮中,PDF 文档作为企业信息的重要载体,其高效处理能力已成为现代开发者的核心竞争力。通过本指南介绍的 Spire.PDF for Java 技术方案,开发者可以轻松应对各类 PDF 数据提取需求,从简单的文本和图片提取 到复杂的 表格数据解析 ,再到 扫描文档的智能识别 ,帮助企业更好地管理和利用文档信息。