Как правильно зашифровать объединенный PDF-документ - PullRequest
0 голосов
/ 25 февраля 2019

У меня проблема с pdfBox API.Я пытаюсь зашифровать объединенный документ PDF с помощью следующего кода:

Это функция для объединения / создания документа

    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);
        try {
            pddocumentToEncrypt.protect(spp);
            pddocumentToEncrypt.save(SRC);
            pddocumentToEncrypt.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return pddocumentToEncrypt;
    }

И, наконец, вызов функции со всеми образцами данных

report report1 = new report("TestUser1", "P&T", "operatingActivities", "weeklyTopics","vocationalSchool");
        report report2 = new report("TestUser2", "P&T2", "operatingActivities2", "weeklyTopics2","vocationalSchool2");
        report report3 = new report("TestUser3", "P&T3", "operatingActivities3", "weeklyTopics3","vocationalSchool3");
        report report4 = new report("TestUser4", "P&T4", "operatingActivities4", "weeklyTopics4","vocationalSchool4");

        List<report> reports = new ArrayList<>();
        reports.add(report1);
        reports.add(report2);
        reports.add(report3);
        reports.add(report4);

        fillMultipleReportsInOne(reports);

Мой результат выглядит следующим образом:

ИТОГО

enter image description here

Только первое поле заполняется данными, когда все поля должны иметь Это определенно проблема шифрования, потому что когда я удаляю строку document.protect (), данные заполняются правильно,Я также попробовал функцию acroForm.flatten () -> безуспешно ...

Может быть, у кого-то была такая же проблема и она готова помочь :) Заранее спасибо - Алекс

Вот и всефайл вставлен в pastebin: https://pastebin.com/L9auaTGH

С строкой кода

pddocumentToEncrypt.getDocumentCatalog().getAcroForm().refreshAppearances();

внутри моей функции шифрования это сработало

1 Ответ

0 голосов
/ 26 февраля 2019

Вызов

pddocumentToEncrypt.getDocumentCatalog().getAcroForm().refreshAppearances();

исправляет это для версии 2.0.Эта версия не устанавливает внешний вид (т. Е. Визуальное представление значения формы) в вызове setValue(), если задано / NeedAppearances (см. PDTerminalField.applyChange()).Параметр / NeedAppearances (при значении true) означает, что приложение просмотра должно создавать внешний вид, чтобы промежуточные приложения обработки не нуждались в этом;Я подозреваю, что один или несколько параметров разрешений не позволяют Adobe Reader изменять его при отображении.

Другим решением будет вызов

pdfDocument.getDocumentCatalog().getAcroForm().setNeedAppearances(false);

перед установкой значений формы.

Единственная неразгаданная загадка - почему первое значение было видно в объединенном файле.

...