找回密码
 立即注册
首页 业界区 业界 国产化PDF处理控件Spire.PDF教程:在Java中读取PDF,提 ...

国产化PDF处理控件Spire.PDF教程:在Java中读取PDF,提取文本、图片和表格

柏球侠 4 天前
1.png

在数据驱动的现代开发中,高效处理 PDF 文档已成为 Java 开发者不可或缺的核心能力。无论是处理各类发票扫描件、业务分析报告,还是包含丰富图表的技术文档,掌握 Java 版的 PDF 解析技术都将大幅提升数据处理效率,充分释放文档中的商业价值。
E-iceblue旗下Spire系列产品,是文档处理组件领域的佼佼者,支持国产化信创。本指南将介绍如何使用 Spire.PDF for Java 读取 PDF 文档 ,涵盖从可搜索的 PDF 提取文本 、表格和 图片 ,以及通过 OCR 技术从扫描版 PDF 中读取文本。
Spire.PDF for Java免费试用下载,请联系e-iceblue官方授权合作经销商慧都科技 
加入Spire技术交流QQ群(125237868),与更多开发者一起提升文档开发技能。
用于读取 PDF 内容的 Java 库

选择适合的库是成功读取 PDF 的关键。Spire.PDF 以其稳定性和丰富功能脱颖而出,支持文本提取、图片获取、表格解析及 OCR 集成,其直观 API 和完善的教程对新手和专家同样友好。
开始前请从官网下载 Spire.PDF for Java 并添加至项目依赖。Maven 用户请在 pom.xml 中添加:
  1. <repositories>
  2.     <repository>
  3.         <id>com.e-iceblue</id>
  4.         <name>e-iceblue</name>
  5.         <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
  6.     </repository>
  7. </repositories>
  8. <dependencies>
  9.     <dependency>
  10.         <groupId>e-iceblue</groupId>
  11.         spire.pdf</artifactId>
  12.         <version>11.6.2</version>
  13.     </dependency>
  14. </dependencies>
复制代码
下文将演示如何运用 Spire.PDF 完成各类 PDF 读取任务。
Java 从可搜索 PDF 读取文本

可搜索 PDF 以机器可读的格式存储文本,便于高效提取内容。Spire.PDF 中的 PdfTextExtractor 类可直接获取可搜索PDF的页面文本,而 PdfTextExtractOptions 能灵活设置提取参数,包括文本布局处理策略和指定提取区域。
以下示例展示如何使用 Java 提取 PDF 所有页面的文本并输出到TXT文件:
  1. import com.spire.pdf.PdfDocument;
  2. import com.spire.pdf.PdfPageBase;
  3. import com.spire.pdf.texts.PdfTextExtractOptions;
  4. import com.spire.pdf.texts.PdfTextExtractor;
  5. import com.spire.pdf.texts.PdfTextStrategy;
  6. import java.io.IOException;
  7. import java.nio.file.Files;
  8. import java.nio.file.Path;
  9. import java.nio.file.Paths;
  10. public class ExtractTextFromSearchablePdf {
  11.     public static void main(String[] args) throws IOException {
  12.         // 创建一个 PdfDocument 对象
  13.         PdfDocument doc = new PdfDocument();
  14.         // 加载 PDF 文件
  15.         doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");
  16.         // 遍历所有页面
  17.         for (int i = 0; i < doc.getPages().getCount(); i++) {
  18.             // 获取当前页面
  19.             PdfPageBase page = doc.getPages().get(i);
  20.             // 创建一个 PdfTextExtractor 对象
  21.             PdfTextExtractor textExtractor = new PdfTextExtractor(page);
  22.             // 创建一个 PdfTextExtractOptions 对象
  23.             PdfTextExtractOptions extractOptions = new PdfTextExtractOptions();
  24.             // 指定提取策略
  25.             extractOptions.setStrategy(PdfTextStrategy.None);
  26.             // 从页面中提取文本
  27.             String text = textExtractor.extract(extractOptions);
  28.             // 定义输出文件路径
  29.             Path outputPath = Paths.get("output/Extracted_Page_" + (i + 1) + ".txt");
  30.             // 写入 txt 文件
  31.             Files.write(outputPath, text.getBytes());
  32.         }
  33.         // 关闭文档
  34.         doc.close();
  35.     }
  36. }
复制代码
效果图:
2.png

Java 从 PDF 文档读取图片

