word、pdf、excel及zip加密(含示例效果及工具类)

2024-08-28 00:04

本文主要是介绍word、pdf、excel及zip加密(含示例效果及工具类),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于POI、zip4j 给word、pdf、excel及zip加密

      • 需求说明:
      • 1、所需依赖:
      • 2、文档加密方法工具类:
      • 测试文档加密工具类
      • 4、 zip包加密工具类
      • 5、ZIP 方式1测试:
      • 6:zip2加密方式测试 :

需求说明:

许多人希望能够对自己的Office文件以及压缩的ZIP文件进行加密,以防止未经授权的访问和信息泄露。然而,使用WPS、Microsoft Office软件或其它压缩工具逐一对每一个文件进行加密,实在是耗时且费力,往往让人感到疲惫与沮丧。

因此,本文将详细介绍一种更为高效的解决方案,以免大家在人力和时间上面无谓的消耗。本文的主要内容结构包括以下几个部分:

1、所需依赖
2、文档类加密工具类 + 测试示例
3、zip包加密工具类 + 测试示例

效果如下:
在这里插入图片描述
在这里插入图片描述

1、所需依赖:

提前声明(JAR包版本已经经过筛选 尽量不用对依赖做变更,不然部分方法或者类不存在)且注意各个POI依赖之间的版本信息。

  <!--其他包 与主题无关 为保完整性故完整列出 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12 --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.25</version><scope>compile</scope></dependency><!-- office加密所需 --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.11</version><type>pom</type></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency><!-- Apache POI --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.xmlbeans</groupId><artifactId>xmlbeans</artifactId><version>5.1.1</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version></dependency><dependency><groupId>fr.opensagres.xdocreport</groupId><artifactId>fr.opensagres.xdocreport.converter.docx.xwpf</artifactId><version>1.0.6</version></dependency><!--ZIP包加密 所需  --><dependency><groupId>net.lingala.zip4j</groupId><artifactId>zip4j</artifactId><version>2.9.1</version></dependency>

2、文档加密方法工具类:

  package com.example.demo;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.crypt.EncryptionInfo;
import org.apache.poi.poifs.crypt.EncryptionMode;
import org.apache.poi.poifs.crypt.Encryptor;
import org.apache.poi.poifs.crypt.standard.StandardEncryptor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.poi.xwpf.usermodel.XWPFDocument;import java.io.*;
import java.nio.file.Files;/*** 类描述:文件加密工具类 (word、excel、pdf )* 如有新增 请补充到描述中。** @author xú* @since 1.0.0  2024-08-27 04:45:19*/
public class DocumentEncryptionUtil {private DocumentEncryptionUtil() {}/*** 方法描述:加密word文件** @param file     文件* @param password 密码* @author xú* @since 1.0.0   2024-08-27 04:46:54*/public static void encryptWordFile(File file, String password) {try (POIFSFileSystem fs = new POIFSFileSystem();FileInputStream fis = new FileInputStream(file);XWPFDocument document = new XWPFDocument(fis)) {EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);Encryptor encryptor = info.getEncryptor();encryptor.confirmPassword(password);try (OutputStream os = encryptor.getDataStream(fs)) {document.write(os);}try (FileOutputStream fos = new FileOutputStream(file)) {fs.writeFilesystem(fos);}//System.out.println("Encrypted Word file: " + file.getAbsolutePath());} catch (org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException e) {//System.out.println("已加密");} catch (Exception e) {e.printStackTrace();}}/*** 方法描述:加密excel-xlsx** @param file     文件* @param password 密码* @author xú * @since 1.0.0   2024-08-27 05:10:51*/public static void encryptExcelXlsx(File file, String password) {try (POIFSFileSystem fs = new POIFSFileSystem();FileInputStream fis = new FileInputStream(file);XSSFWorkbook workbook = new XSSFWorkbook(fis)) {EncryptionInfo info = new EncryptionInfo(EncryptionMode.agile);Encryptor encryptor = info.getEncryptor();encryptor.confirmPassword(password);try (OutputStream os = encryptor.getDataStream(fs)) {workbook.write(os);}try (FileOutputStream fos = new FileOutputStream(file)) {fs.writeFilesystem(fos);}//System.out.println("Encrypted Excel file: " + file.getAbsolutePath());} catch (org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException e) {//System.out.println("已加密");} catch (Exception e) {e.printStackTrace();}}/*** 方法描述:加密excel-xls** @param file     文件* @param password 密码* @author xú * @since 1.0.0   2024-08-27 05:10:45*/public static void encryptExcelXls(File file, String password) {try (POIFSFileSystem fs = new POIFSFileSystem(); FileInputStream fis = new FileInputStream(file);HSSFWorkbook workbook = new HSSFWorkbook(fis)) {EncryptionInfo info = new EncryptionInfo(EncryptionMode.standard);StandardEncryptor encryptor = (StandardEncryptor) info.getEncryptor();encryptor.confirmPassword(password);try (OutputStream os = encryptor.getDataStream(fs)) {workbook.write(os);}try (FileOutputStream fos = new FileOutputStream(file)) {fs.writeFilesystem(fos);}System.out.println("Encrypted Excel file: " + file.getAbsolutePath());} catch (Exception e) {e.printStackTrace();}}/*** 方法描述:加密pdf文件** @param file     文件* @param password 密码* @author xú* @since 1.0.0   2024-08-27 04:46:05*/public static void encryptPdfFile(File file, String password) {try (PDDocument document = PDDocument.load(file)) {// Set the encryption optionsStandardProtectionPolicy policy = new StandardProtectionPolicy(password, password, new org.apache.pdfbox.pdmodel.encryption.AccessPermission());policy.setEncryptionKeyLength(128); // You can set the key length to 128 or 256 bitsdocument.protect(policy);document.save(file);//System.out.println("Encrypted PDF file: " + file.getAbsolutePath());} catch (org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException e) {//System.out.println("已加密");} catch (Exception e) {e.printStackTrace();}}
}

测试文档加密工具类

3、测试及测试结果展示:

