2012-06-05 25 views
8

PHP、openssl、およびZendフレームワーク(pdf redering/handling用)を使用して簡単なPDF文書署名ルーチンを構築しようとしています。PHP、Zend、およびopensslを使用してデジタル署名する

私はthisを見つけましたが、単に動作しません.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を渡すことができる必要があります。

+0

よろしくお願いします。 PHPがスラッシュ、改行、改行文字をファイルに挿入するかどうかは、ファイルをアップロードするかどうかにかかわらず、file_get_contentsを使用してローカルディスクから読み取ることをPHPが主張しています。 Zend_Pdfが直接ファイルを読み込んでいれば、私はそれを動作させることができます。これは私のためには動作しません。なぜなら、私たちはこれらのファイルをディスク、これまで。それは、それが処理するように求められているデータを改ざんすべきではないとPHPに説得するためにとにかくありますか? – jbrain

+0

PDFを処理するために使用しているコードを確認できますか?あなたの質問にそれを編集してください。 – halfer

+0

Zend_Pdfにコンテンツを渡していたので、Zend_Pdf :: parse($ new_pdf);を使っていたはずです。 (oops) – jbrain

答えて

8

TCPDF pdfファイルのsigningをサポートします。たぶんあなたはソースコードで役に立つものを見つけるでしょう。

+0

私はそのライブラリに出くわしました。残念ながら、(既存のzendフレームワーク以外の)外部コードを使用することはできません。しかし、良い提案。 – jbrain

+2

@ user1437888 - 質問を編集してその条件を指定できますか?なぜそうなったのかについての背景を述べることができれば、それほど良いことではなく、答えを導くのに役立つかもしれません。 – halfer

0

答えとして私の解決策を追加する:halferのアドバイスごとに:これは、Zend_Pdfにコンテンツを渡していたため、Zend_Pdf :: parse($ new_pdf)を使用していたはずです。マニュアルに記載されています。 (oops)

さらに、私は、TCPDFに移行することで、さまざまなバージョンのPDFとデジタル形式の署名をすることで、すべての問題を解決しました。文字列を使用する際には、 'writeHTML'の代わりにTCPDFの 'writeHTMLCell'を使用していることを確認してください。また、PHPのmagic_quotes、間違った空白、エンコーディング、ゴブリンを監視します。

+0

この[ユーザー](https://stackoverflow.com/users/8537628/loic-angora)は次のように尋ねます:*私は "attachDigitalCertificate()"機能を持つことができます。私はzendpdfでデジタルPDFに署名しようとしていますが、いくつか問題があります。 – GhostCat

関連する問題