对于包含图形的 PDF,PdfImageHelper 类能精准提取所有嵌入式图片。通过 PdfImageInfo 对象可将图片保存为标准图像文件,特别适用于产品图册等视觉内容重要的文档。
以下Java示例将 PDF 文档中的所有图片提取为 PNG 文件:
  1. import com.spire.pdf.PdfDocument;
  2. import com.spire.pdf.PdfPageBase;
  3. import com.spire.pdf.utilities.PdfImageHelper;
  4. import com.spire.pdf.utilities.PdfImageInfo;
  5. import javax.imageio.ImageIO;
  6. import java.awt.image.BufferedImage;
  7. import java.io.File;
  8. import java.io.IOException;
  9. public class ExtractAllImages {
  10.     public static void main(String[] args) throws IOException {
  11.         // 创建一个 PdfDocument 对象
  12.         PdfDocument doc = new PdfDocument();
  13.         // 加载 PDF 文档
  14.         doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");
  15.         // 创建一个 PdfImageHelper 对象
  16.         PdfImageHelper imageHelper = new PdfImageHelper();
  17.         // 声明一个整型变量
  18.         int m = 0;
  19.         // 遍历页面
  20.         for (int i = 0; i < doc.getPages().getCount(); i++) {
  21.             // 获取特定页面
  22.             PdfPageBase page = doc.getPages().get(i);
  23.             // 获取页面中的所有图像信息
  24.             PdfImageInfo[] imageInfos = imageHelper.getImagesInfo(page);
  25.             // 遍历图像信息
  26.             for (int j = 0; j < imageInfos.length; j++)
  27.             {
  28.                 // 获取特定图像信息
  29.                 PdfImageInfo imageInfo = imageInfos[j];
  30.                 // 获取图像
  31.                 BufferedImage image = imageInfo.getImage();
  32.                 File file = new File(String.format("output/Image-%d.png",m));
  33.                 m++;
  34.                 // 以 PNG 格式保存图像文件
  35.                 ImageIO.write(image, "PNG", file);
  36.             }
  37.         }
  38.         // 清理资源
  39.         doc.dispose();
  40.     }
  41. }
复制代码
效果图:
3.png

Java 从 PDF 文件读取表格数据

Spire.PDF 提供的 PdfTableExtractor 类能智能识别表格边界,生成的 PdfTable 对象保持原始结构,并支持使用 PdfTable.getText() 方法获取具体单元格中的文本。该功能特别适用于从财务报表等结构化文档提取数据。
以下 Java 代码将 PDF 中的每一个表格导出为单独的TXT文件:
  1. import com.spire.pdf.PdfDocument;
  2. import com.spire.pdf.utilities.PdfTable;
  3. import com.spire.pdf.utilities.PdfTableExtractor;
  4. import java.io.FileWriter;
  5. public class ExtractTableData {
  6.     public static void main(String[] args) throws Exception {
  7.         // 创建一个 PdfDocument 对象
  8.         PdfDocument doc = new PdfDocument();
  9.         // 加载 PDF 文档
  10.         doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");
  11.         // 创建一个 PdfTableExtractor 实例
  12.         PdfTableExtractor extractor = new PdfTableExtractor(doc);
  13.         // 初始化表计数器
  14.         int tableCounter = 1;
  15.         // 遍历 PDF 中的页面
  16.         for (int pageIndex = 0; pageIndex < doc.getPages().getCount(); pageIndex++) {
  17.             // 从当前页面提取表格到 PdfTable 数组
  18.             PdfTable[] tableLists = extractor.extractTable(pageIndex);
  19.             // 如果找到任何表格
  20.             if (tableLists != null && tableLists.length > 0) {
  21.                 // 遍历数组中的表格
  22.                 for (PdfTable table : tableLists) {
  23.                     // 为当前表格创建一个 StringBuilder
  24.                     StringBuilder builder = new StringBuilder();
  25.                     // 遍历当前表格中的行
  26.                     for (int i = 0; i < table.getRowCount(); i++) {
  27.                         // 遍历当前表格中的列
  28.                         for (int j = 0; j < table.getColumnCount(); j++) {
  29.                             // 从当前表格单元格中提取数据并附加到 StringBuilder
  30.                             String text = table.getText(i, j);
  31.                             builder.append(text).append(" | ");
  32.                         }
  33.                         builder.append("\r\n");
  34.                     }
  35.                     // 为每个表格写入一个单独的 .txt 文档
  36.                     FileWriter fw = new FileWriter("output/Table_" + tableCounter + ".txt");
  37.                     fw.write(builder.toString());
  38.                     fw.flush();
  39.                     fw.close();
  40.                     // 增加表计数器
  41.                     tableCounter++;
  42.                 }
  43.             }
  44.         }
  45.         // 清理资源
  46.         doc.dispose();
  47.     }
  48. }
复制代码
效果图:
4.png

通过 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 及更高版本

  • 在您的代码中配置模型。
  1. OcrScanner scanner = new OcrScanner();
  2. configureOptions.setModelPath("D:\\win-x64"); // 模型路径
