PDFBox加密/锁定的PDF在“另存为”期间仍由Adobe Reader修改]]

问题描述 投票:1回答:1

我正在研究一个实现,其中我们的系统生成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属性:

Adobe properties

我正在研究一个实现,其中我们的系统生成PDF文件供用户下载。我们的流程和系统的关键是该PDF文件不应由用户或程序修改...

pdf encryption adobe pdfbox reader
1个回答
0
投票

即使您实际上不签署PDF文档,也可以尝试设置AcroForm

© www.soinside.com 2019 - 2024. All rights reserved.