通过tcpdf实现PDF数字签名(PHP版)

2023-07-18PHP语言

一、什么是tcpdf

TCPDF 是一个用于快速生成 PDF 文件的 PHP5 函数包。他是基于 FPDF 进行的扩展和改进。详细文档可访问tcpdf官方网站

二、安装tcpdf

使用composer安装tcpdf,命令如下

composer require tecnickcom/tcpdf

三、准备数字证书

1、通过申请数字证书

通过向CA机构或服务器平台申请数字证书或者ssl证书。申请后的证书文件,如果有crt文件,即可直接使用创建数字签名。若没有,可通过命令获取crt文件。

2、通过自签名证书

可以自己创建签名证书,命名如下

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

创建过程中,按提示输入相应证书信息。

另外,请记下两条转换格式的命令

(1)将crt导出到p12

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

(2)将pfx证书转换为pem

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

四、证书签名过程

1、设置证书路径

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

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

2、设置证书信息

$info = array(
  'Name' => '老张的博客',
  'Location' => '上海',
  'Reason' => '测试数字签名',
  'ContactInfo' => 'https://www.webppp.com',

3、设置文档签名

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

4、设置签名外观

(1)图像签名外观如何设置

// 创建签名内容(图像和/或文本)
$pdf->Image('common/webppp.jpg', 180, 70, 15, 15, 'JPG');

// 定义签名外观的活动区域
$pdf->setSignatureAppearance(180, 70, 15, 15);

(2)空签名外观如何设置

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

五、完整代码

以下是完整代码,供参考

$pdf = new \TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// 设置文档信息
$pdfName = '测试签名文档';
$pdf->SetCreator($pdfName);
$pdf->SetAuthor('webppp');
$pdf->SetTitle($pdfName);
$pdf->SetSubject($pdfName);

//设置字体 stsongstdlight支持中文
$pdf->SetFont('stsongstdlight', '', 10);

// 设置图片比例因子
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

// 设置自动分页 距离底部多少进行分页
$pdf->SetAutoPageBreak(true, PDF_MARGIN_BOTTOM);

// 第一页
$pdf->AddPage();

$html = '<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>购销合同</title>
</head>
<body>
<div class="content">
  <h3 align="center">购销合同</h3>
  <p>(供方)(以下简称乙方):</p>
  <p>经协商同意,根据中华人民共和国经济法的规定,订立合同如下:</p>
  <p>一、 产品名称、商标、型号、厂家、数量、价格、供货时间:</p>
  <p>二、 质量要求技术标准、供方对质量负责的条件和期限:按技术协议</p>
  <p>三、 交(提)货地点、方式:使用快递</p>
  <p>四、 运输方式及到达站港和费用负担:送货上门、供方负担</p>
  <p>五、 合理损耗及计算方法:无</p>
  <p>六、 包装标准、包装物的供应与回收:原包装、不回收。</p>
  <p>七、 验收标准、方法及提出异议期限:按原厂技术标准验收,需方收到货后提出异议期限为十五天。</p>
  <p>八、 结算方式及期限:货到验收合格、发票到后一周内付款。</p>
  <p>九、 违约责任:如发生质量问题,需方将提出索赔。具体事宜协商解决。</p>
  <p>十、 解决合同纠纷的方式:合同发生争议时,双方应协商解决,协商不成时,任何一方可向经济合同仲裁委员会申请仲裁,或直接向人民法院起诉。</p>
  <p>十一、 其它事项:本合同一式两份,双方各执一份,经双方签字盖章有效,均有法律效力。</p>
  <p> </p>
  <p>订立合同人:</p>
  </div>
</body>
</html>'

$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '1', true);

// 数字签名
// 设置证书路径 必须file开头接根目录下文件路径
$certificate = 'file://common/tcpdf.crt';

// 设置证书信息
$info = array(
  'Name' => '测试数字签名',
  'Location' => '上海',
  'Reason' => '测试数字签名',
  'ContactInfo' => 'https://www.webppp.com',
);

// 设置文档签名
$pdf->setSignature($certificate, $certificate, '123456', '', 2, $info);

// 设置签名外观

// 创建签名内容(图像和/或文本)
$pdf->Image('common/southeast.jpg', 180, 70, 15, 15, 'JPG');

// 定义签名外观的活动区域
$pdf->setSignatureAppearance(180, 70, 15, 15);

// 设置空签名外观
$pdf->addEmptySignatureAppearance(180, 90, 15, 15);

// 四种模式 I输出、D下载、F保存本地、S输出二进制字符串
$fileNewName = $fileDir . $filename;
$pdf->Output( 'webppp.pdf', 'I');

版权声明:本文为老张的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://www.webppp.com/view/php_tcpdf.html