使用PHP,Zend和openssl对PDF进行数字签名

我正尝试构建一个简单的PDF文档签名例程,使用PHP,openssl和Zend框架(用于pdf重排/处理)。

我发现了这一点,但它根本行不通,Zend无法打开任何pdf文件,甚至连Zend自己的测试pdf都没有,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);
}

编辑,添加代码:以上仅适用于使用'test_pdf2'作为Zend_Pdf的输入。 它将认证证书认定为二进制文件,没有问题,但我需要能够传递PDF而不必将其写入磁盘。


TCPDF支持PDF文件的签名。 也许你会发现源代码中有用的东西。


根据halfer的建议添加我的解决方案作为答案:解决了这个问题,因为我将内容作为字符串传递给Zend_Pdf,因此我应该使用Zend_Pdf :: parse($ new_pdf);因为它很可能在手册中说过。 (糟糕)

进一步; 正如本文中的几篇文章所建议的那样,我通过转移到TCPDF来数字签署各种版本的PDF和组成部分,从而解决了我所有的问题。 但是,在使用字符串时,也遇到了与TCPDF类似的警告,请确保您使用TCPDF的'writeHTMLCell'而不是'writeHTML'。 注意PHP的'magic_quotes',错误的空格,编码和地精。

链接地址: http://www.djcxy.com/p/88493.html

上一篇: Digitally signing a PDF, using PHP, Zend, and openssl

下一篇: Creating PDF's using PHP