Java利用poi實現word,excel,ppt,pdf等各類型文檔密碼檢測

介紹

最近工作上需要對word,excel,ppt,pdf等各類型文檔密碼檢測,對文件進行分類,有密碼的和沒密碼的做區分。查了一堆資料和GPT都不是很滿意,最后東拼西湊搞了個相對全面的檢測工具代碼類,希望能給需要的人帶來幫助。

說明

這段代碼提供了一個全面的工具類,用于檢測多種辦公文檔(.xls, .xlsx, .doc, .docx, .pdf, .ppt, .pptx)是否設置了密碼保護。以下是該實現的核心邏輯和要點:
1、通用檢測入口:通過isFileProtected(File file, String fileExtension)方法,根據文件擴展名調用特定的檢測方法。
2、Excel文件檢測(isExcelProtected(File file)): 使用WorkbookFactory.create()嘗試打開文件,如果文件加密,會拋出EncryptedDocumentException異常。
3、Word文件檢測(isWordProtected(File file)): 利用WordExtractor嘗試讀取文件內容,當文件加密時,會拋出EncryptedDocumentException異常,或者從異常信息中判斷文件是否加密。
4、PDF文件檢測(isPdfProtected(File file)): 使用PDFBox庫的Loader.loadPDF()加載文件,然后檢查PDDocument實例的isEncrypted()狀態,或捕獲InvalidPasswordException來判斷是否加密。
5、PPT文件檢測(isPptProtected(File file)): 對于.ppt文件使用HSLFSlideShow嘗試讀取,通過捕獲異常并檢查消息中是否包含“encrypted”關鍵字來判斷文件是否加密。注意,對于.pptx文件,理論上應該使用與.xlsx類似的處理方式,但示例中未單獨區分。
6、資源管理:使用try-with-resources語句確保文件輸入流和各種文檔對象在操作完成后能被正確關閉,同時利用自定義的IoUtil.close()方法進一步確保資源的釋放(假設這是您項目中的一個輔助方法)。
7、日志記錄:在捕獲異常時記錄錯誤日志,有助于追蹤問題。

實現步驟

添加依賴

  • poi-4.1.2
  • hu-tool
  • pdfbox
<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.21</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><!-- jsoup HTML parser library @ https://jsoup.org/ --><groupId>org.jsoup</groupId><artifactId>jsoup</artifactId><version>1.17.2</version></dependency><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>3.0.2</version></dependency>

工具類

