当前位置: 首页 > 工具软件 > PDFBox > 使用案例 >

使用PDFbox加密pdf文件

公西俊能
2023-12-01

使用PDFbox加密pdf文件的方法

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.

 类似资料: