Java中使用Apache PDFBox实现PDF文本搜索与文件操作教程

Java中使用Apache PDFBox实现PDF文本搜索与文件操作教程

本教程详细介绍了如何在java中利用apache pdfbox库处理pdf文件。针对直接使用`filereader`读取pdf导致的乱码问题,文章提供了正确的pdf文本提取方法,并在此基础上演示了如何高效地在pdf内容中搜索特定关键词,以及根据搜索结果对pdf文件执行复制或移动操作。内容涵盖库的引入、核心api使用及注意事项,旨在帮助开发者构建健壮的pdf处理应用。

引言:PDF文件处理的挑战

PDF(Portable Document Format)文件是一种复杂的文件格式,它以二进制形式存储文本、图像、字体等多种元素,并非简单的纯文本文件。因此,尝试使用Java标准库中的FileReader或BufferedReader等流式读取器直接处理PDF文件,通常会导致乱码、文件损坏或无法正确识别其内容。这些工具设计用于处理字符流,而PDF文件需要专门的解析器来解释其内部结构。

为了在Java中有效处理PDF文件,例如提取文本、搜索内容或修改文档,我们需要依赖专业的第三方库。Apache PDFBox是其中一个功能强大且广泛使用的开源库,它提供了丰富的API来操作PDF文档。

集成Apache PDFBox

要在您的Java项目中使用Apache PDFBox,您需要将其作为依赖项添加到项目的构建配置中。

Maven项目:在pom.xml文件中添加以下依赖:

    org.apache.pdfbox    pdfbox    2.0.29 

Gradle项目:在build.gradle文件中添加以下依赖:

implementation 'org.apache.pdfbox:pdfbox:2.0.29' // 请使用最新稳定版本

核心:提取PDF文本内容

使用PDFBox提取PDF文本是实现文本搜索的第一步。其基本流程包括加载PDF文档、创建PDFTextStripper实例,然后调用其getText()方法。

立即学习“Java免费学习笔记(深入)”;

以下是一个简单的示例,演示如何从PDF文件中提取所有文本并打印到控制台:

Reclaim.ai Reclaim.ai

为优先事项创建完美的时间表

Reclaim.ai 90 查看详情 Reclaim.ai

