PDFBox возвращает isEncrypted true, даже если я могу открыть файл

Я использую PDFBox, чтобы определить, защищен ли файл PDF паролем или нет. это мой код:

boolean isProtected = pdfDocument.isEncrypted();

Мои свойства файла в Scenenshot. Здесь я получаю isProtected= true даже я могу открыть его без пароля.

Примечание. В этом файле есть Пароль для открытия документа: Нет и пароль для доступа: Да.

нажмите здесь, чтобы посмотреть файл

1 ответ

Решение

Ваш PDF имеет пустой пароль пользователя и непустой пароль владельца. И да, это зашифровано. Это делается для того, чтобы люди не делали определенные вещи, например, копирование контента.

Это не настоящая безопасность; программное обеспечение зрителя несет ответственность за то, чтобы "запрещенные" операции не допускались.

Вы можете найти более длинное (и немного забавное) объяснение здесь.

Чтобы увидеть права доступа к документу, используйте PDDocument.getCurrentAccessPermission(),

В версии 2.0. * Пользователь сможет просматривать файл, если этот вызов завершится успешно:

PDDocument doc = PDDocument.load(file);

Если InvalidPasswordException выбрасывается, значит, требуется не пустой пароль.

Я публикую этот ответ, потому что в другом месте в Stack Overflow и в Интернете вы можете увидеть предлагаемый способ проверки защищенного паролем PDF в PDFBox - использовать PDDocument#isEncrypted(), Проблема, которую мы обнаружили, заключается в том, что некоторые PDF-файлы, которые не запрашивают пароль, все еще помечаются как зашифрованные. Посмотрите принятый ответ для одного объяснения, почему это происходит, но в любом случае мы использовали следующий шаблон в качестве обходного пути:

boolean isPDFReadable(byte[] fileContent) {
    PDDocument doc = null;
    try {
        doc = PDDocument.load(fileContent);
        doc.getPages();  // perhaps not necessary
        return true;
    }
    catch (InvalidPasswordException invalidPasswordException) {
        LOGGER.error("Unable to read password protected PDF.", invalidPasswordException);
    }
    catch (IOException io) {
        LOGGER.error("An error occurred while reading a PDF attachment during account submission.", io);
    }
    finally {
        if (!Objects.isNull(doc)) {
            try {
                doc.close();
                return true;
            }
            catch (IOException io) {
                LOGGER.error("An error occurred while closing a PDF attachment ", io);
            }
        }
    }

    return false;
}

Если звонок PDDocument#getPages() если это произойдет, то это также должно означать, что открытие PDF-файла с помощью двойного щелчка или браузера без пароля должно быть возможным.

Другие вопросы по тегам