Передача пароля в обработчик безопасности pdf

В настоящее время я работаю над проектом, в котором pdf-файлы могут быть расшифрованы после успешного вызова API, который возвращает пароль. Я просмотрел SO и pdftron SDK, но не могу найти окончательного решения о том, как вставить этот пароль в обработчик безопасности.

Что я пробовал:

Ни один из методов GetSecurityHandler() не обрабатывает ввод пароля:

 SecurityHandler handler = m_PdfDocument.GetSecurityHandler();

Принимает строку пароля, но выдает ошибку:

m_PdfDocument.InitStdSecurityHandler(pwd);

ошибка: Сообщение: Не стандартный обработчик безопасности. Пользовательский фильтр необходимо зарегистрировать.

Судя по сообщению, я предположил, что вместо этого мне нужно m_PdfDocument.InitSecurityHandler(), но этот метод не принимает строку, а только int.

Кто-нибудь может толкнуть меня на правильный путь?


person Silvio Langereis    schedule 23.03.2017    source источник
comment
Можете ли вы открыть PDF-файл в программе чтения PDF-файлов, например Foxit/Adobe? Это происходит для любого файла, защищенного паролем, или только для некоторых? Вы зашифровали файл? Как?   -  person Ryan    schedule 23.03.2017
comment
В другой читалке пишет, что файл зашифрован. Файлы, которые нам нужно открыть, являются зашифрованными образовательными файлами. Они созданы другой фирмой, с которой мы работаем, они предоставляют PDF-файлы с защитой DRM учащимся с ограниченными возможностями обучения, наше программное обеспечение tts сможет расшифровать файл после успешного апикала. В случае успешного вызова возвращается пароль. Все в порядке, осталось только ввести пароль в pdf для расшифровки. Пользователь не может знать пароль, мне нужно передать пароль программно.   -  person Silvio Langereis    schedule 24.03.2017
comment
Кроме того: само шифрование разработано с помощью pdftron, но передано на аутсорсинг фирме, с которой мы работаем. После некоторых исследований мы пришли к выводу, что нам нужно инициализировать собственный обработчик безопасности с помощью идентификатора (целое число, которое вам нужно передать), но, поскольку они не запрограммировали его, они также понятия не имеют...   -  person Silvio Langereis    schedule 24.03.2017
comment
Вопрос в том, является ли файл стандартным зашифрованным или пользовательским. Вы можете отправить один из файлов в службу поддержки на pdftron или опубликовать здесь вместе с паролем. Если нет, в Windows PDFNet SDK есть инструмент под названием COSEdit. Вы можете открыть файл в нем (пропустить ввод пароля), проверить ключ /trailer/Encrypt/Filter и опубликовать здесь.   -  person Ryan    schedule 24.03.2017
comment
Это пользовательское шифрование. Я не могу их открыть с помощью COSEdit, сразу выдает ошибку. Я отправлю файл с паролем в службу поддержки pdftron.   -  person Silvio Langereis    schedule 24.03.2017


Ответы (2)


Спасибо за отправку файла. Этот файл зашифрован с использованием пользовательского шифрования. Ваш DRM. Ни одна программа для чтения PDF не может открыть файл, кроме вашей собственной программы для чтения PDF.

Чтобы открыть PDF-файл с помощью PDFNet, вам нужно выяснить, как файл был зашифрован в первую очередь, и, по сути, сделать наоборот. Я предполагаю, что другая команда, которая выполняла шифрование, также расшифровывала, по крайней мере, в целях тестирования?

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

Но для других, если бы PDF был зашифрован с помощью фильтра под названием «Фродо», то это было бы

CreateDelegate frodo_del = new CreateDelegate(FrodoSecurityHandler.Create);
SecurityManagerSingleton.Instance().RegisterSecurityHandler("Frodo", new SecurityDescriptor("Frodo Security", frodo_del));
person Ryan    schedule 24.03.2017

Согласно этой странице, GetSecurityHandler() используется после инициализации другого обработчика. , поэтому, поскольку InitSecurityHandler() принимает целое число, вы можете сделать это

    string password = "9quali52ty3";

    // Convert the string into a byte[].
    byte[] asciiBytes = Encoding.ASCII.GetBytes(password);
    string compiledBytes = System.Text.Encoding.ASCII.GetString(asciiBytes);
    int convertedBytes = int.Parse(compiledBytes);
    m_PdfDocument.InitSecurityHandler(convertedBytes);
    m_PdfDocument.GetSecurityHandler();

Хорошее практическое правило для программирования: всегда есть способ перейти от одного типа данных к другому. Кредит: @Brig Lamoreaux, @Zanoni и @Brandon на следующих страницах.
Бриг Zanoni Брэндон

person Pacific Bird    schedule 23.03.2017