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
相关产品推荐
相关产品推荐

