• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

PHP 对PDF文件实现数字签名

武飞扬头像
JSON_L
帮助1

PHP通过TCPDF库对生成的PDF文件进行数字签名。

效果如下:

学新通

这个是因为签名证书不在可信任证书列表中。

目录

准备数字证书

1.申请数字证书

2.自签名证书

安装TCPDF

证书签名

设置证书路径

设置证书信息

设置文档签名

设置签名外观

图像签名外观

空签名外观

完整代码

总结


准备数字证书

1.申请数字证书

可以申请数字证书也可使用ssl证书,通过向CA机构或服务器平台申请获得。

申请后的证书文件,如果有crt文件,即可直接使用创建数字签名。

若没有,可通过命令获取crt文件。

如通过ssl证书签名

证书目录如下:

学新通

通过IIS下的pfx文件获得crt证书

学新通

附带有密码文件,创建crt需要密码。

命令如下:

openssl pkcs12 -in fullchain.pfx -out tcpdf.crt -nodes

命令行输入后,需要填写密码(没有密码直接回车),

之后就可得到数字签名所需的证书文件。

2.自签名证书

可以创建自签名证书。

Tcpdf中自签名证书命令如下:

创建自签名:

openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt

过程如下:

需要输入一些证书信息。

学新通

附带两条转成其他格式的命令。

将crt导出到p12:

openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12

 将pfx证书转换为pem:

openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes

下载证书到项目目录中,以备程序使用。

安装TCPDF

安装命令

composer require tecnickcom/tcpdf

证书签名

设置证书路径

必须file开头接根目录下文件路径。

$certificate = 'file://common/tcpdf.crt';

设置证书信息

  1.  
    $info = array(
  2.  
    'Name' => '测试数字签名',
  3.  
    'Location' => '北京',
  4.  
    'Reason' => '测试数字签名',
  5.  
    'ContactInfo' => 'http://new.solveset.com',
  6.  
    );

设置文档签名

$pdf->setSignature($certificate, $certificate, '123456yjl', '', 2, $info);

设置签名外观

图像签名外观

  1.  
    // 创建签名内容(图像和/或文本)
  2.  
    $pdf->Image('common/southeast.jpg', 180, 70, 15, 15, 'JPG');
  3.  
     
  4.  
    // 定义签名外观的活动区域
  5.  
    $pdf->setSignatureAppearance(180, 70, 15, 15);

空签名外观

$pdf->addEmptySignatureAppearance(180, 90, 15, 15);

完整代码

  1.  
    $pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
  2.  
     
  3.  
    // 设置文档信息
  4.  
    $pdfName = '测试文档';
  5.  
    $pdf->SetCreator($pdfName);
  6.  
    $pdf->SetAuthor('YJL');
  7.  
    $pdf->SetTitle($pdfName);
  8.  
    $pdf->SetSubject($pdfName);
  9.  
     
  10.  
    //设置字体 stsongstdlight支持中文
  11.  
    $pdf->SetFont('stsongstdlight', '', 10);
  12.  
     
  13.  
    // 设置图片比例因子
  14.  
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
  15.  
     
  16.  
    // 设置自动分页 距离底部多少进行分页
  17.  
    $pdf->SetAutoPageBreak(true, PDF_MARGIN_BOTTOM);
  18.  
     
  19.  
    // 第一页
  20.  
    $pdf->AddPage();
  21.  
     
  22.  
    $html = '<!DOCTYPE html>
  23.  
    <html lang="en">
  24.  
    <head>
  25.  
    <meta charset="UTF-8">
  26.  
    <title>购销合同</title>
  27.  
    </head>
  28.  
    <body>
  29.  
    <div class="content">
  30.  
    <h3 align="center">购销合同</h3>
  31.  
    <p>(供方)(以下简称乙方):</p>
  32.  
    <p>经协商同意,根据中华人民共和国经济法的规定,订立合同如下:</p>
  33.  
    <p>一、 产品名称、商标、型号、厂家、数量、价格、供货时间:</p>
  34.  
    <p>二、 质量要求技术标准、供方对质量负责的条件和期限:按技术协议</p>
  35.  
    <p>三、 交(提)货地点、方式:使用快递</p>
  36.  
    <p>四、 运输方式及到达站港和费用负担:送货上门、供方负担</p>
  37.  
    <p>五、 合理损耗及计算方法:无</p>
  38.  
    <p>六、 包装标准、包装物的供应与回收:原包装、不回收。</p>
  39.  
    <p>七、 验收标准、方法及提出异议期限:按原厂技术标准验收,需方收到货后提出异议期限为十五天。</p>
  40.  
    <p>八、 结算方式及期限:货到验收合格、发票到后一周内付款。</p>
  41.  
    <p>九、 违约责任:如发生质量问题,需方将提出索赔。具体事宜协商解决。</p>
  42.  
    <p>十、 解决合同纠纷的方式:合同发生争议时,双方应协商解决,协商不成时,任何一方可向经济合同仲裁委员会申请仲裁,或直接向人民法院起诉。</p>
  43.  
    <p>十一、 其它事项:本合同一式两份,双方各执一份,经双方签字盖章有效,均有法律效力。</p>
  44.  
    <p> </p>
  45.  
    <p>订立合同人:</p>
  46.  
    </div>
  47.  
    </body>
  48.  
    </html>'
  49.  
     
  50.  
     
  51.  
     
  52.  
    $pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '1', true);
  53.  
     
  54.  
    // 数字签名
  55.  
     
  56.  
    // 设置证书路径 必须file开头接根目录下文件路径
  57.  
    $certificate = 'file://common/tcpdf.crt';
  58.  
     
  59.  
    // 设置证书信息
  60.  
    $info = array(
  61.  
    'Name' => '测试数字签名',
  62.  
    'Location' => '北京',
  63.  
    'Reason' => '测试数字签名',
  64.  
    'ContactInfo' => 'http://new.solveset.com',
  65.  
    );
  66.  
     
  67.  
    // 设置文档签名
  68.  
    $pdf->setSignature($certificate, $certificate, '123456yjl', '', 2, $info);
  69.  
     
  70.  
    // 设置签名外观
  71.  
     
  72.  
    // 创建签名内容(图像和/或文本)
  73.  
    $pdf->Image('common/southeast.jpg', 180, 70, 15, 15, 'JPG');
  74.  
     
  75.  
    // 定义签名外观的活动区域
  76.  
    $pdf->setSignatureAppearance(180, 70, 15, 15);
  77.  
     
  78.  
    // 设置空签名外观
  79.  
    $pdf->addEmptySignatureAppearance(180, 90, 15, 15);
  80.  
     
  81.  
     
  82.  
    // 四种模式 I输出、D下载、F保存本地、S输出二进制字符串
  83.  
    $fileNewName = $fileDir . $filename;
  84.  
    $pdf->Output( 'test.pdf', 'I');
学新通

总结

按照官网的示例,通过创建自签名证书结合自己的实际场景做了一个数字签名应用。

有一点要注意,只能添加一个数字签名,设置两个的话,第二个的位置会覆盖签名的坐标,导致第一个签名在第二个位置。

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfegbh
系列文章
更多 icon
同类精品
更多 icon
继续加载