在Java中高效搜索PDF文本并管理文件

在java中高效搜索pdf文本并管理文件

本教程详细介绍了如何在Java应用程序中利用Apache PDFBox库从PDF文档中提取文本,并基于搜索结果执行文件复制或移动操作。文章将阐明为何不能直接将PDF作为普通文本文件处理,提供完整的代码示例,涵盖PDF文本提取、关键词搜索以及文件系统操作,并分享重要的注意事项和最佳实践,帮助开发者构建稳定可靠的PDF处理功能。

理解PDF文件特性与传统文本读取的局限性

PDF(Portable Document Format)文件是一种复杂的二进制格式,旨在保留文档的视觉外观,无论是在何种设备或操作系统上查看。与简单的文本文件不同,PDF内部存储的不是纯文本字符流,而是包含字体、图像、矢量图形、页面布局等多种元素的指令集。

因此,尝试使用Java的FileReader或BufferedReader等标准I/O类直接读取PDF文件,并期望通过readLine()或contains()方法搜索文本是无效的。这些方法会将PDF的二进制内容解释为字符,导致读取到乱码或无法识别的数据,从而无法正确执行文本搜索,也可能在后续处理中引发异常或产生“文件内容错误”的现象。为了正确地从PDF中提取可读文本,我们需要专门的库来解析其内部结构。

引入Apache PDFBox库

Apache PDFBox是一个开源的Java库,专门用于处理PDF文档。它提供了丰富的功能,包括创建、修改、提取文本、渲染和打印PDF文件。对于从PDF中提取文本的需求,PDFBox是业界广泛推荐和使用的解决方案。

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

添加PDFBox依赖

在开始之前,你需要在你的项目中添加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文件中提取文本的基本步骤如下:

绘蛙AI修图 绘蛙AI修图

绘蛙平台AI修图工具,支持手脚修复、商品重绘、AI扩图、AI换色

绘蛙AI修图 285 查看详情 绘蛙AI修图 加载PDF文档: 通过PDDocument.load(File file)方法加载指定的PDF文件。实例化PDFTextStripper: PDFTextStripper类负责从PDF文档中提取文本内容。提取文本: 调用pdfStripper.getText(PDDocument document)方法获取整个文档的文本内容,该方法返回一个String。关闭文档: 提取完成后,务必调用document.close()方法释放资源。

以下是提取PDF文本的示例代码:

