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-файла с помощью двойного щелчка или браузера без пароля должно быть возможным.