复制代码
步骤 2. 将扫描的 PDF 转换为文本
此代码示例将扫描 PDF 的每一页转换为图像文件,应用 OCR 提取文本,并将结果保存到文本文件中。
  1. import com.spire.ocr.OcrException;
  2. import com.spire.ocr.OcrScanner;
  3. import com.spire.ocr.ConfigureOptions;
  4. import com.spire.pdf.PdfDocument;
  5. import com.spire.pdf.graphics.PdfImageType;
  6. import javax.imageio.ImageIO;
  7. import java.awt.image.BufferedImage;
  8. import java.io.File;
  9. import java.io.IOException;
  10. import java.nio.file.Files;
  11. import java.nio.file.Path;
  12. import java.nio.file.Paths;
  13. public class ExtractTextFromScannedPdf {
  14.     public static void main(String[] args) throws IOException, OcrException {
  15.         // 创建 OcrScanner 类的实例
  16.         OcrScanner scanner = new OcrScanner();
  17.         // 配置扫描器
  18.         ConfigureOptions configureOptions = new ConfigureOptions();
  19.         configureOptions.setModelPath("D:\\win-x64"); // 设置模型路径
  20.         configureOptions.setLanguage("Chinese"); // 设置语言
  21.         // 应用配置选项
  22.         scanner.ConfigureDependencies(configureOptions);
  23.         // 加载 PDF 文档
  24.         PdfDocument doc = new PdfDocument();
  25.         doc.loadFromFile("C:\\Users\\Administrator\\Desktop\\Input.pdf");
  26.         // 准备临时目录
  27.         String tempDirPath = "temp";
  28.         new File(tempDirPath).mkdirs(); // 创建临时目录
  29.         StringBuilder allText = new StringBuilder();
  30.         // 遍历所有页面
  31.         for (int i = 0; i < doc.getPages().getCount(); i++) {
  32.             // 将页面转换为图像
  33.             BufferedImage bufferedImage = doc.saveAsImage(i, PdfImageType.Bitmap);
  34.             String imagePath = tempDirPath + File.separator + String.format("page_%d.png", i);
  35.             ImageIO.write(bufferedImage, "PNG", new File(imagePath));
  36.             // 执行 OCR
  37.             scanner.scan(imagePath);
  38.             String pageText = scanner.getText().toString();
  39.             allText.append(String.format("\n--- PAGE %d ---\n%s\n", i + 1, pageText));
  40.             // 清理临时图像
  41.             new File(imagePath).delete();
  42.         }
  43.         // 将所有提取的文本保存到文件
  44.         Path outputTxtPath = Paths.get("output", "extracted_text.txt");
  45.         Files.write(outputTxtPath, allText.toString().getBytes());
  46.         // 关闭文档
  47.         doc.close();
  48.         System.out.println("文本已提取到 " + outputTxtPath);
  49.     }
  50. }
复制代码
效果图:
5.png

结语

在数字化转型的浪潮中,PDF 文档作为企业信息的重要载体,其高效处理能力已成为现代开发者的核心竞争力。通过本指南介绍的 Spire.PDF for Java 技术方案,开发者可以轻松应对各类 PDF 数据提取需求,从简单的文本和图片提取 到复杂的 表格数据解析 ,再到 扫描文档的智能识别 ,帮助企业更好地管理和利用文档信息。
此外,Spire.PDF for Java 提供了一套全面的工具和功能,使开发者能够构建起完整的文档自动化处理能力。无论是自动化生成报告、批量处理文档,还是提取特定数据以供分析,开发者都能通过灵活的 API 和丰富的示例代码,快速实现这些功能。这不仅提高了工作效率,也减少了人工操作的错误率,为企业带来了更高的生产力和竞争优势。
常见问题

Q1:如何使用 Java 从扫描 PDF 提取文本?

结合 Spire.PDF for Java 和 Spire.OCR for Java 即可实现:先将 PDF 页面转为图片,再进行 OCR 识别。
Q2:在Java 中读取 PDF 的最佳库是什么?

强烈推荐 Spire.PDF for Java,因为它功能多样且易于使用。它支持文本、图像、表格的提取以及 OCR 集成。
Q3:Spire.PDF 是否支持提取元数据、附件和超链接?

是的, Spire.PDF支持提取:

  • 元数据(标题/作者/关键词)
  • 附件(嵌入文件)
  • 超链接( URL 和文档链接)
该库提供 PdfDocumentInformation 类获取元数据,以及用于获取附件( PdfAttachmentCollection )和超链接( PdfUriAnnotation )的方法。
Q4:如何以编程方式将 PDF表格提取为 CSV/Excel?

使用 Spire.PDF for Java,您可以从 PDF 中提取表格数据,然后通过 Spire.XLS for Java 无缝导出到 Excel(XLSX)或 CSV 格式。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册