PHP 对PDF文件实现数字签名

news2024/12/23 20:08:08

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';

设置证书信息

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

设置文档签名

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

设置签名外观

图像签名外观

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

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

空签名外观

$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('YJL');
$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' => 'http://new.solveset.com',
);

// 设置文档签名
$pdf->setSignature($certificate, $certificate, '123456yjl', '', 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( 'test.pdf', 'I');

总结

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

git使用命令技巧

文章目录 前言查看提交用户名更改提交用户名查看文件的diff查看提交记录Git 本地分支管理查看、切换、创建和删除分支 前言 我们在使用git的时候&#xff0c;提交后会看到如下记录&#xff1a; 经常会遇到提交后&#xff0c;这个作者的名字和自己设置的名字不一致&#xff0…

Python文件操作指南:编码、读取、写入和异常处理

文章目录 文件的编码文件的读取使用 read 方法读取整个文件内容&#xff1a;使用 readlines 方法按行读取文件内容并存储到列表中&#xff1a;使用迭代器遍历文件内容&#xff1a; 文件的写入文件的追加文件操作的综合案例文件的关闭文件的存在性检查异常处理文件操作的更多方法…

如何下载外文文献,PubMed中的文献怎么获取

查找外文文献常用数据库有&#xff1a;PubMed、ScienceDirect、Wiley、Web of Science、EI等等。今天单独讲一下PubMed数据库文献的获取方法。 PubMed是生物医药领域使用最广泛的免费文献检索系统。但PubMed 的资讯并不包括期刊论文的全文&#xff0c;只是提供了指向全文提供者…

Meta Quest v55系统推送,浏览器支持多点触摸

6月25日青亭网报道&#xff0c;此前我们报道了Quest v55公测版系统更新解锁了GPU和CPU频率限制&#xff0c;以及动态分辨率渲染功能。 现在v55系统正式向所有人开启推送&#xff0c;并且加入了更多功能&#xff1a; 1&#xff0c;解锁GPU和CPU限制&#xff0c;支持动态分辨率渲…

Linux进程间通信——管道(上)

目录 前文 一&#xff0c;进程间通信介绍 二&#xff0c;什么是管道&#xff1f; 三&#xff0c;管道的基本原理 3.1 匿名管道 3.2 管道基本原理 四&#xff0c;样例代码 五&#xff0c;管道的读写规则 六&#xff0c;管道的特点 总结 前文 本文主要是讲解一下进程间…

一文告诉你低代码的价值

随着数字化时代的到来&#xff0c;软件开发已经成为企业不可或缺的一部分。然而&#xff0c;传统的软件开发过程往往缓慢而昂贵。由此&#xff0c;低代码开发平台的出现给企业带来了一种新的软件开发方式。在本文中&#xff0c;我们将探讨低代码开发平台的用处和发展史&#xf…

【数据分享】1929-2022年全球站点的逐年平均露点数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

centos7.x升级openeuler详细操作教程

本次升级使用工具为苏研提供 1. 升级前准备操作 1.1 注意事项 ● 迁移工具安装在辅助机中&#xff08;不进行系统迁移的机器&#xff09; ● 辅助机至少给迁移工具的安装预留 1.6G 内存空间 ● 安装之前需要关闭防火墙和 SELinux 的特殊要求 ● 工具安装环境需开启工具端口…

论文格式中要求作者加入orcid的链接在名字后边

论文格式中要求作者加入orcid的链接在名字后边&#xff0c;如下图&#xff1a; 使用网上给的各种写法会出现以下问题&#xff1a; &#xff08;1&#xff09;插入位置不合适 &#xff08;2&#xff09;出现一个正方形的框 &#xff08;3&#xff09;所有参考文献带框&#xff…

中国人民大学与加拿大女王大学金融硕士——努力必有回响,加油,金融人!

有付出&#xff0c;就会有收获&#xff1b;有努力&#xff0c;就会有回响。我们为梦想挥汗如雨&#xff0c;我们为未来奋力跋涉。金融领域在职读研的我们&#xff0c;突破了工作、生活等重围&#xff0c;进入到紧张学习的阶段&#xff0c;充分利用有限的时间完成自己蜕变&#…

微前端(micro-app)使用手册

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 micro-app 使用手册 micro-app 是借鉴了 Web Component 的思想&#xff0c;通过 Custom Element 结合自定义的 Shadow Dom&#xff0c;将微前端封装成一个类 Web Component 组件&#xff0c;从而实现微前端的组件化渲染。…

项目集活动—项目集交付阶段活动

项目集交付阶段活动包括协调和管理项目集实际交付所需执行的项目集活动。这些活动包括围绕 变更控制、报告和信息发布所开展的活动&#xff0c;以及围绕成本、采购、质量和风险所开展的活动。 这些活动提供了贯穿整个项目集生命周期的支持活动和流程&#xff0c;旨在提供项目集…

第十三章 Transformer注意力机制

系列文章目录 第一章 AlexNet网络详解 第二章 VGG网络详解 第三章 GoogLeNet网络详解 第四章 ResNet网络详解 第五章 ResNeXt网络详解 第六章 MobileNetv1网络详解 第七章 MobileNetv2网络详解 第八章 MobileNetv3网络详解 第九章 ShuffleNetv1网络详解 第十章…

日志分析篇之Linux日志分析

0x00 前言 Linux系统拥有非常灵活和强大的日志功能&#xff0c;可以保存几乎所有的操作记录&#xff0c;并可以从中检索出我们需要的信息。 本文 简介一下Linux系统日志及日志分析技巧。 0x01 日志简介 日志默认存放位置&#xff1a;/var/log/ 查看日志配置情况&#xff1a;…

抖音本地生活林客服务商开通

抖音林客系统是一种面向本地生活服务的平台&#xff0c;它将消费者与商家联系在一起&#xff0c;在提供更便捷的服务的同时也创造了商业机会。考虑到目前互联网和移动设备的普及程度&#xff0c;以及人们对于生活质量和便利性的不断追求&#xff0c;抖音林客系统具有广阔的市场…

【AUTOSAR】AUTOSAR开发工具链(十)----基于BTC的MIL/SIL测试操作说明(2)

三、PowerWindow demon SIL测试 <一>、如果是手写的纯C代码使用方法如下 创建C代码工程文件 添加C代码的工程文件和不在一个文件夹的头文件路径 选择测试结构 接口参数格式定义 设置采样时间等于调度周期 点击import,添加测试用例类似于MIL测试 <二>、如果是模型…

小航助学2023年6月GESP_C++二级试卷(含题库答题软件账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统&#xff08;含题库答题软件账号&#xff09;_程序猿下山的博客-CSDN博客 单选题2.0分 删除编辑附件图文 答案:D 第1题高级语言编写的程序需要经过以下&#xff08; &#xff09;操作&#xff0c;可以生成在…

这篇文章让你彻底了解什么是安全测试?

目录 前言 安全测试的验证点&#xff1a; 主要归结为以下几点&#xff1a;&#xff08;后期可以优化成一个安全测试的框架结构&#xff09; 总结&#xff1a; 前言 web应用无处不在&#xff0c;存在于每个行业&#xff0c;现在的发展速度非常快速&#xff0c;且web应用在软…

Jetpack Compose实现的一个优雅的 Toast 组件——简单易用~

Toast 是Android中常见的轻量级提示 本文将介绍如何使用Compose技术实现一个Toast组件 不是一个简单的toast 优雅-简洁-动画 才是我的风格 系统原生的Toast默认是在底部弹出&#xff0c;配合kotlin语音的特性&#xff0c;简单封装一下&#xff0c;使用方法非常简洁 inline …

CodeForces..好数列.[简单].[数学规律]

题目描述&#xff1a; 题目解读&#xff1a; 给定n&#xff0c;k 数组a是由0和1组成的&#xff0c;长度为n的数组&#xff0c;数组满足&#xff1a; a的前i个元素中至少有i/k个等于1&#xff1b; a的后i个元素中至少有i/k个等于1&#xff1b; 输入n,k 输出满足条件的数组的…