电子签章合法有效需满足《电子签名法》第十四条,即采用数字证书、身份认证、防篡改、时间戳等技术实现可靠电子签名,与手写签名或盖章具有同等法律效力;图片盖章无效,必须通过pkcs#7签名或对接法大大、腾讯电子签等合规第三方平台。

ThinkPHP本身不提供合法电子签章能力,所谓“盖章”不是贴图,而是基于数字证书的密码学签名。要满足《电子签名法》要求,必须走两条路:用支持PAdES标准的开源库自主签名,或对接有司法存证资质的第三方平台。
别把图片盖章当电子签名
直接用Fpdi::Image()在PDF上加印章PNG,只是视觉叠加,文件哈希值不变,无法验签,诉讼中不被采信。真正的电子签章需:
- 使用私钥对PDF内容做PKCS#7签名
- 嵌入时间戳和可信CA证书链
- 生成符合PAdES-BASELINE-LT等级的签名结构
自主集成fpdi-sign(适合私有化部署)
若数据不能出内网,推荐setasign/fpdi-sign(v4.x,PHP ≥ 8.0):
- 私钥必须是PEM格式文件路径,不能传字符串;Web进程用户(如www-data)要有读权限
- 源PDF不能是线性化(Linearized)格式,用
pdfinfo your.pdf确认 - 坐标单位是1/72英寸,A4纸左下角为(0,0),右上角约(595,842),别按像素思维写(100,100)
- 签名前必须用FPDI导入原始PDF,再调用
setSignatureAppearance()设置位置
对接第三方平台(推荐多数业务场景)
法大大、e签宝、腾讯电子签等已通过国密SM2和司法区块链存证认证:
- e签宝需用
contract_id调用签署接口,不是access_token;签署后返回带国密签名的PDF - 腾讯电子签通过
FileUrls或FileBody(base64去头)上传PDF,获取FlowId发起流程 - 法大大需先完成企业实名认证,获取电子印章ID,再调API绑定签署位置控件
- 所有平台都要求验签逻辑——收到回传PDF后,必须用其提供的SDK验证签名有效性及存证状态
Word转PDF再签章的常见路径
若合同由Word模板生成,可分两步处理:
- 用
phpoffice/phpword加载.docx,替换${name}等占位符 - 调用Linux服务器上的
libreoffice --headless --convert-to pdf转PDF - 再将生成的PDF送入fpdi-sign或第三方平台签署
- 注意:LibreOffice转换后的PDF需检查是否线性化,否则fpdi-sign会报
Unable to find startxref
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











