В моем случае возникла ошибка, потому что я дал имя исходного файла вместо имени класса.
Нам нужно предоставить имя класса, содержащее основной метод, интерпретатору.
Для определенных операций с зашифрованными документами iText (Sharp) требует, чтобы документ не просто был открыт с паролем пользователя, а вместо него с паролем владельца. Это соответствует определению этих паролей в спецификации PDF:
Должны ли дополнительные операции разрешаться в расшифрованном документе, зависит от того, какой пароль (если есть) был предоставлен при открытии и любые ограничения доступа, которые были указаны при создании документа:
- Открытие документа правильным паролем владельца должно позволить полному (владельцу) доступу к документу. Этот неограниченный доступ включает в себя возможность изменения паролей документа и прав доступа.
- Открытие документа правильным паролем пользователя пользователя (или открытие документа с использованием пароля по умолчанию) должно позволить дополнительный операции, которые должны выполняться в соответствии с правами доступа пользователя, указанными в словаре шифрования документа.
(раздел 7.6.3.1 в ISO 32000-1 )
blockquote>iText (Sharp) в настоящее время не проверяет подробно права доступа пользователя, указанные в словаре шифрования документа , но вместо этого всегда требуется пароль владельца для операций требующие определенных разрешений, и копирование целых страниц из документа окончательно является одним из них.
Было сказано, что разработчики iText (Sharp) очень хорошо знают (из-за многих таких вопросов)
- , что пользователи iText (Sharp) могут иметь право выполнять такие операции, даже без пароля владельца на счету ранее упомянутые права доступа пользователей, указанные в словаре шифрования документа
- , содержат множество файлов PDF, к которым их соответствующие владельцы применяли пароль владельца (чтобы предотвратить неправильное использование другими), а затем забыли (или с помощью случайно сгенерированного никогда не знали, с чего начать), и
- , что iText (Sharp) (являющийся открытым исходным кодом) может быть легко исправлен кем угодно, чтобы не уважать различия между пользователем и пароль владельца.
Чтобы позволить пользователям делать то, на что они имеют право, и предотвращать распространение исправленных копий библиотеки, iText (Sharp) содержит переопределение для этого теста в файле
PdfReader
class:/** * The iText developers are not responsible if you decide to change the * value of this static parameter. * @since 5.0.2 */ public static bool unethicalreading = false;
Таким образом, установив
PdfReader.unethicalreading = true;
, вы глобально переопределите этот механизм проверки разрешений.
Пожалуйста, соблюдайте права авторов PDF и используйте это переопределение, если вы действительно имеете право выполнить рассматриваемые операции.
Я применил это обходное решение, и оно работает:
private void fixIssue(PdfReader pdfReader) throws Exception {
Field f = pdfReader.getClass().getDeclaredField("ownerPasswordUsed");
f.setAccessible(true);
f.setBoolean(pdfReader, true);
}