import java.io.File;import java.io.IOException;import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.text.PDFTextStripper;public class PdfTextExtractor {    public static String extractTextFromPdf(String pdfFilePath) throws IOException {        File file = new File(pdfFilePath);        PDDocument document = null;        String text = "";        try {            // 1. 加载现有的PDF文档            document = PDDocument.load(file);            // 2. 实例化PDFTextStripper类            PDFTextStripper pdfStripper = new PDFTextStripper();            // 3. 从PDF文档中检索文本            text = pdfStripper.getText(document);            System.out.println("PDF文件内容已提取:" + text.substring(0, Math.min(text.length(), 500)) + "..."); // 打印部分内容        } finally {            // 4. 关闭文档以释放资源            if (document != null) {                document.close();            }        }        return text;    }    public static void main(String[] args) {        String pdfPath = "D://Sample.pdf"; // 替换为您的PDF文件路径        try {            String extractedText = extractTextFromPdf(pdfPath);            // System.out.println(extractedText); // 如果需要,可以打印全部文本        } catch (IOException e) {            System.err.println("提取PDF文本时发生错误: " + e.getMessage());            e.printStackTrace();        }    }}

在上述代码中:

PDDocument.load(file):用于加载一个PDF文件到内存中,返回一个PDDocument对象,代表整个PDF文档。PDFTextStripper:是PDFBox提供的一个工具类,专门用于从PDDocument中提取可读的文本。pdfStripper.getText(document):执行文本提取操作,返回一个包含PDF所有文本内容的字符串。document.close():至关重要!在完成PDF文档处理后,务必调用此方法关闭文档并释放系统资源,防止内存泄漏或文件句柄占用。

实现PDF文本搜索与文件操作

在成功提取PDF文本后,我们可以像处理任何普通字符串一样对其进行搜索。结合文件系统操作,可以实现根据搜索结果对PDF文件进行移动或复制。

下面的示例演示了一个完整的流程:用户输入关键词,程序搜索指定PDF文件,如果找到关键词,则将该PDF文件移动到预设的目标目录。

import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.text.PDFTextStripper;import java.io.File;import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.StandardCopyOption;import java.util.Scanner;public class PdfSearchAndMove {    /**     * 搜索PDF文件中的关键词,如果找到则将文件移动到指定目录。     *     * @param pdfFilePath     待处理的PDF文件路径     * @param targetDirectory 目标目录路径     * @param searchWord      待搜索的关键词     * @return 如果找到关键词并成功移动文件,则返回true;否则返回false。     * @throws IOException 文件读写或PDF处理异常     */    public static boolean searchAndMovePdf(String pdfFilePath, String targetDirectory, String searchWord) throws IOException {        File pdfFile = new File(pdfFilePath);        if (!pdfFile.exists() || !pdfFile.isFile()) {            System.err.println("错误:PDF文件不存在或不是有效文件:" + pdfFilePath);            return false;        }        PDDocument document = null;        try {            // 1. 加载PDF文档            document = PDDocument.load(pdfFile);            // 2. 实例化PDFTextStripper以提取文本            PDFTextStripper pdfStripper = new PDFTextStripper();            String text = pdfStripper.getText(document);            // 3. 搜索关键词 (不区分大小写)            if (text.toLowerCase().contains(searchWord.toLowerCase())) {                System.out.println("在文件 '" + pdfFile.getName() + "' 中找到了关键词 '" + searchWord + "'。");                // 4. 定义目标路径                Path sourcePath = pdfFile.toPath();                Path destinationDir = Paths.get(targetDirectory);                Files.createDirectories(destinationDir); // 确保目标目录存在                Path destinationPath = destinationDir.resolve(pdfFile.getName()); // 目标文件保持原名                // 5. 移动文件                // StandardCopyOption.REPLACE_EXISTING 表示如果目标文件已存在则替换                Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING);                System.out.println("文件已成功移动到:" + destinationPath);                return true;            } else {                System.out.println("在文件 '" + pdfFile.getName() + "' 中未找到关键词 '" + searchWord + "'。");                return false;            }        } finally {            // 确保PDF文档被关闭,释放资源            if (document != null) {                document.close();            }        }    }    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        System.out.println("请输入您要搜索的关键词 (输入'Exit'退出):");        // 示例文件路径和目标目录,请根据实际情况修改        String pdfFilePath = "C:\Users\user012\Desktop\Evalution.pdf";        String targetDir = "C:\Users\user012\Desktop\Search";        while (scanner.hasNextLine()) {            String searchWord = scanner.nextLine().trim(); // 读取并去除首尾空格            if ("Exit".equalsIgnoreCase(searchWord)) {                break;            }            if (searchWord.isEmpty()) {                System.out.println("关键词不能为空,请重新输入或输入'Exit'退出:");                continue;            }            try {                searchAndMovePdf(pdfFilePath, targetDir, searchWord);            } catch (IOException e) {                System.err.println("处理PDF文件时发生错误:" + e.getMessage());                // 在生产环境中,建议使用日志框架记录详细错误信息            }            System.out.println("请输入下一个关键词 (输入'Exit'退出):");        }        scanner.close();        System.out.println("程序结束。");    }}

在searchAndMovePdf方法中:

我们首先检查PDF文件是否存在。PDDocument.load(pdfFile)和pdfStripper.getText(document)用于提取文本。text.toLowerCase().contains(searchWord.toLowerCase()) 执行不区分大小写的关键词搜索。Files.createDirectories(destinationDir) 确保目标目录存在,如果不存在则创建。Files.move(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING) 用于移动文件。StandardCopyOption.REPLACE_EXISTING 选项表示如果目标位置已存在同名文件,则替换它。如果仅需复制而不删除源文件,可以使用Files.copy()。finally 块确保 document.close() 即使在发生异常时也能被调用,这是良好的资源管理实践。

注意事项

资源管理: 始终确保在处理完PDDocument对象后调用document.close()。这会释放文件句柄和内存,避免资源泄漏。异常处理: PDF文件处理过程中可能会发生IOException,例如文件不存在、权限不足或PDF文件损坏。务必捕获并妥善处理这些异常。PDF文件类型:扫描件PDF: 如果PDF文件是由扫描图像生成的,其中不包含可选择的文本层,PDFTextStripper将无法提取任何文本。对于这类文件,需要结合OCR(光学字符识别)技术才能提取文本。加密PDF: 如果PDF文件受到密码保护,您需要提供密码才能加载和处理它。PDDocument.load(file, password)方法可以用于加载加密文档。复杂布局/表单: 对于包含复杂布局、多列、表格或交互式表单的PDF,PDFTextStripper提取的文本顺序可能不完全符合视觉阅读顺序,这需要更高级的文本提取策略。性能: 对于非常大的PDF文件,文本提取过程可能会消耗较多的时间和内存。在处理大规模PDF时,需要考虑性能优化和分批处理。文件操作原子性: Files.move() 通常是一个原子操作,它比先复制再删除源文件更安全和高效。编码问题: PDFBox通常能很好地处理各种字符编码,但在极少数情况下,如果PDF内部字体编码有问题,可能会导致某些特殊字符显示不正确。

总结

通过Apache PDFBox库,Java开发者可以轻松而专业地处理PDF文件,克服了直接读取二进制文件带来的挑战。本教程详细介绍了从引入依赖、核心文本提取到根据搜索结果执行文件移动的完整流程。掌握这些基本操作,您将能够构建出更加强大和健壮的PDF处理应用程序。在实际开发中,请务必注意资源管理、异常处理以及PDF文件的多样性,以确保程序的稳定性和可靠性。

以上就是Java中使用Apache PDFBox实现PDF文本搜索与文件操作教程的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1082106.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
outlook邮箱入口官网在线 outlook邮箱官方在线直达2025
上一篇 2025年12月2日 07:51:10
css grid和flexbox结合使用的技巧
下一篇 2025年12月2日 07:51:14

相关推荐

  • 非Vue项目中,如何使用vue-quill-editor实现纯文本粘贴?

    非Vue项目中巧妙运用vue-quill-editor实现纯文本粘贴 在非Vue项目中使用vue-quill-editor时,如何将粘贴的富文本转换为纯文本并保持光标位置正确,是许多开发者面临的挑战。本文将详细讲解如何在普通JavaScript项目中,结合quill.js、vue-quill-edi…

    2026年8月30日
    100
  • win10怎么进入安全模式_win10进入安全模式多种方法

    通过系统设置、Shift+重启、msconfig、强制中断启动或安装介质五种方法可进入Windows 10安全模式,适用于不同故障场景,便于排查软件冲突、驱动问题或病毒影响。 如果您尝试在Windows 10系统中排查软件冲突、驱动问题或病毒影响,进入安全模式是一种有效的诊断手段。安全模式会以最小化…

    2026年8月30日
    200
  • 苹果三星下一代旗舰设计路线分化:iPhone变厚 S26变薄

    据最新爆料,将在2026年发布的两款旗舰手机——iphone 17 pro max和三星s26 ultra在设计理念上或将出现差异。消息称,苹果或将采用更厚的机身设计,而三星则可能进一步缩小体积,实现更加轻薄的外观。 当前在售的iPhone 16 Pro Max与S25 Ultra在尺寸和重量方面十…

    2026年8月30日
    000
  • Listen1如何分享歌曲_Listen1分享歌曲的多种方式介绍

    可通过应用内分享、复制链接、生成二维码或绑定第三方平台实现分享。首先在播放页点击分享按钮,选择社交软件发送;其次复制歌曲链接并粘贴至目标窗口,附带信息便于识别;再者生成二维码供他人扫码获取;最后通过绑定网易云、QQ音乐等账号同步歌单,间接完成分享。 如果您想将喜欢的音乐通过Listen1分享给朋友或…

    2026年8月30日
    000
  • 如何解决PrestaShop统计数据不足的问题?使用PrestaShop/statsdata模块可以!

    可以通过以下地址学习composer:学习地址 在运营一个电子商务网站时,详细的统计数据是至关重要的。然而,我在使用 prestashop 时发现,默认的统计功能无法满足我的需求,很多关键数据无法被收集和分析,这让我在业务决策时感到束手无策。经过一番探索,我找到了 prestashop/statsd…

    用户投稿 2026年8月30日
    000
  • 如何解读JMAP导出的堆内存快照文件及IDEA自带分析工具的局限性?

    Java堆内存分析与JMAP快照解读 精准分析Java应用的堆内存,是解决内存泄漏和性能瓶颈的关键。jmap命令生成的堆内存快照文件(.hprof),配合合适的分析工具,能有效帮助我们定位问题。本文将深入探讨如何解读jmap导出文件,并分析IDEA自带工具的局限性。 上图展示了jmap生成的堆内存快…

    2026年8月30日
    200
  • win10桌面图标“我的电脑”怎么调出来_win10桌面显示“我的电脑”图标设置方法

    首先通过桌面图标设置恢复“我的电脑”:右键桌面→个性化→主题→桌面图标设置→勾选计算机→确定;其次可用控制面板:Win+R输入control→个性化→更改桌面图标→勾选计算机→确定;高级用户可通过注册表编辑器修改HKEY_CURRENT_USER路径下{20D04FE0-3AEA-1069-A2D8…

    2026年8月30日
    200
  • 专家调查结果显示:韩国半导体技术已经落后于中国

    韩国半导体技术落后于中国?最新调查结果引关注! ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 据韩联社2月23日报道,韩国科学技术企划评价院近期对39位专家进行的调查显示,韩国在部分关键半导体技术领域已落后于中国。 调查结果显示,中国在高集…

    2026年8月30日
    300
  • Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录

    Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录Sublime结合Python批量写入MySQL数据_适合接口爬虫日志自动化记录

    用sublime text搭配python脚本能高效批量写入mysql数据,实现接口爬虫日志的自动化记录。1.使用sublime text轻便快捷,配合pymysql等库快速编写脚本,并支持直接运行;2.采用executemany()方法批量插入数据,显著提升效率,避免单条insert性能差的问题;…

    2026年8月30日 用户投稿
    300
  • win10屏幕亮度调不了怎么办_win10屏幕亮度无法调节修复方法

    首先检查并更新显卡驱动,再启用PnP显示器,接着调整电源计划设置,运行系统疑难解答,最后通过修改注册表恢复亮度滑块功能。 如果您在使用Windows 10系统时发现屏幕亮度无法调节,可能是由于驱动程序异常、系统设置错误或电源管理功能失效导致。以下是多种修复此问题的方法: 本文运行环境:联想 Yoga…

    2026年8月30日
    100
  • 《星际公民》将大规模打击作弊者 不涉及Mod制作者

    近日,《星际公民》的开发公司cloud imperium games宣布,已对游戏中存在的作弊行为展开大规模封禁行动,并表示后续可能追加更多处罚措施,以应对近期日益严重的作弊现象。 自2023年起,《星际公民》中的作弊现象逐渐增多。社区经理乌尔夫·库尔施纳(Ulf Kurschner)在最近的声明中…

    2026年8月30日
    100
  • 三星显示与英特尔合作 研发AI设备专用显示器

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 三星显示与英特尔签署合作备忘录,致力于研发面向AI设备(例如AI PC)的先进显示屏。此举将助力英特尔提升移动平台性能,并为其GPU匹配更优显示方案;同时,三星有望进一步巩固其在高端笔记本电脑市…

    2026年8月30日
    100
  • 如何在PrestaShop中快速展示联系信息?使用ps_contactinfo模块可以!

    可以通过一下地址学习composer:学习地址 在使用 prestashop 构建电商平台时,如何让客户快速找到你的联系方式是一个关键问题。我在管理一个多店铺的 prestashop 项目时,遇到了一个小麻烦:每个店铺都需要在页面底部展示联系信息,并且每个店铺的联系信息配置需要独立。这不仅需要一个高…

    用户投稿 2026年8月30日
    100
  • win8系统评估工具在哪里_win8运行Windows体验指数评估教程

    Windows 8系统可通过内置的Windows体验指数评估性能。1、通过控制面板进入“查看计算机的评级和系统信息”,点击“重新运行评估”即可开始评分。2、使用Win + R输入WinSAT assesssystem命令可快速启动评估。3、若功能被禁用,可检查注册表中CPUEvaluationEna…

    2026年8月30日
    100
  • VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程

    VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程

    答案:VSCode通过Emmet、Live Server等扩展和智能提示功能,极大提升了HTML编写效率,其语义化标签支持与实时预览能力让开发更高效流畅。 在VSCode里处理HTML,其实比想象中要简单直观得多,它简直就是为前端开发量身定制的。对我来说,它不仅是一个编辑器,更像是一个高效的工作伙伴…

    2026年8月30日 用户投稿
    500
  • AI生成插画怎么操作_Illustroke文本生成矢量插画方法

    AI生成插画怎么操作_Illustroke文本生成矢量插画方法AI生成插画怎么操作_Illustroke文本生成矢量插画方法AI生成插画怎么操作_Illustroke文本生成矢量插画方法AI生成插画怎么操作_Illustroke文本生成矢量插画方法

    AI生成矢量插画的核心在于通过精准的文本提示词(Prompt)引导如Illustroke等工具,结合其对设计风格、构图与色彩的理解,快速生成可编辑、可缩放的SVG格式图形。整个流程包括:访问Illustroke平台,输入具体且富有描述性的提示词,生成多张草图后进行筛选与迭代优化。高质量提示词需明确主…

    2026年8月30日 用户投稿
    200
  • PHP 数组转换为树形结构:递归算法详解

    本文详细介绍了如何使用 PHP 将扁平化的数组数据转换为树形结构。通过递归算法,我们可以有效地处理包含父子关系的数组,并将其组织成易于理解和操作的树状数据结构。文章提供了完整的代码示例和详细的解释,帮助开发者理解递归的原理和应用,从而轻松实现数组到树的转换。 理解树形结构和扁平化数组 树形结构是一种…

    2026年8月30日
    100
  • 《神力科莎EVO》抢先体验版: 多人模式正式开放

    来源:官方 《神力科莎EVO》重磅上线Steam抢先体验,并同步推出v0.3重大更新(抢先体验版3.0),首次引入多人模式核心功能。本次升级涵盖9款全新载具与2条标志性赛道,同时对物理引擎、音效系统、画面表现及操作界面进行了全面革新与优化。 全球发行商505 Games携手意大利知名模拟赛车开发商K…

    2026年8月30日
    100
  • 安装系统电脑出现英文是怎么回事

    一、所需工具: 一台电脑和足够的耐心。在安装系统过程中电脑显示英文时,首先保持冷静,不要着急。同时,准备好你的电脑设备,这是处理问题的基础条件。 二、解决方法: 尝试重启设备或调整语言设置。当电脑界面出现英文时,可以先尝试重启电脑,有时候简单的重启可以修复临时性的错误。如果重启后问题依旧存在,可以进…

    2026年8月30日
    200
  • win10如何创建新的本地账户_win10创建新本地账户步骤

    可通过设置应用、netplwiz命令或计算机管理工具在Windows 10中创建本地账户,适合不同用户需求。 如果您需要在Windows 10系统中为家人或朋友创建一个独立的用户环境,或者希望拥有一个权限分离的账户以增强系统安全性,可以通过多种方式创建新的本地账户。以下是几种有效的操作方法。 本文运…

    2026年8月30日
    100

发表回复

登录后才能评论
关注微信