12 Stimmen

Digitales Signieren einer PDF-Datei mit PHP, Zend und openssl

Ich versuche, eine einfache PDF-Dokument-Signatur-Routine zu erstellen, mit PHP, Openssl und das Zend-Framework (für pdf redering/handling).

Ich habe gefunden diese aber es funktioniert einfach nicht, Zend ist nicht in der Lage, pdf-Dateien zu öffnen, nicht einmal Zends eigene Test-PDF-Datei, und Zend meldet nicht, warum, sondern nur, dass es "nicht kann".

Ich bin mir ziemlich sicher, dass ich in der Lage wäre, die Schlüssel/Zertifikate effektiv zu erstellen, da dies gut dokumentiert ist, aber gibt es einen soliden Ansatz, um das generierte Zertifikat an die PDF-Datei anzuhängen, wie es die obige Zend-Erweiterung vorschlägt, die es einmal tat?

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);
}

Bearbeiten, Code hinzufügen: Das obige funktioniert nur, wenn ich 'test_pdf2' als Eingabe für Zend_Pdf verwende. Es erkennt das Zertifikat als Binärdatei ohne Probleme, aber ich muss in der Lage sein, das PDF zu übergeben, ohne es jemals auf die Festplatte zu schreiben.

11voto

Oliver Punkte 2834

TCPDF unterstützt Unterzeichnung von pdf-Dateien. Vielleicht finden Sie etwas Nützliches im Quellcode.

1voto

jbrain Punkte 561

Ich füge meine Lösung als Antwort hinzu, gemäß dem Rat von Halfer: Gelöst, weil ich den Inhalt an Zend_Pdf als String übergeben habe, ich hätte Zend_Pdf::parse($new_pdf); verwenden sollen, wie es sehr wahrscheinlich im Handbuch steht. (oops)

Außerdem habe ich so ziemlich ALLE meine Probleme mit dem digitalen Signieren von PDFs verschiedener Versionen und Formate gelöst, indem ich auf TCPDF umgestiegen bin, wie in einigen der Artikel hier vorgeschlagen. Ein ähnlicher Vorbehalt gilt für TCPDF: Wenn Sie Zeichenketten verwenden, stellen Sie sicher, dass Sie TCPDFs "writeHTMLCell" anstelle von "writeHTML" verwenden. Und achten Sie auf PHPs 'magic_quotes', fehlerhafte Leerzeichen, Kodierung und Goblins.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X