1.引入依赖
<!-- pdfBox加密 -->
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.1</version>
</dependency>
2.加密解密
public class PdfBoxUtil {
/**
* pdf 文件加密
* @param
*/
public static byte[] pdfEncryption(MultipartFile file,String pdfKey) throws IOException {
// 加载文件
PDDocument document = PDDocument.load(file.getBytes());
// 创建访问权限对象
AccessPermission permissions = new AccessPermission();
// 创建StandardProtectionPolicy对象
StandardProtectionPolicy spp = new StandardProtectionPolicy(null, pdfKey, permissions);
// 设置加密密钥的长度
spp.setEncryptionKeyLength(256);
// 设置权限
spp.setPermissions(permissions);
// 保护文档
document.protect(spp);
// 转成文件流
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.save(baos);
byte[] pdfBytes = baos.toByteArray();
document.close();
return pdfBytes;
}
/**
* pdf 文件解密
* @param
*/
public static byte[] pdfDecode(byte[] file,String pdfKey) throws IOException {
PDDocument document = PDDocument.load(file,pdfKey);
document.setAllSecurityToBeRemoved(true);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.save(baos);
byte[] pdfBytes = baos.toByteArray();
document.close();
return pdfBytes;
}
}
1.关于用户密码(user password)和所有者密码(owner password)。
用户密码是打开pdf时要输入的密码,所有者密码是赋权限时的密码(修改,复制,打印等)。本例只设置了用户密码,如果设置两个密码的时候,任意一个密码都是可以打开文件的。
2.关于文件保存的问题:查找了很多案例都是保存到本地的例子,如果要进行传输就要转换文件。如下:
ByteArrayOutputStream baos = new ByteArrayOutputStream();
document.save(baos);
byte[] pdfBytes = baos.toByteArray();
3.使用Spire.PDF的方法与之类似,但是转换成byte[]类型的时候加密效果没有了。没搞懂为什么!
链接: PDFbOX 文件加密.
链接: Spire.PDF for java.