2013-11-09 2 views
2

Я использую PDFBox для проверки PDF-документа и одного из утверждений о том, является ли документ PDF пригодным для печати или нет.PDFBox не распознает, что pdf не подлежит печати

Я использую следующий код для выполнения этой операции:

PDDocument document = PDDocument.load("<path_to_pdf_file>"); 
System.out.println(document.getCurrentAccessPermission().canPrint()); 

но это возвращает меня верно, хотя при открытии PDF, она показывает значок печати отключен.

+0

Просьба ФПВ в вопрос. В противном случае это было бы чистой догадкой. – mkl

+0

Я посмотрю файл в понедельник в офисе. – mkl

ответ

3

Права доступа интегрированы в документ с помощью шифрования.

Даже PDF-документы, которые не запрашивают пароль при открытии в Acrobat Reader, могут быть зашифрованы, они по существу зашифровываются с использованием пароля по умолчанию. Это относится к вашему PDF-файлу.

PDFBox определяет разрешения зашифрованного PDF только при его расшифровке, а не при загрузке PDDocument. Таким образом, вы должны попробовать и расшифровать документ, прежде чем проверять его свойства, если он зашифрован.

В вашем случае:

PDDocument document = PDDocument.load("<path_to_pdf_file>"); 
if (document.isEncrypted()) 
{ 
    document.decrypt(""); 
} 
System.out.println(document.getCurrentAccessPermission().canPrint()); 

пустая строка "" представляет пароль по умолчанию. Если файл зашифрован с использованием другого пароля, вы получите здесь исключение. Таким образом, поймайте соответственно.

PS: Если вы не знаете, все пароли в вопросе, вы все равно можете использовать PDFBox для проверки прав доступа, но вы должны работать на более низком уровне:

PDDocument document = PDDocument.load("<path_to_pdf_file>"); 
if (document.isEncrypted()) 
{ 
    final int PRINT_BIT = 3; 
    PDEncryptionDictionary encryptionDictionary = document.getEncryptionDictionary(); 
    int perms = encryptionDictionary.getPermissions(); 
    boolean printAllowed = (perms & (1 << (PRINT_BIT-1))) != 0; 
    System.out.println("Document encrypted; printing allowed?" + printAllowed); 
} 
else 
{ 
    System.out.println("Document not encrypted; printing allowed? true"); 
} 
+0

Спасибо. Решение работает, но, как вы сказали, если пароль не пуст, у нас есть проблема. Любое предложение расшифровать такие файлы, как мое требование, - это получать pdf-файлы и запускать проверки на нем. – Krishnendu

+0

@ Krishnendu Я добавил альтернативный подход к моему ответу, который не требует расшифровки документов. – mkl

Смежные вопросы