Java 使用 PDFBox 提取 PDF 文本并統計關鍵詞出現次數(附Demo)

目錄

  • 前言
  • 1. 基本知識
  • 2. 在線URL
    • 2.1 英文
    • 2.2 混合
  • 3. 實戰

前言

爬蟲神器,無代碼爬取,就來:bright.cn

Java基本知識:

  1. java框架 零基礎從入門到精通的學習路線 附開源項目面經等(超全)
  2. 【Java項目】實戰CRUD的功能整理(持續更新)

需要爬蟲相關的PDF,并統計對應PDF里頭的詞頻,其中某個功能需要如下知識點

1. 基本知識

Apache PDFBox 是一個開源的 Java PDF 操作庫,支持:

  • 讀取 PDF 文件內容(包括文字、圖片、元數據)

  • 創建和修改 PDF 文檔

  • 提取文本內容用于搜索、分析等操作

Maven相關的依賴:

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.29</version>
</dependency>

需下載 在進行統計:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;import java.io.File;
import java.io.IOException;public class PDFWordCounter {public static void main(String[] args) {String pdfPath = "sample.pdf";  // 替換為你的 PDF 文件路徑String keyword = "Java";        // 要統計的詞語try {// 加載 PDF 文檔PDDocument document = PDDocument.load(new File(pdfPath));// 使用 PDFTextStripper 提取文本PDFTextStripper stripper = new PDFTextStripper();String text = stripper.getText(document);document.close(); // 記得關閉文檔資源// 轉小寫處理,方便忽略大小寫String lowerText = text.toLowerCase();String lowerKeyword = keyword.toLowerCase();// 調用詞頻統計函數int count = countOccurrences(lowerText, lowerKeyword);System.out.println("詞語 \"" + keyword + "\" 出現次數: " + count);} catch (IOException e) {e.printStackTrace();}}// 使用 indexOf 遍歷匹配詞語出現次數private static int countOccurrences(String text, String word) {int count = 0;int index = 0;while ((index = text.indexOf(word, index)) != -1) {count++;index += word.length();}return count;}
}

上述的Demo詳細分析下核心知識:

  1. PDDocument.load(File)
    用于加載 PDF 文件到內存中
    PDFBox 使用 PDDocument 表示整個 PDF 對象,使用完后必須調用 close() 釋放資源

  2. PDFTextStripper
    PDFBox 中用于提取文字的核心類,會盡可能“以閱讀順序”提取文本,適用于純文字 PDF 文件。對于圖像型掃描件則無效(需 OCR)

  3. 大小寫不敏感統計
    實際應用中搜索關鍵詞通常需要忽略大小寫,因此我們先統一將文本和關鍵詞轉換為小寫

  4. indexOf 實現詞頻統計
    這是最基礎也最直觀的統計方法,效率較高,但不夠精確
    如果需要更精確(只統計完整單詞),可以使用正則:

Pattern pattern = Pattern.compile("\\b" + Pattern.quote(word) + "\\b", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
int count = 0;
while (matcher.find()) {count++;
}

2. 在線URL

2.1 英文

此處的Demo需要注意一個點:

注意點說明
PDF 文件是否公開訪問不能訪問受密碼或登錄保護的 PDF
文件大小不建議下載和分析過大文件,可能導致內存問題
中文 PDF若是掃描圖片形式的中文 PDF,則 PDFBox 無法直接提取文本(需 OCR)
編碼問題若中文顯示為亂碼,可能是 PDF 沒有內嵌字體

🔧 思路:

  1. 通過 URL.openStream() 獲取在線 PDF 的輸入流

  2. 使用 PDFBox 的 PDDocument.load(InputStream) 讀取 PDF

  3. 用 PDFTextStripper 提取文本

  4. 用字符串方法或正則統計關鍵詞頻率

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;import java.io.InputStream;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class OnlinePDFKeywordCounter {public static void main(String[] args) {String pdfUrl = "https://www.example.com/sample.pdf"; // 你的在線 PDF 鏈接String keyword = "Java";  // 需要統計的關鍵詞try (InputStream inputStream = new URL(pdfUrl).openStream();PDDocument document = PDDocument.load(inputStream)) {PDFTextStripper stripper = new PDFTextStripper();String text = stripper.getText(document);// 使用正則匹配單詞邊界(忽略大小寫)Pattern pattern = Pattern.compile("\\b" + Pattern.quote(keyword) + "\\b", Pattern.CASE_INSENSITIVE);Matcher matcher = pattern.matcher(text);int count = 0;while (matcher.find()) {count++;}System.out.println("詞語 \"" + keyword + "\" 出現在在線 PDF 中的次數為: " + count);} catch (Exception e) {System.err.println("處理 PDF 時出錯: " + e.getMessage());e.printStackTrace();}}
}

2.2 混合

方法適用場景是否支持中文
indexOf中英文都適用?
Pattern + \\b僅限英文單詞匹配? 中文不支持

正則表達式 \\b...\\b(表示“單詞邊界”)并不適用于中文

統計在想的URL PDF的詞頻:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;import java.io.InputStream;
import java.net.URL;public class OnlinePDFKeywordCounter {public static void main(String[] args) {String pdfUrl = "https://www.xxxx.pdf";String keyword = "管理層";  // 要統計的中文關鍵詞try (InputStream inputStream = new URL(pdfUrl).openStream();PDDocument document = PDDocument.load(inputStream)) {PDFTextStripper stripper = new PDFTextStripper();String text = stripper.getText(document);// 直接用 indexOf 不區分大小寫(對于中文沒必要轉小寫)int count = countOccurrences(text, keyword);System.out.println("詞語 \"" + keyword + "\" 出現次數為: " + count);} catch (Exception e) {System.err.println("處理 PDF 時出錯: " + e.getMessage());e.printStackTrace();}}// 簡單統計子串出現次數(適用于中文)private static int countOccurrences(String text, String keyword) {int count = 0;int index = 0;while ((index = text.indexOf(keyword, index)) != -1) {count++;index += keyword.length();}return count;}
}

截圖如下:

在這里插入圖片描述

3. 實戰

如果詞頻比較多,可以使用List

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;import java.io.InputStream;
import java.net.URL;
import java.util.Arrays;
import java.util.List;public class OnlinePDFChinaKeywordCounter {public static void main(String[] args) {String pdfUrl = "https://www.pdf";// 多個中文關鍵詞List<String> keywords = Arrays.asList("營業收入", "凈利潤", "資產總額", "負債");try (InputStream inputStream = new URL(pdfUrl).openStream();PDDocument document = PDDocument.load(inputStream)) {PDFTextStripper stripper = new PDFTextStripper();String text = stripper.getText(document);// 統計 PDF 中的總文字長度(不含空格和換行)int totalCharacters = text.replaceAll("\\s+", "").length();System.out.println("PDF 中文本總字數(不含空格換行): " + totalCharacters);for (String keyword : keywords) {int count = countOccurrences(text, keyword);System.out.println("詞語 \"" + keyword + "\" 出現次數為: " + count);}} catch (Exception e) {System.err.println("處理 PDF 時出錯: " + e.getMessage());e.printStackTrace();}}// 統計某個關鍵詞出現次數private static int countOccurrences(String text, String keyword) {int count = 0;int index = 0;while ((index = text.indexOf(keyword, index)) != -1) {count++;index += keyword.length();}return count;}
}

截圖如下:

在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81307.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81307.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81307.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Vue百日學習計劃Day16-18天詳細計劃-Gemini版

重要提示&#xff1a; 番茄時鐘&#xff1a; 每個番茄鐘為25分鐘學習&#xff0c;之后休息5分鐘。每完成4個番茄鐘&#xff0c;進行一次15-30分鐘的長休息。動手實踐&#xff1a; DOM 操作和事件處理的理解高度依賴于實際編碼。請務必在瀏覽器中創建 HTML 頁面&#xff0c;并配…

SearchClassUtil

路徑掃描工具SearchClassUtil&#xff0c;用于掃描指定包&#xff08;XXXX&#xff09;下的所有.class文件&#xff0c;并將它們的全限定類名&#xff08;如tomcat.SearchClassUtil&#xff09;收集到列表中返回。該工具使用遞歸文件遍歷和反射機制&#xff0c;是實現 Spring 框…

云服務器的運用自如

云服務器的運用自如&#xff1a;從基礎到高階的實戰指南&#xff08;2025版&#xff09; 云服務器作為數字化轉型的核心工具&#xff0c;其靈活性和高效性已覆蓋從個人開發者到企業級應用的廣泛場景。以下是基于當前技術趨勢的云服務器深度運用策略&#xff0c;涵蓋核心應用、…

解密企業級大模型智能體Agentic AI 關鍵技術:MCP、A2A、Reasoning LLMs-docker MCP解析

解密企業級大模型智能體Agentic AI 關鍵技術&#xff1a;MCP、A2A、Reasoning LLMs-docker MCP解析 這里面有很重要的原因其中一個很其中一個原因是因為如果你使用docker的方式&#xff0c;你可以在虛擬環境下就類似于這個沙箱的這個機制可以進行隔離。這對于安全&#xff0c;…

快慢指針算法(Floyd 判圈算法)

快慢指針&#xff08;又稱龜兔賽跑算法&#xff09;是一種常用的鏈表操作技巧&#xff0c;通過兩個移動速度不同的指針遍歷鏈表&#xff0c;用于解決鏈表中環檢測、中點查找等問題。以下是其核心應用場景和實現方法&#xff1a; 1. 鏈表環檢測 問題描述&#xff1a; 判斷鏈表中…

獨立開發者利用AI工具快速制作產品MVP

在當今快速發展的科技時代&#xff0c;獨立開發者面臨著前所未有的機遇與挑戰。曾經需要花費數天甚至數周才能完成的產品MVP&#xff08;Minimum Viable Product&#xff0c;最小可行性產品&#xff09;&#xff0c;如今借助強大的AI工具&#xff0c;可以在短短1小時內實現。 …

Spark處理過程-轉換算子和行動算子

&#xff08;一&#xff09;RDD的處理過程 RDD經過一系列的“轉換”操作&#xff0c;每一次轉換都會產生不同的RDD&#xff0c;以供給下一次“轉換”操作使 用&#xff0c;直到最后一個RDD經過“行動”操作才會真正被計算處理。 1.延遲。RDD中所有的轉換都是延遲的&…

設置環境變量啟動jar報

1. 環境變量設置 set PATHC:\Program Files\java17\jdk-17.0.9\bin;%PATH%2. 啟動jar java -jar jar包名3. 記錄原因 PATH路徑前添加java執行文件路徑才會管用。添加后可以試試以下命令 直接輸入PATH 回車 PATH進行java版本測試 java -version

589. N叉樹的前序遍歷迭代法:null指針與棧的巧妙配合

一、題目描述 給定一個N叉樹的根節點&#xff0c;返回其節點值的前序遍歷結果。前序遍歷的定義是&#xff1a;先訪問根節點&#xff0c;再依次遍歷每個子節點&#xff08;從左到右&#xff09;。例如&#xff0c;對于如下N叉樹&#xff1a; 1/ | \3 2 4 / \ 5 6前序遍歷結果…

顯性知識的主要特征

有4個主要特征&#xff1a; 客觀存在性靜態存在性可共享性認知元能性

奧運數據可視化:探索數據講述奧運故事

在數據可視化的世界里&#xff0c;體育數據因其豐富的歷史和文化意義&#xff0c;常常成為最有吸引力的主題之一。今天我要分享一個令人著迷的奧運數據可視化項目&#xff0c;它巧妙地利用交互式圖表和動態動畫&#xff0c;展現了自1896年至今奧運會的發展歷程和各國奧運成就的…

Mysql存儲過程(附案例)

? 文章目錄 存儲過程概述1、基本語法2、變量①、系統變量②、用戶自定義變量③、局部變量 3、流程控制語句①、if語句②、參數③、case語句④、while語句⑤、repeat語句⑥、loop語句⑦、cursor游標⑧、handler 4、存儲函數 存儲過程概述 存儲過程是事先經過編譯并存儲在數據…

小波變換+注意力機制成為nature收割機

小波變換作為一種新興的信號分析工具&#xff0c;能夠高效地提取信號的局部特征&#xff0c;為復雜數據的處理提供了有力支持。然而&#xff0c;它在捕捉數據中最為關鍵的部分時仍存在局限性。為了彌補這一不足&#xff0c;我們引入了注意力機制&#xff0c;借助其能夠強化關注…

SQLMesh 增量模型從入門到精通:5步實現高效數據處理

本文深入解析 SQLMesh 中的增量時間范圍模型&#xff0c;介紹其核心原理、配置方法及高級特性。通過實際案例說明如何利用該模型提升數據加載效率&#xff0c;降低計算資源消耗&#xff0c;并提供配置示例與最佳實踐建議&#xff0c;幫助讀者在實際項目中有效應用這一強大功能。…

Android應用內存分析與優化 - 工具篇之Booster

序 在原理篇中&#xff0c;我們發現在App內存的分布中&#xff0c;Code是占大頭的部分&#xff0c;所以我們可以從App體積方面想辦法&#xff0c;通過減小App體積達到降低內存的目的&#xff0c;同時&#xff0c;根據權威的機構分析&#xff0c;體積與用戶下載和留存有很大的聯…

金屬加工液展|切削液展|2025上海金屬加工液展覽會

2025上海金屬加工液展覽會 時間&#xff1a;2025年12月2-4日 地點&#xff1a;上海新國際博覽中心 2025上海金屬加工液展規劃30000平方米展覽規模&#xff0c;預設展位1200個&#xff0c;將為國內外加工液產業提供一個集“展示、合作、交易、發展”于一體的綜合性平臺&#…

React學習———Redux 、 React Redux和react-persist

Redux Redux是一個流行的JavaScript狀態管理庫&#xff0c;通常用于React等前端框架結合使用。Redux 的設計思想是讓應用的狀態變得可預測、可追蹤、易于調試和測試。 Redux的核心l理念 單一數據源&#xff1a;整個應用的狀態被存儲在一個唯一的Store對象中&#xff0c;所有…

Python字符串常用方法詳解

文章目錄 Python字符串常用方法詳解一、字符串大小寫轉換方法(常用)1. 基礎大小寫轉換2. 案例&#xff1a;驗證碼檢查&#xff08;不區分大小寫&#xff09; 二、字符串查找與替換方法1. 查找相關方法2. 替換相關方法 三、字符串判斷方法1. 內容判斷方法 四、字符串分割與連接方…

MyBatis—動態 SQL

MyBatis—動態 SQL 一、動態 SQL 的核心作用 動態 SQL 主要解決以下問題&#xff1a; 靈活性&#xff1a;根據不同的輸入參數生成不同的 SQL 語句&#xff08;如條件查詢、批量操作&#xff09;。 可維護性&#xff1a;減少重復代碼&#xff0c;通過標簽化邏輯提高 SQL 可讀…

Python機器學習筆記(二十五、算法鏈與管道)

對于許多機器學習算法,特定數據表示非常重要。首先對數據進行縮放,然后手動合并特征,再利用無監督機器學習來學習特征。因此,大多數機器學習應用不僅需要應用單個算法,而且還需要將許多不同的處理步驟和機器學習模型鏈接在一起。Pipeline類可以用來簡化構建變換和模型鏈的…