Расшифровать зашифрованный PDF для загрузки в FPDI - PullRequest
1 голос
/ 08 января 2020

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

Мы наткнулись на некоторые зашифрованные PDF сейчас. Вы можете открыть эти PDF-файлы в любом PDF Viewer и Browser правильно. Но FPDI не поддерживает загрузку зашифрованных PDF, наш Код останавливается с ошибкой:

Этот документ PDF зашифрован и не может быть обработан с помощью FPDI

Я хочу дешифруйте те PDF-файлы, которые доступны для просмотра без ввода пароля, перед их обработкой. На мой взгляд, есть два пути:

  1. Расшифровка PDF с помощью класса PHP или чего-либо еще, что там есть
  2. Печать PDF внутри моего скрипта с драйвером принтера в PDF

Что ты думаешь? Есть ли лучшие идеи там? Я буду признателен! Спасибо.

1 Ответ

1 голос
/ 09 января 2020

С SetaPDF-Core можно пройти аутентификацию в зашифрованном / защищенном PDF-документе:

$document = SetaPDF_Core_Document::loadByFilename('encrypted.pdf');

Чтобы проверить, зашифрован ли документ, вы можете просто проверить его на безопасность. обработчик:

$isEncrypted = $document->hasSecHandler();

В зависимости от этой информации вы можете получить доступ к обработчику безопасности:

if ($isEncrypted) {
    // get the security handler
    $secHandler = $document->getSecHandler();

    // authenticate with a password without knowing if it is the owner or user password:
    if ($secHandler->auth('a secret password')) {
        echo 'authenticated as ' . $secHandler->getAuthMode();
    } else {
        echo 'authentication failed - neither user nor owner password did match.';
    }

    // authenticate with the user password:
    if ($secHandler->authByUserPassword('a secret password')) {
        echo 'authenticated as user';
    } else {
        echo 'authentication failed with the user password.';
    }

    // authenticate with the owner password:
    if ($secHandler->authByOwnerPassword('a secret password')) {
        echo 'authenticated as owner';
    } else {
        echo 'authentication failed with the owner password.';
    }
}

(Это также возможно с помощью закрытого ключа и сертификата, если документ зашифрован с помощью его ключ publi c - для получения дополнительной информации см. здесь )

Если вы аутентифицированы как владелец, вы можете удалить обработчик securtiy из документа:

if ($secHandler->getAuthMode() === SetaPDF_Core_SecHandler::OWNER) {
    $document->setSecHandler(null);

    $writer = new SetaPDF_Core_Writer_File('not-encrypted.pdf');
    $document->setWriter($writer);
    $document->save()->finish();
}
...