public class TestFileEncrypt {private static final Logger log = LoggerFactory.getLogger(TestFileEncrypt.class);public static void main(String[] args) {String filePath = "d:/tmp/enc/data0.xls"; // 替換為你要檢查的文件路徑boolean isLikelyEncrypted = isExcelProtected(FileUtil.newFile(filePath));System.out.println("文件是否加密的: " + isLikelyEncrypted);}// 創建通用方法,根據文件后綴名識別文件類型,調用不同的方法進行檢測public static boolean isFileProtected(File file, String fileExtension) {switch (fileExtension.toLowerCase()) {case "xls":case "xlsx":return isExcelProtected(file);case "doc":case "docx":return isWordProtected(file);case "pdf":return isPdfProtected(file);case "ppt":case "pptx":return isPptProtected(file);default:return false;}}// 檢查XLSX文件是否受密碼保護public static boolean isExcelProtected(File file) {boolean isProtected = false;Workbook sheets = null;try (FileInputStream fis = new FileInputStream(file)) {sheets = WorkbookFactory.create(fis);// 嘗試打開XLSX文件sheets.close();} catch (EncryptedDocumentException e) {isProtected = true;  // 拋出異常表示文件受密碼保護} catch (IOException e) {log.error("讀取Excel文件失敗:{},{}",file.getName(),e.getMessage());} finally {if (sheets != null) {IoUtil.close(sheets);}return isProtected;}}public static boolean isWordProtected(File file) {boolean isProtected = false;WordExtractor extractor = null;try (FileInputStream fis = new FileInputStream(file)) {// 創建WordExtractor以讀取內容,這一步可能會在文件受保護時失敗extractor = new WordExtractor(fis);extractor.close(); // 關閉提取器} catch (EncryptedDocumentException e){isProtected = true;} catch (IOException e) {if(e.getMessage().indexOf("EncryptedPackage") != -1){isProtected = true;}else{log.error("讀取Word文件失敗:{},{}",file.getName(),e.getMessage());}} finally {if(extractor!=null){IoUtil.close(extractor);}return isProtected;}}// 檢查PDF文件是否受密碼保護public static boolean isPdfProtected(File file) {boolean isEncrypted = false;try (PDDocument document = Loader.loadPDF(file)) {if (document.isEncrypted()) {isEncrypted =  true;}} catch (InvalidPasswordException e) {isEncrypted = true;} catch (IOException e) {log.error("讀取pdf文件失敗:{},{}",file.getName(),e.getMessage());}finally {return isEncrypted;}}public static boolean isPptProtected(File file) {boolean isProtected = false;HSLFSlideShow ppt=null;try (FileInputStream fis = new FileInputStream(file)) {ppt = new HSLFSlideShow(fis);ppt.getPageSize();ppt.close();} catch (Exception e){if(e.getMessage().toLowerCase().indexOf("encrypted")!=-1){isProtected = true;}} finally {if(ppt!=null){IoUtil.close(ppt);}return isProtected;}}}

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

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

相關文章

PHP 爬蟲之使用 Curl庫抓取淘寶商品列表數據網頁的方法

使用 PHP 的 cURL 庫來抓取淘寶商品列表數據網頁需要謹慎&#xff0c;因為淘寶等電商平臺通常會有反爬蟲機制&#xff0c;以防止數據被濫用。然而&#xff0c;如果你只是出于學習目的&#xff0c;并且了解并遵守了淘寶的robots.txt文件和相關的使用條款&#xff0c;你可以嘗試使…

2024 年江西省研究生數學建模競賽題目 B題投標中的競爭策略問題--完整思路、代碼結果分享(僅供學習)

招投標問題是企業運營過程中必須面對的基本問題之一。現有的招投標平臺有國家級的&#xff0c;也有地方性的。在招投標過程中&#xff0c;企業需要全面了解招標公告中的相關信息&#xff0c;在遵守招投標各種規范和制度的基礎上&#xff0c;選擇有效的競爭策略和技巧&#xff0…

基于JSP技術的校園餐廳管理系統

開頭語&#xff1a; 你好呀&#xff0c;我是計算機學長貓哥&#xff01;如果您對校園餐廳管理系統感興趣或有相關需求&#xff0c;歡迎隨時聯系我。我的聯系方式在文末&#xff0c;期待與您交流&#xff01; 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#x…

QT的編譯過程

qmake -project 用于從源代碼生成項目文件&#xff0c;qmake 用于從項目文件生成 Makefile&#xff0c;而 make 用于根據 Makefile 構建項目。 詳細解釋&#xff1a; qmake -project 這個命令用于從源代碼目錄生成一個初始的 Qt 項目文件&#xff08;.pro 文件&#xff09;。它…

Keil5中:出現:failed to execute ‘...\ARMCC\bin\ArmCC‘

點三個點&#xff0c;去自己的磁盤找自己的ARM\ARMCC\bin

深入解析:計算機系統總線全方位解讀

在計算機組成原理中&#xff0c;總線系統是連接計算機各個部件的重要通道。本文將詳細介紹系統總線的基本概念、分類、特性及性能指標、結構和控制方式。希望通過本文的講解&#xff0c;能夠幫助基礎小白更好地理解計算機系統總線的工作原理。 系統總線 (System Bus) 系統總線…

查看視頻時間基 time_base

時間基、codec, 分辨率&#xff0c;音頻和視頻的都一樣&#xff0c;才可以直接使用ffmpeg -f concat -i file.txt 方式合并。 On Thu, Dec 03, 2015 at 21:54:53 0200, redneb8888 wrote: I am looking for a way to find the time base of a stream (video or audio), $ ffpr…

selenium 簡介以及 selenium 環境配置

文章目錄 一、初識 selenium1.selenium 簡介2.selenium 三大組件3.selenium工作過程和原理4.selenium自動化測試流程5.selenium優點 二、自動化測試1.UI自動化本質2.UI自動化的前提3.適用場景4.UI自動化的原則5.UI自動化的覆蓋率 三、selenium 環境配置 一、初識 selenium 1.s…

單點登錄demo

gitee.com 搜索xxl(許雪里) 的sso 操作demo 完整流程圖

網絡安全控制相關技術

1.惡意代碼&#xff08;Malware&#xff09; 網絡從出現、發展演進都始終伴隨著安全方面的問題&#xff0c;只是每個階段表現的形式不同而已。在網絡安全方面&#xff0c;不能不提進行網絡攻擊的網絡病毒&#xff0c;或者說惡意代碼&#xff08;Malware&#xff09;。所有惡意…

MySQL中的網絡命名空間支持

Network Namespace Support&#xff08;網絡命名空間支持&#xff09; 提供了在Linux系統中創建和管理多個隔離網絡空間的能力。網絡命名空間是來自主機系統的網絡堆棧的邏輯副本。網絡命名空間對于設置容器或虛擬環境非常有用。每個名稱空間都有自己的IP地址、網絡接口、路由表…

什么是應用安全態勢管理 (ASPM):綜合指南

軟件開發在不斷發展&#xff0c;應用程序安全也必須隨之發展。 傳統的應用程序安全解決方案無法跟上當今開發人員的工作方式或攻擊者的工作方式。 我們需要一種新的應用程序安全方法&#xff0c;而ASPM在該方法中發揮著關鍵作用。 什么是 ASPM&#xff1f; 應用程序安全…

配電智能網關賦能電力系統智能化運行維護

隨著智能電網和物聯網技術的不斷發展&#xff0c;兩者之間的融合應用成為電力行業的重要趨勢。配電智能網關作為連接兩者的關鍵設備&#xff0c;在智能電網的物聯網應用中發揮著重要作用。 配電智能網關能夠實現對電力系統的實時監控、數據采集、遠程控制等功能&#xff0c;為…

已解決org.omg.CORBA.portable.RemarshalException:在CORBA中需要重新編組的正確解決方法,親測有效!!!

已解決org.omg.CORBA.portable.RemarshalException&#xff1a;在CORBA中需要重新編組的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 目錄 問題分析 出現問題的場景 服務器端代碼 客戶端代碼 報錯原因 解決思路 解決方法 1. 檢查網絡連接 …

力扣:LCR 024. 反轉鏈表(Java)

目錄 題目描述&#xff1a;示例 1&#xff1a;示例 2&#xff1a;代碼實現&#xff1a; 題目描述&#xff1a; 給定單鏈表的頭節點 head &#xff0c;請反轉鏈表&#xff0c;并返回反轉后的鏈表的頭節點。 示例 1&#xff1a; 輸入&#xff1a;head [1,2,3,4,5] 輸出&#x…

Xinstall智能安裝頁面:一鍵喚起App,提升用戶體驗

在移動互聯網時代&#xff0c;App已經成為我們日常生活中不可或缺的一部分。然而&#xff0c;隨著App數量的不斷增加&#xff0c;用戶面臨著越來越多的選擇&#xff0c;如何快速、便捷地安裝并打開App成為了用戶的一大痛點。針對這一問題&#xff0c;Xinstall憑借其強大的技術實…

數據結構——Hash Map

1. Hash Map簡介 Hash Map是一種基于鍵值對的數據結構&#xff0c;通過散列函數將鍵映射到存儲位置&#xff0c;實現快速的數據查找和存儲。它可以在常數時間內完成查找、插入和刪除操作&#xff0c;因此在需要頻繁進行這些操作時非常高效。 2. Hash Map的定義 散列表&#xff…

計組_程序的機器級代碼表示

2024.06.13&#xff1a;計算機組成原理程序的機器級代碼表示 第15節 程序的機器級代碼表示 5.1 x86的匯編指令格式5.2 常用指令 眼熟最基礎的匯編語法和助記符即可 5.1 x86的匯編指令格式 5.2 常用指令

WinSCP 登錄跳板機

使用 WinSCP 登錄跳板機&#xff08;跳板機是一種中間服務器&#xff0c;用于安全連接到其他服務器&#xff09;需要進行一些配置。這里是一個簡單的步驟指南&#xff1a; 準備工作 下載和安裝 WinSCP&#xff1a;如果你還沒有 WinSCP&#xff0c;可以從 WinSCP 官方網站 下載…

DeepMind的新論文,長上下文的大語言模型能否取代RAG或者SQL這樣的傳統技術呢?

長上下文大型語言模型&#xff08;LCLLMs&#xff09;確實引起了一些關注。這類模型可能使某些任務的解決更加高效。例如理論上可以用來對整本書進行總結。有人認為&#xff0c;LCLLMs不需要像RAG這樣的外部工具&#xff0c;這有助于優化并避免級聯錯誤。但是也有許多人對此持懷…