1、我们的需求需要对pdf加水印,其中有加密的和未加密的,
操作过程中发现 有的虽然加密了 但是符合PDFReader的五种加密算法,就可以成功破解加水印,还有一些就会抛出一些异常
第一种报错:com.itextpdf.text.exceptions.InvalidPdfException: Unknown encryption type R=6
这种是加密算法无法破解
还有些就是文件内容或者格式有问题
第二种报错:com.itextpdf.text.exceptions.InvalidPdfException: Rebuild failed: trailer not found.; Original message: Dictionary key 0 is not a name. at file pointer 589754 fileWrapper.notLike("file_title","Heavy Metals.pdf"); //PDF header signature not found
第三 种报错:com.itextpdf.text.exceptions.InvalidPdfException: Rebuild failed: '>' not expected at file pointer 454159; Original message: '>' not expected at file pointer 454159
第四种报错:java.io.EOFException: null
第五种报错:
com.itextpdf.text.exceptions.InvalidPdfException: Rebuild failed: Dictionary key 1 is not a name. at file pointer 993774; Original message: Dictionary key 1 is not a name. at file pointer 993774
除了第一种提示加密失败 其他我们都抛出加水印异常;
同时需求要求对加水印的pdf需要加密控制权限,不可复制,不可编辑,不可…… 但是可以打印
一开始收到的答案通篇都是
得到的效果
但是发现这样的文件始终都有copy的权限,仔细看了官网也没有确切的解释
官网地址:Overview (iText 5.5.13 API) (itextpdf.com)
这个True和False的区别只是一种枚举默认值的区分,通过另外一位博主 userpassword和ownerpassword的演示,才发现这个权限设置对我来说太多了,只需要一种即可
//只保留打印权限 其他权限不放开
stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128);
其他的权限不需要就不写,
//只保留打印权限 其他权限不放开
stamper.setEncryption(null, ownerPassword, PdfWriter.ALLOW_PRINTING, PdfWriter.ENCRYPTION_AES_128); 也可以用 true或者fasle来替换,
true:没有“复制功能的内容复制“权限
false: 有“复制功能的内容复制“权限
如果都不写,默认是权限都放开 不做控制,所以必须有一个权限,刚好我们放开了打印权限 完美实现了功能 ,
记住这个问题