Java 提取 PDF 文件内容:告别手动复制粘贴,拥抱自动化解析!

在日常工作中,我们经常需要处理大量的 PDF 文档,无论是提取报告中的关键数据,还是解析合同中的重要条款,手动复制粘贴不仅效率低下,还极易出错。当面对海量的 PDF 文件时,这种传统方式更是让人望而却步。那么,有没有一种高效、精准的 Java 解决方案,能够帮助我们自动化地从 PDF 中提取所需内容呢?答案是肯定的!本文将为您深入讲解如何利用功能强大的 Spire.PDF for Java 库,轻松实现 PDF 文本、表格乃至图片的自动化提取,彻底告别繁琐的手动操作。

Spire.PDF for Java 库简介与安装

Spire.PDF for Java 是一个专业级的 Java PDF 组件,它允许开发者创建、读取、编辑、转换和打印 PDF 文档,而无需安装 Adobe Acrobat。该库拥有丰富的功能集,包括文本提取、表格识别、图片提取、内容替换、数字签名等,其 API 设计直观,易于上手,能够显著提升 PDF 处理的开发效率。

要将 Spire.PDF for Java 引入您的项目,您可以通过 Maven 配置依赖:

<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.8.3</version></dependency>
</dependencies>

或导航到 Spire.PDF 的官方网站下载安装包,手动导入 .jar 文件。

Java 提取 PDF 中的文本

文本提取是 PDF 内容解析中最常见的需求。无论是从法律文档中提取条款,还是从财务报表中抓取摘要,高效准确的文本提取至关重要。传统方法可能仅能提取纯文本,而忽略了布局和格式,导致信息丢失或难以理解。Spire.PDF for 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 中提取表格数据是一个挑战,因为 PDF 本身并没有“表格”这一概念,表格通常是由线条和文本组合模拟出来的。然而,财务报告、数据分析文档等大量关键信息都以表格形式呈现,因此高效准确地提取表格数据至关重要。Spire.PDF for Java 提供了强大的表格识别和提取能力。

以下代码演示了如何从 PDF 中识别并提取表格数据:

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();}
}

Java 提取 PDF 中的图片

PDF 文档中除了文本和表格,还可能包含重要的图片,如公司 Logo、图表、流程图或签名图片。提取这些图片对于数据分析、文档归档或内容重用都具有重要意义。Spire.PDF for Java 提供了简单易用的 API 来遍历 PDF 页面并提取其中的图片。

以下代码演示了如何从 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();}
}

注意: 如果您的 PDF 是扫描文件,那么更加推荐您尝试 Spire.OCR for Java,该库可以精准识别多种语言的扫描 PDF 文件并且将识别到的内容做到多种格式输出。

总结

本文详细介绍了如何使用 Spire.PDF for Java 库高效、准确地从 PDF 文件中提取文本、表格和图片内容。通过其直观的 API 和强大的功能,您可以轻松实现 PDF 内容的自动化解析,极大地提升工作效率,减少人工干预。无论是处理海量文档还是应对复杂的数据提取需求,Spire.PDF for Java 都提供了一个现代且可行的解决方案。

希望这篇教程能帮助您更好地利用 Java 处理 PDF 文档。现在,是时候将这些实用的技巧应用到您的项目中,告别繁琐的手动操作,拥抱自动化带来的便捷与高效了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95778.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关键字 const

Flutter 是一个使用 Dart 语言构建的 UI 工具包&#xff0c;因此它完全遵循 Dart 的语法和规则。Dart 中的 const 是语言层面的特性&#xff0c;而 Flutter 因其声明式 UI 和频繁重建的特性&#xff0c;将 const 的效能发挥到了极致。Dart 中的 const&#xff08;语言层面&…

Ubuntu22.04中使用cmake安装abseil-cpp库

Ubuntu22.04中使用cmake安装abseil-cpp库 关于Abseil库 Abseil 由 Google 的基础 C 和 Python 代码库组成&#xff0c;包括一些正支撑着如 gRPC、Protobuf 和 TensorFlow 等开源项目并一起 “成长” 的库。目前已开源 C 部分&#xff0c;Python 部分将在后续开放。 Abseil …

FreeRTOS项目(序)目录

这章是整个专栏的目录&#xff0c;负责记录这个小项目的开发日志和目录。附带总流程图。 目录 项目简介 专栏目录 开发日志 总流程图 项目简介 本项目基于STM32C8T6核心板和FreeRTOS&#xff0c;实现一些简单的功能。以下为目前已实现的功能。 &#xff08;1&#xff09…

Python 多任务编程:进程、线程与协程全面解析

目录 一、多任务基础&#xff1a;并发与并行 1. 什么是多任务 2. 两种表现形式 二、进程&#xff1a;操作系统资源分配的最小单位 1. 进程的概念 2. 多进程实现多任务 2.1 基础示例&#xff1a;边听音乐边敲代码 2.2 带参数的进程任务 2.3 进程编号与应用注意点 2.3.…

ADSL技术

<摘要> ADSL&#xff08;非对称数字用户线路&#xff09;是一种利用传统电话线实现宽带上网的技术。其核心原理是频率分割&#xff1a;将一根电话线的频带划分为语音、上行数据&#xff08;慢&#xff09;和下行数据&#xff08;快&#xff09;三个独立频道&#xff0c;从…

信号衰减中的分贝到底是怎么回事

问题&#xff1a;在一个低通滤波中&#xff0c;经常会看到一个值-3dB&#xff08;-3分贝&#xff09;&#xff0c;到底是个什么含义&#xff1f; 今天我就来粗浅的讲解这个问题。 在低通滤波器中&#xff0c;我们说的 “截止频率”&#xff08;或叫 - 3dB 点&#xff09;&…

