Apache PDFBox - не удается расшифровать PDF

У меня проблема с расшифровкой PDF-документа с помощью Apache PdfBox (v1.8.2) lib. Шифрование работает, но расшифровка с тем же паролем вызывает исключение. (Java 1.6)

package com.test;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.encryption.AccessPermission;
import org.apache.pdfbox.pdmodel.encryption.StandardDecryptionMaterial;
import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;

public class PdfEncDecTest {

    static String pdfPath = "G:\\files\\filed5b3.pdf";
    public final static String PDF_OWNER_PASSWORD = "cd1j";
    public final static String PDF_USER_PASSWORD = "";  

    public static void main(String[] args) throws Exception {

        PDDocument document = PDDocument.load(pdfPath);
        AccessPermission ap = new AccessPermission();
        ap.setCanPrint(true);
        ap.setCanExtractContent(false);
        ap.setCanExtractForAccessibility(false);
        StandardProtectionPolicy spp = new StandardProtectionPolicy(PDF_OWNER_PASSWORD, PDF_USER_PASSWORD, ap);
        document.protect(spp);
        document.save(pdfPath+".pdf");
        document.close();

        PDDocument doc = PDDocument.load(pdfPath+".pdf");
        if(doc.isEncrypted()) {
            StandardDecryptionMaterial sdm = new StandardDecryptionMaterial(PDF_OWNER_PASSWORD);
            doc.openProtection(sdm); // org.apache.pdfbox.exceptions.CryptographyException: Error: The supplied password does not match either the owner or user password in the document.
            doc.decrypt(PDF_OWNER_PASSWORD); // the same like above
        }
        doc.close();
    }

}

Я не знаю, что не так. С версией 1.8.7 я получаю то же исключение. Я разместил полный код выше.

Exception in thread "main" org.apache.pdfbox.exceptions.CryptographyException: Error: The supplied password does not match either the owner or user password in the document.
    at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.prepareForDecryption(StandardSecurityHandler.java:265)
    at org.apache.pdfbox.pdmodel.encryption.StandardSecurityHandler.decryptDocument(StandardSecurityHandler.java:156)
    at org.apache.pdfbox.pdmodel.PDDocument.openProtection(PDDocument.java:1595)
    at org.apache.pdfbox.pdmodel.PDDocument.decrypt(PDDocument.java:942)
    at com.test.PdfEncDecTest.main(PdfEncDecTest.java:29)

Я поместил образец проекта в github: https://github.com/marioosh-net/pdfbox


person marioosh    schedule 10.10.2014    source источник
comment
Повторите попытку с текущей версией (1.8.7). Если по-прежнему не работает, укажите исключение в свой вопрос.   -  person Tilman Hausherr    schedule 10.10.2014
comment
у меня такое же исключение с версией 1.8.7 ...   -  person marioosh    schedule 10.10.2014


Ответы (2)


Вам нужен пароль пользователя.

    if (doc.isEncrypted())
    {
        StandardDecryptionMaterial sdm = new StandardDecryptionMaterial(PDF_USER_PASSWORD);
        doc.openProtection(sdm);
        // don't call decrypt() here
    }

это работает, даже если пароль пользователя не равен нулю. Пароль пользователя - это то, что обычный человек считает шифрованием, пароль владельца - это шифрование прав безопасности.

изменить: извините, мой ответ неверен, хотя это было полезно. Вы можете открыть PDF-файл с паролем пользователя (вы можете получить ограниченные права) или с паролем владельца (вы получите полные права). Возможно, произошла ошибка с сопоставлением пароля владельца с 40-битными ключами (по умолчанию). Эта ошибка в настоящее время изучается, см. PDFBOX-2456 и выполните поиск по запросу "MD5" .

person Tilman Hausherr    schedule 10.10.2014
comment
мне нужно установить ТОЛЬКО права безопасности для pdf, пароль пользователя должен быть пустым - person marioosh; 10.10.2014
comment
даже в этом случае ваш код по-прежнему неверен, ваш файл зашифрован пользователем с пустым паролем, поэтому вам нужно передать его, а не пароль владельца в это время. - person Tilman Hausherr; 10.10.2014
comment
Хммм ... Вы правы! Я это проверил. Большое большое спасибо! - person marioosh; 10.10.2014

Я протестировал ваш код, и он мне подходит.

Я использую

<dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>pdfbox</artifactId>
            <version>1.8.7</version>
</dependency>
person Ankur Singhal    schedule 10.10.2014
comment
Я поместил образец проекта в github: https://github.com/marioosh-net/pdfbox Можете проверить. У меня не работает :( - person marioosh; 10.10.2014