猿问

如何正确加密合并的pdf文档

我对 pdfBox API 有疑问。我正在尝试使用以下代码加密合并的 pdfdocument:


这是合并/创建文档的功能


    public static void fillMultipleReportsInOne(List<report> reports) throws IOException {


        PDFMergerUtility PDFmerger = new PDFMergerUtility(); 

        PDDocument resultPDF = new PDDocument();


        for (report report : reports) {


            try 

            {

                PDDocument pdfDocument = PDDocument.load(new File(SRC + "test.pdf"));

                // get the document catalog

                PDAcroForm acroForm = pdfDocument.getDocumentCatalog().getAcroForm();


                // as there might not be an AcroForm entry a null check is necessary

                setFormFields(acroForm, report.getName(), report.getArea(), report.getOperatingActivities(), report.getVocationlaSchool(), report.getWeeklyTopics());

                // Save and close the filled out form.

                PDFmerger.appendDocument(resultPDF, pdfDocument);




        } catch (Exception e) {

            e.printStackTrace();

        }


    }



    encryptPDF(resultPDF, SRC + "merged.pdf");


}

这是加密的功能:


 public static PDDocument encryptPDF(PDDocument pddocumentToEncrypt, String SRC) {


        // Define the length of the encryption key.

        // Possible values are 40 or 128 (256 will be available in PDFBox 2.0).

        int keyLength = 128;


        AccessPermission ap = new AccessPermission();


        // Disable printing, everything else is allowed

        ap.setCanModifyAnnotations(false);

        ap.setCanFillInForm(false);

        ap.setCanModify(false);



        // Owner password (to open the file with all permissions) is "12345"

        // User password (to open the file but with restricted permissions, is empty here) 

        StandardProtectionPolicy spp = new StandardProtectionPolicy("12334", "", ap);

        spp.setEncryptionKeyLength(keyLength);

        spp.setPermissions(ap);


我的结果如下所示:


结果

动漫人物
浏览 232回答 1
1回答

FFIVE

打电话pddocumentToEncrypt.getDocumentCatalog().getAcroForm().refreshAppearances();为 2.0 版本修复了这个问题。setValue()当设置 /NeedAppearances 时,该版本不会在调用中设置外观(即表单值的视觉表示) (请参阅 参考资料PDTerminalField.applyChange())。/NeedAppearances 设置(如果为真)意味着查看应用程序应该创建外观,以便中间的处理应用程序不需要这样做;我怀疑其中一项或多项权限设置会阻止 Adobe Reader 在显示时对其进行更改。另一种解决方案是致电pdfDocument.getDocumentCatalog().getAcroForm().setNeedAppearances(false);在设置表单值之前。唯一未解之谜是为什么第一个值在合并文件中可见。
随时随地看视频慕课网APP

相关分类

Java
我要回答