如何在Android中使用iText加密PDF 运行代码出现SIGBUS崩溃如何解决
问题描述
需要为PDF文件添加密码保护,使用iText库实现该功能,已编写如下代码:
public void encryptPdf(String src, String dest) throws IOException, DocumentException { Security.insertProviderAt(new org.spongycastle.jce.provider.BouncyCastleProvider(), 1); PdfReader reader = new PdfReader(src); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); stamper.setEncryption(USER, OWNER, PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA); stamper.close(); reader.close(); }
运行时触发应用崩溃,错误日志如下:
Fatal signal 7 (SIGBUS), code 2 (BUS_ADRERR), fault addr 0xcdeae5c1 in tid 20493 (sdifa.pdfreader), pid 20493 (sdifa.pdfreader)
解决方案
该错误为Android环境下iText加密PDF的常见原生层内存访问异常,可按以下步骤修复:
- 移除手动注入加密Provider的代码:Android端使用iText 5.x版本进行PDF加密时,无需主动调用
Security.insertProviderAt注入BouncyCastleProvider,重复注入会触发原生层内存冲突,是本次崩溃的核心诱因。 - 规范密码参数格式:
setEncryption方法要求传入的用户密码、所有者密码必须为UTF-8编码的字节数组,若直接传入未编码的字符串或空对象,会触发非法内存访问。 - 补全异常场景的资源释放逻辑:原有代码仅在正常运行时释放资源,异常场景下资源泄漏会导致后续内存操作异常。
修复后代码示例
public void encryptPdf(String src, String dest) throws IOException, DocumentException { PdfReader reader = null; PdfStamper stamper = null; try { reader = new PdfReader(src); stamper = new PdfStamper(reader, new FileOutputStream(dest)); // 密码转换为UTF-8字节数组,可按需替换为实际使用的密码 byte[] USER_PWD = "user_password".getBytes(StandardCharsets.UTF_8); byte[] OWNER_PWD = "owner_password".getBytes(StandardCharsets.UTF_8); stamper.setEncryption(USER_PWD, OWNER_PWD, PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128 | PdfWriter.DO_NOT_ENCRYPT_METADATA); } finally { if (stamper != null) { stamper.close(); } if (reader != null) { reader.close(); } } }
额外校验项
- 确保源PDF路径
src有可读权限,输出路径dest有可写权限,输出路径父目录不存在时提前创建 - 若使用iText 7.x版本,加密API已调整,需使用
EncryptProperties类配置加密规则,不可直接沿用5.x版本API
内容的提问来源于stack exchange,提问作者Syed Irfan Hussaini
相关产品推荐
相关产品推荐

