You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java PDFBox移除PDF密码并返回字节数组时PDStream字节为空的解决方法

解决PDFBox移除PDF密码后PDStream转字节数组为空的问题

嘿,我看你在用PDFBox处理加密PDF时遇到了PDStream转字节数组为空的问题,咱们来拆解一下问题所在,然后给出正确的解决办法。

你当前代码的问题在于错误地使用了PDStream来获取解密后的PDF字节数据——PDStream是PDF文档中单个流对象的封装,直接新建一个空的PDStream自然不会包含任何文档内容,所以test2才会是空的。正确的做法应该是把移除安全设置后的整个PDDocument写入到输出流中,再从输出流提取字节数组。

下面是修正后的完整代码,我用了try-with-resources来自动关闭资源,避免内存泄漏:

// 用try-with-resources自动管理文档和流资源
try (PDDocument pddocument = PDDocument.load(new ByteArrayInputStream(Binary_PDF.getContentBytes()), sPDF_Password);
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
    
    // 设置移除所有安全限制
    pddocument.setAllSecurityToBeRemoved(true);
    
    // 将解密后的文档写入输出流
    pddocument.save(outputStream);
    
    // 获取解密后的字节数组
    byte[] decryptedBytes = outputStream.toByteArray();
    
    // 替换原有的Binary_PDF对象
    Binary_PDF = new emds.util.Base64Binary(decryptedBytes);
    
    // 这里可以验证decryptedBytes的内容,替代你原来的test1/test2
    System.out.println("解密后的字节数组长度:" + decryptedBytes.length);
} catch (IOException e) {
    // 处理异常,比如密码错误、文档损坏等情况
    e.printStackTrace();
}

关键说明:

  • 不要直接操作PDStream:它不是用来导出整个文档的工具,而是PDF内部流的抽象。
  • 用PDDocument.save()输出文档:这个方法会把整个处理后的PDF(包括解密后的内容)写入到指定的输出流中,这样得到的字节数组才是完整有效的解密PDF数据。
  • 资源管理:使用try-with-resources可以确保PDDocument和ByteArrayOutputStream自动关闭,避免资源泄漏。

这样修改后,你就能得到正确的解密PDF字节数组了,替代原来无效的PDStream操作。

内容的提问来源于stack exchange,提问作者Raphael

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 22:17:50