在数据驱动的现代开发中,高效处理 PDF 文档已成为 Java 开发者不可或缺的核心能力。无论是处理各类发票扫描件、业务分析报告,还是包含丰富图表的技术文档,掌握 Java 版的 PDF 解析技术都将大幅提升数据处理效率,充分释放文档中的商业价值。
本指南将介绍如何使用Spire.PDF for Java 读取 PDF 文档 ,涵盖从可搜索的 PDF 提取文本 、表格和 图片 ,以及通过 OCR 技术从扫描版 PDF 中读取文本。
用于读取 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) { // 为当前表格创建一个 StringBuilder StringBuilder builder = new StringBuilder(); // 遍历当前表格中的行 for (int i = 0; i < table.getRowCount(); i++) { // 遍历当前表格中的列 for (int j = 0; j < table.getColumnCount(); j++) { // 从当前表格单元格中提取数据并附加到 StringBuilder String 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 文件作为依赖添加到您的项目中。
- 从以下链接中下载适合您操作系统的模型,并将压缩包解压到您磁盘上的某个位置。
- 在您的代码中配置模型。
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)); // 执行 OCR scanner.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 数据提取需求,从简单的文本和图片提取 到复杂的 表格数据解析 ,再到 扫描文档的智能识别 ,帮助企业更好地管理和利用文档信息。