 public static void main(String[] args) {String directoryPath = "D:\\桌面\\项目文档"; // 替换为你本地的路径String backupDirectoryPath = "D:\\桌面\\备份"; // 替换为你的备份路径String password = "aaaaa111112DDD";  // 密码设置try {Files.createDirectories(Paths.get(backupDirectoryPath));Files.walkFileTree(Paths.get(directoryPath), new SimpleFileVisitor<>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {String fileName = file.getFileName().toString().toLowerCase();if (fileName.endsWith(".docx") || fileName.endsWith(".xlsx") || fileName.endsWith(".pdf")) {Path backupFile = Paths.get(backupDirectoryPath, file.toString().substring(directoryPath.length()));Files.createDirectories(backupFile.getParent());Files.copy(file, backupFile, StandardCopyOption.REPLACE_EXISTING);try {if (fileName.endsWith(".docx")) {encryptWordFile(file.toFile(), password);} else if (fileName.endsWith(".xlsx")) {encryptExcelFile(file.toFile(), password);} else if (fileName.endsWith(".pdf")) {encryptPdfFile(file.toFile(), password);}}catch (Exception ex){ex.printStackTrace();}System.out.println("Processed file: " + file.toString());} else {System.out.println("Skipped file: " + file.toString());}return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {Path backupDir = Paths.get(backupDirectoryPath, dir.toString().substring(directoryPath.length()));Files.createDirectories(backupDir);System.out.println("Directory: " + dir.toString());return FileVisitResult.CONTINUE;}});} catch (IOException e) {e.printStackTrace();}}

4、 zip包加密工具类

package com.example.demo;import net.lingala.zip4j.ZipFile;
import net.lingala.zip4j.model.FileHeader;
import net.lingala.zip4j.model.ZipParameters;
import net.lingala.zip4j.model.enums.CompressionLevel;
import net.lingala.zip4j.model.enums.CompressionMethod;
import net.lingala.zip4j.model.enums.EncryptionMethod;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;/*** 类描述:zip包加密工具类** @author xú chūn chéng* @version 1.0.0* @since 1.0.0  2024-08-27 04:49:55*/
public class ZipEncryptionUtil {private ZipEncryptionUtil() {}/*** 方法描述:使用旧zip创建加密zip** @param oldZipFile 需要加密的zip包文件* @param password   密码* @author xú* @since 1.0.0   2024-08-27 04:49:50*/public static void createEncryptedZipWithOldZip(File oldZipFile, String password) {//创建新的加密zip文件String newZipFileName = oldZipFile.getParent() + File.separator + "encrypted_" + oldZipFile.getName();try (ZipFile newEncryptedZipFile = new ZipFile(newZipFileName, password.toCharArray())) {//设置加密的zip参数ZipParameters zipParameters = new ZipParameters();zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);zipParameters.setCompressionLevel(CompressionLevel.NORMAL);zipParameters.setEncryptFiles(true);zipParameters.setEncryptionMethod(EncryptionMethod.AES);// 将旧的zip文件添加到新的加密zip文件中newEncryptedZipFile.addFile(oldZipFile, zipParameters);} catch (IOException e) {throw new RuntimeException(e);}//System.out.println("Created encrypted ZIP file: " + newZipFileName);}/*** 方法描述:加密zip文件 (会把OLD压缩文件解压开  然后重新打包加密) 慎用* ( 这种加密方式存在问题  当文件内部多层级的时候无法正常加密 且中文乱码)** @param file     文件* @param password 密码* @author xú chūn chéng* @since 1.0.0   2024-08-27 04:48:46*/public static void encryptZipFile(File file, String password) {try {File tempDir;try (ZipFile zipFile = new ZipFile(file, password.toCharArray())) {// 设置压缩文件ZipParameters zipParameters = new ZipParameters();zipParameters.setCompressionMethod(CompressionMethod.DEFLATE);zipParameters.setCompressionLevel(CompressionLevel.NORMAL);zipParameters.setEncryptFiles(true);zipParameters.setEncryptionMethod(EncryptionMethod.AES);//将所有文件解压缩到临时目录tempDir = Files.createTempDirectory("zip4j").toFile();zipFile.extractAll(tempDir.getAbsolutePath());// 从zip中删除所有文件List<FileHeader> fileHeaders = zipFile.getFileHeaders();List<FileHeader> headersToRemove = new ArrayList<>(fileHeaders); // 将要删除的文件头收集到一个新列表中for (FileHeader fileHeader : headersToRemove) {zipFile.removeFile(fileHeader);}//使用加密重新打包文件for (File extractedFile : Objects.requireNonNull(tempDir.listFiles())) {zipFile.addFile(extractedFile, zipParameters);}}//清理临时目录for (File extractedFile : Objects.requireNonNull(tempDir.listFiles())) {extractedFile.delete();}tempDir.delete();//System.out.println("Encrypted ZIP file: " + file.getAbsolutePath());} catch (IOException e) {e.printStackTrace();}}
}

5、ZIP 方式1测试:

 public static void main(String[] args) {String directoryPath = "D:\\桌面\\新建文件夹\\已压缩_未归类"; // 替换为你本地的路径String backupDirectoryPath = "D:\\桌面\\备份"; // 替换为你的备份路径String password = "741841aaa333.";//密码 long maxSize = 1024L * 1024L * 1024L; // 1GBtry {Files.createDirectories(Paths.get(backupDirectoryPath));// 首先收集所有要处理的文件List<Path> filesToProcess = new ArrayList<>();Files.walkFileTree(Paths.get(directoryPath), new SimpleFileVisitor<>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {String fileName = file.getFileName().toString().toLowerCase();//由于超过1G的文件处理时间过长 所需对此文件大小进行限制 最大为1GBif (fileName.endsWith(".zip") && Files.size(file) <= maxSize) {filesToProcess.add(file);}return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {Path backupDir = Paths.get(backupDirectoryPath, dir.toString().substring(directoryPath.length()));Files.createDirectories(backupDir);return FileVisitResult.CONTINUE;}});// 然后处理收集到的文件int totalFiles = filesToProcess.size();for (int i = 0; i < totalFiles; i++) {Path file = filesToProcess.get(i);Path backupFile = Paths.get(backupDirectoryPath, file.toString().substring(directoryPath.length()));Files.createDirectories(backupFile.getParent());Files.copy(file, backupFile, StandardCopyOption.REPLACE_EXISTING);ZipEncryptionUtil.encryptZipFile(file.toFile(), password);// 记录进度System.out.printf("Processed file (%d/%d): %s%n", i + 1, totalFiles, file.toString());}} catch (IOException e) {e.printStackTrace();}}

6:zip2加密方式测试 :

需要创建一个新的 ZIP 文件,并将原有的 ZIP 文件(OLD 压缩文件)作为一个单独的文件放入新 ZIP 文件中,同时对新 ZIP 文件进行加密。

方法测试:

public static void main(String[] args) {String directoryPath = "D:\\桌面\\AAA"; // 替换为你本地的路径String backupDirectoryPath = "D:\\桌面\\备份"; // 替换为你的备份路径String password = "ssssssss.";long maxSize = 1024L * 1024L * 1024L; // 1GBtry {Files.createDirectories(Paths.get(backupDirectoryPath));// 首先收集所有要处理的文件List<Path> filesToProcess = new ArrayList<>();Files.walkFileTree(Paths.get(directoryPath), new SimpleFileVisitor<>() {@Overridepublic FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {String fileName = file.getFileName().toString().toLowerCase();if (fileName.endsWith(".zip") && Files.size(file) <= maxSize) {filesToProcess.add(file);}return FileVisitResult.CONTINUE;}@Overridepublic FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {Path backupDir = Paths.get(backupDirectoryPath, dir.toString().substring(directoryPath.length()));Files.createDirectories(backupDir);return FileVisitResult.CONTINUE;}});// 然后处理收集到的文件int totalFiles = filesToProcess.size();for (int i = 0; i < totalFiles; i++) {Path file = filesToProcess.get(i);Path backupFile = Paths.get(backupDirectoryPath, file.toString().substring(directoryPath.length()));Files.createDirectories(backupFile.getParent());Files.copy(file, backupFile, StandardCopyOption.REPLACE_EXISTING);ZipEncryptionUtil.createEncryptedZipWithOldZip(file.toFile(), password);// 记录进度System.out.printf("Processed file (%d/%d): %s%n", i + 1, totalFiles, file.toString());}} catch (IOException e) {e.printStackTrace();}}

这篇关于word、pdf、excel及zip加密(含示例效果及工具类)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113167

相关文章

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

防近视护眼台灯什么牌子好?五款防近视效果好的护眼台灯推荐

在家里,灯具是属于离不开的家具,每个大大小小的地方都需要的照亮,所以一盏好灯是必不可少的,每个发挥着作用。而护眼台灯就起了一个保护眼睛,预防近视的作用。可以保护我们在学习,阅读的时候提供一个合适的光线环境,保护我们的眼睛。防近视护眼台灯什么牌子好?那我们怎么选择一个优秀的护眼台灯也是很重要,才能起到最大的护眼效果。下面五款防近视效果好的护眼台灯推荐: 一:六个推荐防近视效果好的护眼台灯的

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

超强的截图工具:PixPin

你是否还在为寻找一款功能强大、操作简便的截图工具而烦恼?市面上那么多工具,常常让人无从选择。今天,想给大家安利一款神器——PixPin,一款真正解放双手的截图工具。 想象一下,你只需要按下快捷键就能轻松完成多种截图任务,还能快速编辑、标注甚至保存多种格式的图片。这款工具能满足这些需求吗? PixPin不仅支持全屏、窗口、区域截图等基础功能,它还可以进行延时截图,让你捕捉到每个关键画面。不仅如此

zeroclipboard 粘贴板的应用示例, 兼容 Chrome、IE等多浏览器

zeroclipboard单个复制按钮和多个复制按钮的实现方法 最近网站改版想让复制代码功能在多个浏览器上都可以实现,最近看网上不少说我们的代码复制功能不好用的,我们最近将会增加代码高亮等功能,希望大家多多支持我们 zeroclipboard是一个跨浏览器的库类 它利用 Flash 进行复制,所以只要浏览器装有 Flash 就可以运行,而且比 IE 的

C - Word Ladder题解

C - Word Ladder 题解 解题思路: 先输入两个字符串S 和t 然后在S和T中寻找有多少个字符不同的个数(也就是需要变换多少次) 开始替换时: tips: 字符串下标以0开始 我们定义两个变量a和b,用于记录当前遍历到的字符 首先是判断:如果这时a已经==b了,那么就跳过,不用管; 如果a大于b的话:那么我们就让s中的第i项替换成b,接着就直接输出S就行了。 这样

PDF 软件如何帮助您编辑、转换和保护文件。

如何找到最好的 PDF 编辑器。 无论您是在为您的企业寻找更高效的 PDF 解决方案,还是尝试组织和编辑主文档,PDF 编辑器都可以在一个地方提供您需要的所有工具。市面上有很多 PDF 编辑器 — 在决定哪个最适合您时,请考虑这些因素。 1. 确定您的 PDF 文档软件需求。 不同的 PDF 文档软件程序可以具有不同的功能,因此在决定哪个是最适合您的 PDF 软件之前,请花点时间评估您的

PR曲线——一个更敏感的性能评估工具

在不均衡数据集的情况下,精确率-召回率(Precision-Recall, PR)曲线是一种非常有用的工具,因为它提供了比传统的ROC曲线更准确的性能评估。以下是PR曲线在不均衡数据情况下的一些作用: 关注少数类:在不均衡数据集中,少数类的样本数量远少于多数类。PR曲线通过关注少数类(通常是正类)的性能来弥补这一点,因为它直接评估模型在识别正类方面的能力。 精确率与召回率的平衡:精确率(Pr