2012-06-05 14 views
8

Ich versuche eine einfache PDF-Dokument Signierroutine zu erstellen, mit PHP, openssl und dem Zend-Framework (für pdf redering/handling).Digitales Signieren einer PDF mit PHP, Zend und openssl

Ich habe this gefunden, aber es wird einfach nicht funktionieren, Zend ist nicht in der Lage, irgendwelche pdfs zu öffnen, nicht einmal Zend eigenen Test pdf und Zend wird nicht warum, nur dass es nicht 'kann'.

Ich bin mir ziemlich sicher, dass ich in der Lage wäre, die Schlüssel/Zertifikate effektiv zu erstellen, wie es gut dokumentiert ist, aber gibt es eine solide Methode, das generierte Zertifikat an die PDF anzuhängen, wie die obige Zend-Erweiterung es einmal vorgeschlagen hat?

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, Hinzufügen von Code: Die oben funktioniert nur, wenn ich ‚test_pdf2‘ als Eingang für Zend_Pdf verwenden. Es erkennt das Zertifikat als binär ohne Probleme, aber ich muss in der Lage sein, das PDF zu übergeben, ohne es jemals auf die Festplatte schreiben zu müssen.

+0

Ok, also bin ich vielleicht näher gekommen. Was passiert, ist, dass PHP darauf besteht, Schrägstriche, Zeilenumbrüche, Wagenrücklaufzeichen in die Datei einzufügen, egal ob ich es hochlade oder es von einer lokalen Festplatte mit file_get_contents lese. Ich kenne und habe Stripeslashs probiert, magic_quotes deklariert usw. Ich kann es nur zum Laufen bringen, wenn ich Zend_Pdf die Datei direkt lese, was für mich nicht funktioniert, weil wir keine dieser Dateien auf a schreiben werden Scheibe, überhaupt. Gibt es überhaupt einen Grund, PHP davon zu überzeugen, dass es sich nicht mit den Daten, die es behandeln soll, herumschlagen muss? – jbrain

+0

Können wir Ihren Code sehen, den Sie verwenden, um mit der PDF-Datei zu arbeiten? Bearbeiten Sie es in Ihre Frage. – halfer

+0

Dieses Problem gelöst, weil ich den Inhalt als String an Zend_Pdf übergeben habe, ich hätte Zend_Pdf :: parse ($ new_pdf); verwenden sollen, wie es sehr wahrscheinlich im Handbuch steht. (oops) – jbrain

Antwort

8

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

+0

Ich bin auf diese Bibliothek gestoßen, leider können wir keinen externen Code verwenden (außer dem bestehenden Zend-Framework). Gute Idee aber. – jbrain

+2

@ user1437888 - Können Sie Ihre Frage bearbeiten, um diese Bedingung anzugeben? Wenn Sie einen Hintergrund dafür finden können, warum dies der Fall ist, umso besser - es kann helfen, Antworten zu geben. – halfer

0

Meine Lösung als Antwort hinzufügen, pro Halberempfehlung: Gelöst, weil ich den Inhalt als String an Zend_Pdf übergeben habe, hätte ich Zend_Pdf :: parse ($ new_pdf); wie es sehr wahrscheinlich heißt, benutzt in der Bedienungsanleitung. (oops)

Weiter; Ich löste so ziemlich ALLE meine Probleme mit dem digitalen Signieren von PDFs verschiedener Versionen und Formularbestandteilen, indem ich zu TCPDF wechselte, wie einige der Artikel hier andeuten. Ein ähnlicher Vorbehalt wurde mit TCPDF erfüllt. Wenn Sie jedoch Strings verwenden, stellen Sie sicher, dass Sie TCPDFs "writeHTMLCell" anstelle von "writeHTML" verwenden. Und achten Sie auf PHPs "magic_quotes", fehlerhafte Whitespaces, Kodierungen und Goblins.

+0

Dieser [Benutzer] (https://Stackoverflow.com/users/8537628/loic-angora) fragt: * kann ich die Funktion "attachDigitalCertificate()" haben. Ich versuche mit Zendpdf digital zu signieren und habe einige Probleme. * – GhostCat