我正在尝试使用PHP,openssl和Zend框架(用于pdf redering / handling)构建一个简单的PDF文档签名例程。
我找到this,但它根本不起作用,Zend无法打开任何pdf,甚至Zend自己的测试pdf,Zend也不会报告原因,只是它“不能”。
我很确定我能够有效地创建密钥/证书,因为这有很好的文档记录,但有没有一种可靠的方法将生成的证书附加到PDF,因为上面的Zend扩展建议曾经这样做过? / p>
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而无需将其写入磁盘。
答案 0 :(得分:8)
答案 1 :(得分:1)
根据halfer的建议添加我的解决方案作为答案:解决了这个问题,因为我将内容作为字符串传递给Zend_Pdf,我应该使用Zend_Pdf :: parse($ new_pdf);,因为它很可能在手册。 (糟糕)
此外;通过转移到TCPDF,我通过数字签名各种版本的PDF和形式成分解决了我的所有问题,正如这里的一些文章所暗示的那样。 TCPDF遇到类似的警告,但在使用字符串时,请确保使用TCPDF的“writeHTMLCell”而不是“writeHTML”。并注意PHP的“magic_quotes”,错误的空格,编码和地精。