import java.io.File;import java.io.IOException;import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.text.PDFTextStripper;public class PdfTextExtractor {    public String extractText(String filePath) throws IOException {        File file = new File(filePath);        PDDocument document = null;        try {            document = PDDocument.load(file);            PDFTextStripper pdfStripper = new PDFTextStripper();            return pdfStripper.getText(document);        } finally {            if (document != null) {                document.close();            }        }    }    public static void main(String[] args) {        String pdfPath = "D://Sample.pdf"; // 替换为你的PDF文件路径        PdfTextExtractor extractor = new PdfTextExtractor();        try {            String text = extractor.extractText(pdfPath);            System.out.println("提取的PDF文本内容:" + text.substring(0, Math.min(text.length(), 500)) + "..."); // 打印前500字符        } catch (IOException e) {            System.err.println("从PDF提取文本时发生错误: " + e.getMessage());            e.printStackTrace();        }    }}

实现文本搜索逻辑

一旦我们成功从PDF中提取了完整的文本内容(一个String对象),就可以像处理任何其他字符串一样对其进行搜索。Java的String类提供了contains()方法,可以方便地检查一个字符串是否包含另一个子字符串。为了实现不区分大小写的搜索,可以先将文本和搜索词都转换为小写或大写。

public boolean searchWordInPdf(String pdfText, String searchWord) {    if (pdfText == null || searchWord == null || searchWord.isEmpty()) {        return false;    }    // 为了不区分大小写,将两者都转换为小写进行比较    return pdfText.toLowerCase().contains(searchWord.toLowerCase());}

文件操作:复制与移动

在确认PDF中包含特定关键词后,下一步通常是将该PDF文件复制或移动到另一个目录。Java 7引入的NIO.2(java.nio.file包)提供了强大且高效的文件系统操作API。

复制文件: 使用Files.copy(Path source, Path target, CopyOption… options)。移动文件: 使用Files.move(Path source, Path target, CopyOption… options)。

这些方法允许你指定复制或移动的选项,例如StandardCopyOption.REPLACE_EXISTING(如果目标文件已存在则覆盖)或StandardCopyOption.ATOMIC_MOVE(尝试执行原子移动)。

import java.io.IOException;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.StandardCopyOption;public class FileOperations {    public void copyFile(String sourcePath, String targetDirectory, String newFileName) throws IOException {        Path source = Paths.get(sourcePath);        Path targetDir = Paths.get(targetDirectory);        if (!Files.exists(targetDir)) {            Files.createDirectories(targetDir); // 如果目标目录不存在,则创建        }        Path target = targetDir.resolve(newFileName); // 构建目标文件路径        Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);        System.out.println("文件 '" + source.getFileName() + "' 已成功复制到 '" + target + "'。");    }    public void moveFile(String sourcePath, String targetDirectory, String newFileName) throws IOException {        Path source = Paths.get(sourcePath);        Path targetDir = Paths.get(targetDirectory);        if (!Files.exists(targetDir)) {            Files.createDirectories(targetDir); // 如果目标目录不存在,则创建        }        Path target = targetDir.resolve(newFileName); // 构建目标文件路径        Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);        System.out.println("文件 '" + source.getFileName() + "' 已成功移动到 '" + target + "'。");    }}

完整示例代码:PDF文本搜索与文件管理

现在,我们将上述所有组件整合到一个完整的Java应用程序中,实现从用户输入搜索词,然后在指定PDF中搜索,并根据结果执行文件操作的功能。

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;import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.text.PDFTextStripper;public class PdfSearchAndMove {    private static final String PDF_FILE_PATH = "C:\Users\user012\Desktop\Evalution.pdf"; // 待搜索的PDF文件路径    private static final String TARGET_DIR_PATH = "C:\Users\user012\Desktop\Search"; // 目标目录路径    /**     * 从PDF文件中提取所有文本内容。     * @param filePath PDF文件路径     * @return 提取到的文本内容     * @throws IOException 如果文件不存在或处理PDF时发生错误     */    public String extractTextFromPdf(String filePath) throws IOException {        File file = new File(filePath);        if (!file.exists() || !file.isFile()) {            throw new IOException("PDF文件不存在或不是一个有效的文件: " + filePath);        }        PDDocument document = null;        try {            document = PDDocument.load(file);            PDFTextStripper pdfStripper = new PDFTextStripper();            return pdfStripper.getText(document);        } finally {            if (document != null) {                document.close();            }        }    }    /**     * 在给定的文本内容中搜索指定的关键词。     * @param pdfText 从PDF中提取的文本内容     * @param searchWord 待搜索的关键词     * @return 如果找到关键词返回true,否则返回false     */    public boolean containsWord(String pdfText, String searchWord) {        if (pdfText == null || searchWord == null || searchWord.isEmpty()) {            return false;        }        // 不区分大小写搜索        return pdfText.toLowerCase().contains(searchWord.toLowerCase());    }    /**     * 将文件从源路径复制到目标目录。     * @param sourceFilePath 源文件路径     * @param targetDirectory 目标目录路径     * @param newFileName 目标文件的新名称     * @throws IOException 如果复制操作失败     */    public void copyPdfFile(String sourceFilePath, String targetDirectory, String newFileName) throws IOException {        Path source = Paths.get(sourceFilePath);        Path targetDir = Paths.get(targetDirectory);        // 确保目标目录存在        if (!Files.exists(targetDir)) {            Files.createDirectories(targetDir);        }        Path target = targetDir.resolve(newFileName);        // 复制文件,如果目标文件已存在则替换        Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING);        System.out.println("文件 '" + source.getFileName() + "' 已成功复制到 '" + target + "'。");    }    public static void main(String[] args) {        Scanner scanner = new Scanner(System.in);        PdfSearchAndMove app = new PdfSearchAndMove();        System.out.println("请输入您要搜索的单词 (输入 'Exit' 退出):");        while (scanner.hasNextLine()) {            String searchWord = scanner.nextLine().trim();            if ("Exit".equalsIgnoreCase(searchWord)) {                System.out.println("程序退出。");                break;            }            if (searchWord.isEmpty()) {                System.out.println("搜索词不能为空,请重新输入。");                continue;            }            try {                // 1. 从PDF中提取文本                String pdfContent = app.extractTextFromPdf(PDF_FILE_PATH);                // 2. 搜索关键词                if (app.containsWord(pdfContent, searchWord)) {                    System.out.println("是的,'" + searchWord + "' 在文件中。");                    // 3. 如果找到,则复制文件                    // 假设复制后的文件名为原文件名加上"_searched"后缀                    String originalFileName = Paths.get(PDF_FILE_PATH).getFileName().toString();                    String newFileName = originalFileName.replaceFirst("(\.pdf)$", "_searched$1");                    app.copyPdfFile(PDF_FILE_PATH, TARGET_DIR_PATH, newFileName);                } else {                    System.out.println("不,'" + searchWord + "' 不在文件中。");                }            } catch (IOException e) {                System.err.println("处理文件时发生错误: " + e.getMessage());                // 打印完整的堆栈跟踪,以便调试                e.printStackTrace();             } catch (Exception e) {                System.err.println("发生未知错误: " + e.getMessage());                e.printStackTrace();            }            System.out.println("请输入您要搜索的下一个单词 (输入 'Exit' 退出):");        }        scanner.close();    }}

注意事项与最佳实践

资源管理: 始终确保在使用完PDDocument后调用document.close()方法。这对于释放文件句柄和内存资源至关重要,尤其是在处理大量PDF文件时。使用try-finally块或Java 7的try-with-resources语句可以有效管理资源。异常处理: 文件I/O和PDF解析操作都可能抛出IOException。务必捕获并妥善处理这些异常,例如打印错误信息或记录日志,以提高程序的健壮性。性能考虑: 对于非常大的PDF文件,pdfStripper.getText()可能会消耗较多内存和时间。如果只需要搜索特定页面或对性能有严格要求,可以考虑优化PDFBox的使用,例如分批处理页面。文件路径: 在Windows系统中,文件路径通常使用反斜杠。在Java代码中,建议使用正斜杠/或双反斜杠\来表示路径,或者使用Paths.get()方法,它能更好地处理不同操作系统的路径分隔符。目标文件命名: 在复制或移动文件时,要仔细考虑目标文件的命名策略,避免覆盖重要文件。在示例中,我们添加了_searched后缀。错误信息: 原始问题中提到“the pdf file showing something wrong”,这通常意味着文件内容被破坏或无法识别。使用正确的库(如PDFBox)来处理PDF可以避免此类问题。用户体验: 在实际应用中,可以添加进度指示器、更详细的错误提示等,提升用户体验。

通过遵循本教程的指导和最佳实践,您将能够可靠地在Java应用程序中实现PDF文本搜索和基于搜索结果的文件管理功能。

以上就是在Java中高效搜索PDF文本并管理文件的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
css盒模型在flex布局中的应用
上一篇 2025年12月2日 07:36:55
索尼首次公布Xperia 1 VI正面照!祖传21:9带鱼屏谢幕
下一篇 2025年12月2日 07:36:58

相关推荐

  • win11保存Hosts文件时提示权限不足怎么办_win11Hosts文件权限不足解决方法

    首先通过修改文件属性安全权限或以管理员身份运行编辑器解决Hosts文件保存权限问题,具体可选择:1、调整Hosts文件安全选项卡中的用户权限;2、右键以管理员身份运行记事本后打开并修改;3、通过管理员命令提示符执行notepad命令直接编辑并保存。 如果您尝试修改 Windows 11 系统中的 H…

    2026年9月22日
    000
  • Java类中Jackson @JsonNaming策略的运行时内省

    本文介绍如何在运行时动态内省Java类上通过@JsonNaming注解配置的Jackson PropertyNamingStrategy。通过利用ObjectMapper的SerializationConfig和JacksonAnnotationIntrospector,开发者可以编程方式获取类的命…

    2026年9月22日
    200
  • 解决PHP扩展缺失错误:phpinfo验证与服务重启指南

    本文旨在解决%ignore_a_1%脚本运行时提示特定扩展(如json、mbstring)缺失的问题,即便用户已在php配置中手动启用。核心解决方案是利用`phpinfo()`函数验证扩展的实际加载状态,并强调在修改php配置后,必须重启相关的web服务器或php-fpm服务,以确保新的配置生效。 …

    2026年9月22日
    100
  • windows怎么恢复已删除的输入法_已卸载输入法恢复技巧

    首先通过语言设置重新添加输入法,进入设置→时间和语言→语言和区域→语言选项→键盘→添加所需输入法;若无效可使用控制面板,在区域和语言中更改键盘设置并添加;还可从其他设备导出注册表中Keyboard Layout与InputMethod相关项导入本机;最后可通过系统还原点恢复删除前的输入法配置。 如果…

    2026年9月22日
    300
  • VSCode安装C/C++文档查看 提升开发效率的VSCode技巧

    答案是利用C/C++扩展和cppreference插件实现高效文档查阅。首先安装微软官方C/C++扩展,启用智能感知与悬停提示;再安装cppreference扩展,通过命令面板直接搜索标准库函数,实现离线在线无缝查阅;结合Doxygen生成项目文档,使用“转到定义”功能快速跳转源码;同时借助Inte…

    2026年9月22日
    000
  • 高效利用 PriorityQueue 合并并排序多个列表

    本教程详细阐述了如何使用 Java 的 PriorityQueue 高效地合并并排序多个整数列表。文章首先指出将列表作为元素放入 PriorityQueue 的常见误区,进而纠正为应将单个整数元素放入队列。接着,它演示了如何正确声明、填充 PriorityQueue,并强调了通过循环调用 poll(…

    2026年9月22日
    300
  • mac怎么设置动态壁纸_mac设置动态壁纸方法

    可通过系统设置直接启用macOS自带的动态桌面;2. 利用iCloud同步功能实现Apple设备间的动态壁纸共享;3. 安装第三方应用扩展更多动态效果如视频或实时天气;4. 手动将.heic或.mov格式文件添加至指定目录以设置自定义动态壁纸。 如果您希望为Mac增添个性化视觉体验,可以将动态壁纸设…

    2026年9月22日
    200
  • 如何配置Android开发环境 Android Studio安装与JDK配置方法

    答案:配置Android开发环境需先安装JDK并设置环境变量,再下载安装Android Studio,配置SDK及虚拟设备,最后创建项目测试。具体步骤包括:1. 安装JDK 17并配置JAVA_HOME和Path;2. 从官网下载Android Studio并安装,自动集成SDK;3. 通过SDK …

    2026年9月22日
    100
  • ClipStudioPaintPro如何导出AI漫画图片?保存图像的详细指南

    导出AI漫画图片需通过Clip Studio Paint Pro的“文件”菜单选择“导出”,根据用途选单页、多页或Webtoon导出,推荐PNG用于高质量或透明背景需求,JPG用于网络分享以平衡文件大小与画质,设置300dpi以上分辨率确保清晰度,色彩配置选用sRGB保障跨平台一致性,批量导出时利用…

    2026年9月22日
    100
  • 谷歌浏览器官网直接进入 Chrome浏览器官方登录入口

    谷歌浏览器官网直接进入方式为访问https://www.google.com/chrome/,该网站是Chrome官方登录入口,提供跨平台同步、V8引擎加速、地址栏集成搜索、自动填充表单等核心功能,支持极简界面、深色模式、自定义新标签页及侧边栏服务,具备安全浏览、隐私沙盒、密码检查和无痕模式等安全机…

    2026年9月22日
    100
  • 拼多多商家版怎么赚钱?拼多多商家版怎么赚钱提现

    答案:通过拼多多商家版开设虚拟资料店铺,缴纳500元保证金注册个人店,选品如PPT模板、教程等高需求低风险商品,利用阿奇索等工具设置自动发货,结合低价引流和付费推广提升销量,订单完成后资金在T+1或T+7结算周期后提现至银行卡。 如果您想通过拼多多商家版实现盈利并完成资金提现,需要了解其核心的运营模…

    2026年9月22日
    400
  • Laravel 8 注册成功但登录失败的解决方案

    本文针对 Laravel 8 中使用 php artisan ui:auth 生成的认证系统,注册功能正常但登录功能失效的问题,提供了一种解决方案。通过重写 LoginController 中的 username() 方法,将认证字段从默认的 email 修改为 username,从而解决登录失败的…

    2026年9月22日
    000
  • 如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧

    如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧如何在GravitDesigner中使用AI裁剪图片?快速掌握裁剪技巧

    Gravit Designer没有内置AI智能抠图功能,但通过形状裁剪(剪切蒙版)、路径编辑和布尔运算等工具组合,可实现高精度、非破坏性的精细化裁剪。其“智能”体现在非破坏性编辑、矢量级精度和工具协同的灵活性,虽需手动操作,却能完全掌控裁剪过程,适合追求专业输出的设计师。 ☞☞☞AI 智能聊天, 问…

    2026年9月22日 用户投稿
    100
  • 虎卫战神AI巡航玩法指南

    虎卫战神AI巡航玩法指南虎卫战神AI巡航玩法指南虎卫战神AI巡航玩法指南虎卫战神AI巡航玩法指南

    在《虎卫战神》中,战力的提升始终是每位玩家的核心目标。无论是装备强化、任务奖励、主公升阶,还是转生炼体,各类成长系统都离不开关键材料的支持。而这些材料大多需通过挑战BOSS获取,主线任务推进同样依赖击败指定数量的BOSS。 频繁切换地图、升级效率低下是否让你倍感疲惫?别担心!2025年必备的AI巡航…

    2026年9月22日 用户投稿
    000
  • MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作

    MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作MySQL跨数据库查询技巧_实现不同数据库间的数据联动操作

    mysql跨数据库查询的核心方法是在sql语句中通过“数据库名.表名”方式指定不同数据库的表,实现数据联动。1.在同一个mysql实例内,直接使用数据库名加表名进行关联查询,如db_user.users和db_order.orders,前提是用户需具备相应权限且建议对关联字段建立索引以提升性能;2.…

    2026年9月22日 用户投稿
    400
  • Procreate的AI混合工具怎么用?提升数字绘画效率的实用教程

    Procreate虽无直接名为“AI混合工具”的功能,但其图层混合模式、涂抹工具、Alpha锁定与剪裁蒙版等设计,共同构成了智能化的色彩混合体系。通过正片叠底、滤色等模式可实现自然光影叠加,涂抹工具结合纹理笔刷能模拟真实颜料融合,Alpha锁定和剪裁蒙版则确保混合精准可控。分层渐变、低不透明度叠加及…

    2026年9月22日
    700
  • windows怎么设置自动清理回收站_windows自动清理回收站的设置步骤

    可通过存储感知、组策略或任务计划程序设置回收站自动清理。首先启用存储感知并配置回收站文件保留时间;其次专业版用户可使用组策略编辑器精细管理回收站容量与清理周期;最后通过任务计划程序创建定时任务,运行PowerShell命令“Clear-RecycleBin -Force”实现自动化清理。 如果您发现…

    2026年9月22日
    000
  • VSCode高效配置Node.js:npm集成、中文报错、断点调试

    答案:高效配置VSCode与Node.js需确保Node.js和npm为最新版,利用集成终端运行命令,通过jsconfig.json或tsconfig.json优化项目配置,解决中文乱码需设置终端编码为UTF-8并选择支持中文的字体,调试核心是正确配置launch.json文件,使用pwa-node…

    2026年9月22日
    400
  • unix怎么安装php_unix系统安装php环境指南

    首先确认系统环境并检查是否已安装相关软件,然后选择包管理器或源码编译方式安装PHP;推荐使用包管理器快速安装,如Debian/Ubuntu用apt,CentOS/RHEL/Fedora用yum或dnf,FreeBSD用pkg;安装后配置Web服务器,Apache需加载mod_php或集成PHP-FP…

    2026年9月22日
    300
  • windows8桌面图标有蓝色阴影怎么去掉_windows8取消桌面图标蓝色底纹的方法

    1、调整视觉效果设置,取消“在桌面上为图标标签使用阴影”可消除蓝色背景;2、解除桌面Web项目锁定并清除Web内容;3、专业版用户可通过组策略禁用Active Desktop功能以彻底解决问题。 如果您发现Windows 8系统中的桌面图标带有蓝色阴影或底纹,这通常是由于系统视觉效果设置或桌面项目锁…

    2026年9月22日
    100

发表回复

登录后才能评论
关注微信