使用PHP、Zend和openssl数字签署PDF文件

12

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

我找到了这个,但它根本无法工作,Zend无法打开任何PDF文件,甚至不能打开自己的测试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而无需将其写入磁盘。


好的,我可能已经接近了答案。问题在于PHP坚持将反斜杠、换行符和回车字符插入文件中,无论是上传还是使用file_get_contents从本地磁盘读取文件。我知道并尝试过stripslashes、声明magic_quotes关闭等方法。只有当我让Zend_Pdf直接读取文件时才能使其正常工作,但这对我来说行不通,因为我们永远不会将任何这些文件写入磁盘。有没有办法让PHP相信它不应该篡改被要求处理的数据? - jbrain
能否让我们看看你用来处理PDF的代码?请将其编辑到你的问题中。 - halfer
解决了这个问题,因为我将内容作为字符串传递给Zend_Pdf,所以我应该使用Zend_Pdf :: parse($new_pdf);,正如手册中很可能所说的那样。(糟糕) - jbrain
进一步说,我通过转换到TCPDF解决了几乎所有的问题,包括各种版本和表单构成的PDF数字签名问题,正如这里的几篇文章所建议的那样。然而,在使用字符串时,使用TCPDF的'writeHTMLCell'而不是'writeHTML',并注意PHP的'magic_quotes'、错误的空格、编码和妖魔。 - jbrain
我建议您将您的解决方案作为答案添加(这是这里的标准做法),并删除您上面的解决方案评论。 - halfer
如何使用这种方法定位(x和y位置)签名? - Arunraj S
2个回答

11

TCPDF支持pdf文件的签名。也许您可以在源代码中找到有用的东西。


我确实遇到过那个库,不幸的是我们将无法使用任何外部代码(除了现有的Zend框架)。不过这是个好建议。 - jbrain
2
@user1437888 - 你能编辑一下你的问题来指定那个条件吗?如果你能提供一些背景说明为什么这样做,那就更好了 - 这可能有助于指导答案。 - halfer

1

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

此外,通过采用本网站上几篇文章建议的方法,我基本上解决了所有关于数字签名各种版本和表单组成部分的PDF的问题,这是通过转向TCPDF实现的。然而,在使用字符串时,使用TCPDF的'writeHTMLCell'而不是'writeHTML'。并且要注意PHP的'magic_quotes'、错误的空格、编码和小精灵。


这个用户问道:我能有一个名为“attachDigitalCertificate()”的函数吗?我试图使用zendpdf对PDF进行数字签名,但遇到了一些问题。 - GhostCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接