2012-06-05 3 views
8

Я пытаюсь создать простую процедуру подписи документов PDF, используя PHP, openssl и фреймворк Zend (для распаковки/обработки pdf).Цифровая подпись PDF с использованием PHP, Zend и openssl

Я нашел this, но это просто не сработает, Zend не может открыть какие-либо PDF-файлы, даже собственный тест для Zend, и Zend не сообщит почему, только то, что он «не может».

Я уверен, что смогу эффективно создавать ключи/сертификаты, поскольку это хорошо документировано, но есть ли твердый подход к прикреплению сгенерированного сертификата к PDF-файлу, поскольку вышеуказанное расширение Zend предлагает это когда-то?

function DigiSignPDF ($pdf_sign_request) { 
    if (get_magic_quotes_gpc()) { 
     $new_pdf = stripslashes($pdf_sign_request['raw_pdf']); 
    } else { 
     $new_pdf = $pdf_sign_request['raw_pdf']; 
    } 
    $test_pdf = stripslashes(file_get_contents('path/Some.pdf')); 
    $test_pdf2 = ('path/Some.pdf'); 
    $pdf = Zend_Pdf::load($new_pdf2); 
    //below is the signing code, from another library, it works as long as Zend_Pdf works 
    $certificate = file_get_contents('path/certificate.p12'); 
    $certificatePassword = 'test123'; 

    if (empty($certificate)) { 
     throw new Zend_Pdf_Exception('Cannot retrieve/generate the certificate.'); 
    } 
    $pdf->attachDigitalCertificate($certificate,$certificatePassword); 
    $eSig_pdf = $pdf->render(); 
    file_put_contents('path/signed_pdf.pdf', $eSig_pdf); 
} 

Edit, добавив код: выше работает только если я использую «test_pdf2» в качестве входных данных для Zend_PDF. Он распознает сертификат как двоичный, без проблем, но мне нужно иметь возможность передавать PDF, не записывая его на диск.

+0

Итак, возможно, я подошел ближе. Что происходит, PHP настаивает на вставке в файл слэшей, новой строки, символов возврата каретки, независимо от того, загружаю ли я его или читаю с локального диска с помощью file_get_contents. Я знаю и пробовал stripslashes, объявляя magic_quotes и т. Д. Я могу только заставить его работать, если у меня есть Zend_Pdf, читайте файл напрямую, что не будет работать для меня, потому что мы не будем писать какие-либо из этих файлов на диск, когда-либо. Есть ли все-таки, чтобы убедить PHP в том, что он не должен искажать данные, к которым он обращается? – jbrain

+0

Можем ли мы увидеть ваш код, который вы используете для обработки PDF? Измените это на свой вопрос. – halfer

+0

Решил этот, потому что я передавал содержимое Zend_Pdf в виде строки, я должен был использовать Zend_Pdf :: parse ($ new_pdf) ;, как это, скорее всего, говорится в руководстве. (oops) – jbrain

ответ

8

TCPDF поддерживает signing из pdf-файлов. Возможно, вы найдете что-то полезное в исходном коде.

+0

Я столкнулся с этой библиотекой, к сожалению, мы не сможем использовать внешний код (кроме существующей рамки zend). Хорошее предложение. – jbrain

+2

@ user1437888 - можете ли вы изменить свой вопрос, чтобы указать это условие? Если вы можете дать некоторое представление о том, почему это так, тем лучше - это может помочь в ответе. – halfer

0

Добавление моего решения в качестве ответа, в соответствии с советом для халфера. Решил этот вопрос, потому что я передавал содержимое Zend_Pdf в виде строки, я должен был использовать Zend_Pdf :: parse ($ new_pdf) ;, поскольку это, скорее всего, говорит в руководстве. (oops)

Далее; Я решил почти все мои проблемы с цифровой подписью PDF-файлов различных версий и формировать составляющие, перейдя в TCPDF, как предлагают некоторые из статей. Аналогичное предостережение было встречено TCPDF, но при использовании строк убедитесь, что вы используете «writeHTMLCell» TCPDF вместо «writeHTML». И наблюдайте за «magic_quotes» PHPs, странные пробелы, кодирование и гоблины.

+0

Этот [пользователь] (https://stackoverflow.com/users/8537628/loic-angora) спрашивает: * Могу ли я получить функцию "attachDigitalCertificate()". Я пытаюсь подписать цифровой PDF с zendpdf, и у меня есть некоторые проблемы. * – GhostCat

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