zoukankan      html  css  js  c++  java
  • PHP tcpdf实现pdf电子签名

    2021年6月18日10:50:25

    官方文档 https://tcpdf.org/examples/example_052/

    几个问题需要注意的问题

    /*
    NOTES:
     - To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
     - To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
     - To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
    */

    1,这里使用带证书就是自己使用openssl自我签名的,你也可以去 https://letsencrypt.org/生成一个做测试

    2,如果你要上正式环境请申请ca证书,如果是内部使用https://letsencrypt.org/也足够了

    3,如何查看pdf文件的签名,你使用浏览器打开是看不到的,你可以使用office wps等,打开签名就可以看到签名了

    4,现在电子合同流行,基本板块就是 个人签名+合同电子签名+个人身份认证,其实如果自己做平台的话,除了需要对对接一些个人身份认证之外的,其他都是OK的,其实技术难度不大

     5,tcpdf目前支持的php是从5.3开始,7.x,8.x是不是支持还不知道,但是fpdf是支持7.x和8.x,但是目前说目前不支持电子签名

    Author: Vincent (---.subs.proxad.net)
    Date:   01-03-21 12:19
    
    Hi,
    
    PDF can be signed with HSM instead of a local certificate file. In order to perform such signature, php-pkcs11 could be used:
    https://github.com/gamringer/php-pkcs11
    
    Please, could FPDF use this new PHP extension that is available since PHP 7.4 ?
    
    thank you,
    Vincent
    Reply To This Message
     RE: php-pkcs11 - pdf signature
    Author: Olivier 
    Date:   01-04-21 10:04
    
    FPDF doesn't support digital signature.
    <?php
    //============================================================+
    // File name   : example_052.php
    // Begin       : 2009-05-07
    // Last Update : 2013-05-14
    //
    // Description : Example 052 for TCPDF class
    //               Certification Signature (experimental)
    //
    // Author: Nicola Asuni
    //
    // (c) Copyright:
    //               Nicola Asuni
    //               Tecnick.com LTD
    //               www.tecnick.com
    //               info@tecnick.com
    //============================================================+
    
    /**
     * Creates an example PDF TEST document using TCPDF
     * @package com.tecnick.tcpdf
     * @abstract TCPDF - Example: Certification Signature (experimental)
     * @author Nicola Asuni
     * @since 2009-05-07
     */
    
    // Include the main TCPDF library (search for installation path).
    require_once('tcpdf_include.php');
    
    // create new PDF document
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    
    // set document information
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor('Nicola Asuni');
    $pdf->SetTitle('TCPDF Example 052');
    $pdf->SetSubject('TCPDF Tutorial');
    $pdf->SetKeywords('TCPDF, PDF, example, test, guide');
    
    // set default header data
    $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 052', PDF_HEADER_STRING);
    
    // set header and footer fonts
    $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
    $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
    
    // set default monospaced font
    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
    
    // set margins
    $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
    $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
    $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
    
    // set auto page breaks
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
    
    // set image scale factor
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
    
    // set some language-dependent strings (optional)
    if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
        require_once(dirname(__FILE__).'/lang/eng.php');
        $pdf->setLanguageArray($l);
    }
    
    // ---------------------------------------------------------
    
    /*
    NOTES:
     - To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
     - To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
     - To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
    */
    
    // 设置签名苗药证书
    $certificate = 'file://data/cert/tcpdf.crt';
    
    // set additional information
    $info = array(
        'Name' => 'TCPDF',
        'Location' => 'Office',
        'Reason' => 'Testing TCPDF',
        'ContactInfo' => 'http://www.tcpdf.org',
        );
    
    // set document signature
    $pdf->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info);
    
    // set font
    $pdf->SetFont('helvetica', '', 12);
    
    // add a page
    $pdf->AddPage();
    
    // print a line of text
    $text = 'This is a <b color="#FF0000">digitally signed document</b> using the default (example) <b>tcpdf.crt</b> certificate.<br />To validate this signature you have to load the <b color="#006600">tcpdf.fdf</b> on the Arobat Reader to add the certificate to <i>List of Trusted Identities</i>.<br /><br />For more information check the source code of this example and the source code documentation for the <i>setSignature()</i> method.<br /><br /><a href="http://www.tcpdf.org">www.tcpdf.org</a>';
    $pdf->writeHTML($text, true, 0, true, 0);
    
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // *** set signature appearance ***
    
    // create content for signature (image and/or text)
    $pdf->Image('images/tcpdf_signature.png', 180, 60, 15, 15, 'PNG');
    
    // define active area for signature appearance
    $pdf->setSignatureAppearance(180, 60, 15, 15);
    
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    // *** set an empty signature appearance ***
    $pdf->addEmptySignatureAppearance(180, 80, 15, 15);
    
    // ---------------------------------------------------------
    
    //Close and output PDF document
    $pdf->Output('example_052.pdf', 'D');
    
    //============================================================+
    // END OF FILE
    //============================================================+
    QQ群 247823727 博客文件如果不能下载请进群下载
    如果公司项目有技术瓶颈问题,如有需要,请联系我,提供技术服务 QQ: 903464207
  • 相关阅读:
    iqueryable lambda表达式
    win10安装后耳机有声音而外放无声音
    Coursera机器学习week11 笔记
    Coursera机器学习week10 单元测试
    Coursera机器学习week10 笔记
    Coursera机器学习week9 编程作业
    Coursera机器学习week9 单元测试
    Coursera机器学习week9 笔记
    Coursera机器学习week8 编程作业
    Coursera机器学习week8 单元测试
  • 原文地址:https://www.cnblogs.com/zx-admin/p/14898892.html
Copyright © 2011-2022 走看看