我正在研究一个实现,其中我们的系统生成PDF文件供用户下载。我们的流程和系统的关键在于,该PDF文件不应由用户或用户计算机上的程序进行修改(至少,并非没有恶意),因为该文件可以稍后上传至系统中,通过比较其哈希值,确保文件处于其原始状态。
我们认为,我们首先要禁用所有权限(CanModify,CanAssembleDocument等),然后使用所有者的密码对文档进行加密,从而实现了这一目标。这阻止了我们有权访问的所有读者对文件的修改。现在事实证明,我们的一位用户在Acrobat Reader中打开文件后立即修改了PDF,并将文档另存为新的pdf文件。我们无法使用相同的阅读器版本(2015.006.30497)复制此内容,但他每次都可以。
对PDF文档签名的替代方法不是我们的选择,至少不能使用PKI或用户在阅读器中可以看到的任何可见签名。如果有某种不可见的签名选项,那会很好,但我不知道如何。
下面用于锁定PDF的代码。出于测试目的,我们禁用了所有权限,但无济于事。我们正在使用PDFBox 2.0.11。
任何摘要,都有哪些选项可以更好地锁定文件以供修改?
public static byte[] SealFile(byte[] pdfFile, String password) throws IOException { PDDocument doc =PDDocument.load(pdfFile); ByteArrayOutputStream bos= new ByteArrayOutputStream(); byte[] returnvalue =null; int keyLength = 256; AccessPermission ap = new AccessPermission(); //Disable all ap.setCanModifyAnnotations(false); ap.setCanAssembleDocument(false); . ap.setCanFillInForm(false); ap.setCanModify(false); ap.setCanExtractContent(false); ap.setCanExtractForAccessibility(false); ap.setCanPrint(false); //The user password is empty ("") so user can read without password. The admin password is // set to lock/encrypt the document. StandardProtectionPolicy spp = new StandardProtectionPolicy(password, "", ap); spp.setEncryptionKeyLength(keyLength); spp.setPermissions(ap); doc.protect(spp); doc.save(bos); doc.close(); bos.flush(); return bos.toByteArray(); }
这将产生Adobe属性:
我正在研究一个实现,其中我们的系统生成PDF文件供用户下载。我们的流程和系统的关键是该PDF文件不应由用户或程序修改...
即使您实际上不签署PDF文档,也可以尝试设置AcroForm