12

PHP、openssl、および Zend フレームワーク (pdf の再読み込み/処理用) を使用して、単純な PDF ドキュメント署名ルーチンを構築しようとしています。

私はこれを見つけましが、単に機能しません。Zend は PDF を開くことができず、Zend 自身のテスト PDF でさえ開くことができず、Zend は理由を報告せず、「できない」ことだけを報告します。

十分に文書化されているため、キー/証明書を効果的に作成できると確信していますが、上記のZend拡張機能がかつて示唆しているように、生成された証明書をPDFに添付する確実なアプローチはありますか?

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

編集、コードの追加: 上記は、Zend_Pdf の入力として「test_pdf2」を使用した場合にのみ機能します。問題なく証明書をバイナリとして認識しますが、ディスクに書き込むことなくPDFを渡すことができる必要があります。

4

2 に答える 2

10

TCPDFは、pdf ファイルの署名をサポートしています。ソースコードに何か役立つものがあるかもしれません。

于 2012-06-05T19:47:45.430 に答える
1

ハーフアーのアドバイスに従って、私の解決策を答えとして追加します。これを解決しました。コンテンツを文字列としてZend_Pdfに渡していたので、マニュアルに記載されているように、Zend_Pdf :: parse($ new_pdf);を使用する必要がありました。(おっと)

さらに遠く; ここにある記事のいくつかが示唆しているように、TCPDFに移行することで、さまざまなバージョンとフォーム構成要素のPDFにデジタル署名する際の問題のほとんどすべてを解決しました。同様の警告がTCPDFでも発生しましたが、文字列を使用する場合は、「writeHTML」ではなく「writeHTMLCell」を使用していることを確認してください。そして、PHPの「magic_quotes」、誤った空白、エンコーディング、およびゴブリンに注意してください。

于 2012-06-08T20:11:57.093 に答える