工具分享--IP与域名提取工具2.0

基于原版的基础上新增了一个功能点:IP-A段过滤&#xff0c;可以快速把内网192、170、10或者其它你想要过滤掉的IP-A段轻松去掉&#xff0c;提高你的干活效率&#xff01;&#xff01;&#xff01; 界面样式预览&#xff1a;<!DOCTYPE html> <html lang"zh-CN&quo…

如何通过日志先行原则保障数据持久化:Redis AOF 和 MySQL redo log 的对比

在分布式系统或数据库管理系统中&#xff0c;日志先行原则&#xff08;Write-Ahead Logging&#xff0c;WAL&#xff09; 是确保数据一致性、持久性和恢复能力的重要机制。通过 WAL&#xff0c;系统能够在发生故障时恢复数据&#xff0c;保证数据的可靠性。在这篇博客中&#x…

临床研究三千问——临床研究体系的3个维度(8)

在上周的文章中&#xff0c;我们共同探讨了1345-10战策的“临床研究的起点——如何提出一个犀利的临床与科学问题”。问题固然是灵魂&#xff0c;但若没有坚实的骨架与血肉&#xff0c;灵魂便无所依归。今天&#xff0c;我们将深入“1345-10战策”中的“3”&#xff0c;即支撑起…

AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年9月7日第172弹

从今天开始&#xff0c;咱们还是暂时基于旧的模型进行预测&#xff0c;好了&#xff0c;废话不多说&#xff0c;按照老办法&#xff0c;重点8-9码定位&#xff0c;配合三胆下1或下2&#xff0c;杀1-2个和尾&#xff0c;再杀4-5个和值&#xff0c;可以做到100-300注左右。(1)定位…

万字详解网络编程之socket

一&#xff0c;socket简介1.什么是socketsocket通常也称作"套接字"&#xff0c;⽤于描述IP地址和端⼝&#xff0c;是⼀个通信链的句柄&#xff0c;应用程序通常通过"套接字"向⽹络发出请求或者应答⽹络请求。⽹络通信就是两个进程间的通信&#xff0c;这两…

维度跃迁:当万物皆成电路,智能将从“拥有”变为“存在”

我们习以为常的电子世界&#xff0c;其本质是一个由电路构成的精密宇宙。而一场从二维到三维的终极变革&#xff0c;正在悄然酝酿&#xff0c;它将彻底颠覆我们创造和交互的方式。一、电子世界的本质&#xff1a;一切都是电路 在深入未来之前&#xff0c;我们首先要理解当下。电…

大语言模型预训练数据采集与清洗技术实践:从语料到知识库的全流程优化

大语言模型(LLM)的性能上限由 “数据质量 数据规模 数据多样性” 共同决定 —— 预训练阶段的海量语料决定模型的泛化能力与语言理解基础,而知识库数据则决定模型的知识准确性与领域专业性。当前 LLM 落地面临的核心痛点之一,便是 “数据脏、处理难、知识杂”:预训练语料…

模拟音频采集设备的制作

模拟音频程序与设备的制作 需要设备 esp32s3 pcm1808 pcm5102(非必须) 程序界面 程序代码 代码链接

Java Modbus通信实战(四):Modbus通信测试与故障排查

在工业现场&#xff0c;设备通信系统就像工厂的神经网络&#xff0c;连接着各种传感器、控制器和执行器。当你搭建好这套系统后&#xff0c;最关键的一步就是全面测试&#xff0c;确保每个环节都能正常工作。 就像汽车出厂前要经过严格的路试一样&#xff0c;Modbus RTU通信系统…

少儿编程C++快速教程之——1. 基础语法和输入输出

1. 欢迎来到C编程世界&#xff01; 1.1 什么是编程&#xff1f; 编程就像是给计算机写一份详细的"说明书"&#xff0c;告诉它该做什么、怎么做。C是一种强大的编程语言&#xff0c;可以用来创建游戏、应用程序和各种有趣的软件&#xff01; 1.2 第一个C程序&#xff…

arma::imat22

arma::imat22 是 Armadillo C 线性代数库中定义的一个固定大小的 2x2 有符号整数矩阵类型。它主要用于处理小型、维度在编译时已知的整数矩阵&#xff0c;因其在栈上分配内存&#xff0c;故通常比动态矩阵有更高的效率。 下面是一个汇总了 arma::imat22 主要特性的表格&#xf…

狗都能看懂的HunYuan3D 1.0详解

HunYuan3D 1.0 HunYuan3D 1.0是2024年9月发布的一篇论文。虽然站在现在的时间节点&#xff0c;HunYuan3D系列已经出到2.5了&#xff0c;但是1.0版本的改进思路&#xff0c;和它trick集成的做法&#xff0c;还是很值得学习的。由于文章用到了很多技术&#xff0c;由于篇幅有限&a…

踏脚迈入奇幻乐园

每天早上上班的路上都会经过一个小花园。它被夹在丁字路口的拐角&#xff0c;面积不大&#xff0c;匆匆而过的行人都不会注意到它。但如果顺着几个不起眼的入口走进去&#xff0c;里面却是别有洞天。清早的街道还没有车水马龙的喧哗&#xff0c;花园里静悄悄的。各式各样的花草…

内存越界引发线程函数调用堆栈回溯异常以及INT 3软中断实战分析案例分享

目录 1、问题说明 2、导出dump文件时只是遇到了INT 3软中断&#xff0c;并没有发生异常崩溃 3、函数中发生了栈内存越界&#xff0c;导致线程的栈回溯出异常&#xff0c;堆栈中只显示一行函数调用记录 3.1、处理Json数据时产生了异常 3.2、函数中发生栈内存越界&#xff0…