You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用TCPDF实现PDF双签名认证及图片添加遇问题求助

Laravel实现PDF认证与多签名方案及TCPDF图片错误解决

一、先搞定TCPDF的PNG Alpha通道错误

检查Imagick扩展是否真的生效

  • 打开命令行输php -v确认你的PHP版本,下载对应版本的Imagick扩展(注意要匹配线程安全/非线程安全、x86/x64)。
  • 找到XAMPP里的php.ini文件,加一行extension=imagick,然后重启Apache。
  • 新建个PHP文件写<?php phpinfo(); ?>,访问后搜imagick,确认扩展加载成功。

快速替代方案(不用折腾Imagick)

如果扩展实在装不上,直接处理签名图片:

  • 用PS/GIMP把PNG的透明背景换成白色,保存后再用。
  • 用PHP GD库自动处理:
    $source = imagecreatefrompng('你的签名路径/signature.png');
    $bg = imagecreatetruecolor(imagesx($source), imagesy($source));
    $white = imagecolorallocate($bg, 255, 255, 255);
    imagefill($bg, 0, 0, $white);
    imagecopy($bg, $source, 0, 0, 0, 0, imagesx($source), imagesy($source));
    imagepng($bg, '处理后的签名路径/signature-no-alpha.png');
    imagedestroy($source);
    imagedestroy($bg);
    

之后用处理好的signature-no-alpha.png就行。

二、PDF认证与多签名的可行方案

方案1:用TCPDF原生实现多签名

TCPDF本身支持多签名,但要注意证书配置和步骤:

  1. 生成PKCS#12格式的证书(员工和招聘方各一份):
    # 生成私钥
    openssl genrsa -out private.key 2048
    # 生成证书请求
    openssl req -new -key private.key -out certificate.csr
    # 生成自签名证书
    openssl x509 -req -days 365 -in certificate.csr -signkey private.key -out certificate.crt
    # 转成PKCS#12(设置密码,记住这个密码后面要用)
    openssl pkcs12 -export -out certificate.p12 -inkey private.key -in certificate.crt
    
  2. Laravel里写代码添加双签名:
    use TCPDF;
    
    $pdf = new TCPDF();
    $pdf->AddPage();
    $pdf->SetFont('helvetica', '', 12);
    $pdf->Write(0, '员工入职确认函');
    
    // 员工签名
    $pdf->setSignature(
        'file://' . public_path('cert/employee.p12'),
        'file://' . public_path('cert/employee.p12'),
        '员工证书密码',
        '',
        2,
        ['Name' => '张三', 'Reason' => '确认入职信息', 'Location' => 'XX公司']
    );
    $pdf->signatureAppearance(150, 70, 150, 40); // 签名位置:x,y,宽度,高度
    
    // 招聘方签名
    $pdf->setSignature(
        'file://' . public_path('cert/employer.p12'),
        'file://' . public_path('cert/employer.p12'),
        '招聘方证书密码',
        '',
        2,
        ['Name' => 'XX科技', 'Reason' => '确认录用', 'Location' => 'XX园区']
    );
    $pdf->signatureAppearance(150, 120, 150, 40); // 位置错开,别重叠
    
    $pdf->Output('signed_offer.pdf', 'I');
    

方案2:用FPDI+TCPDF组合处理已有PDF

如果是给已生成的PDF加签名,用FPDI更方便:

  1. 装依赖:
    composer require setasign/fpdi-tcpdf
    
  2. 代码示例:
    use setasign\Fpdi\Tcpdf\Fpdi;
    
    $pdf = new Fpdi();
    $pageNum = $pdf->setSourceFile(public_path('offer_template.pdf'));
    // 导入原有PDF的所有页面
    for ($i=1; $i<=$pageNum; $i++) {
        $template = $pdf->importPage($i);
        $pdf->AddPage();
        $pdf->useTemplate($template);
    }
    
    // 加员工签名
    $pdf->setSignature(
        'file://' . public_path('cert/employee.p12'),
        'file://' . public_path('cert/employee.p12'),
        '密码',
        '',
        2,
        ['Name' => '张三']
    );
    $pdf->signatureAppearance(50, 80, 150, 40);
    
    // 加招聘方签名
    $pdf->setSignature(
        'file://' . public_path('cert/employer.p12'),
        'file://' . public_path('cert/employer.p12'),
        '密码',
        '',
        2,
        ['Name' => 'XX科技']
    );
    $pdf->signatureAppearance(50, 130, 150, 40);
    
    $pdf->Output('multi_signed_offer.pdf', 'I');
    

方案3:商业场景用第三方签名服务

如果自签证书不满足合规要求,直接用DocuSign、Adobe Sign的Laravel SDK,这些服务自带合法认证,还支持在线签名,适合正式合同场景。

三、验证签名有效性

生成PDF后用Adobe Acrobat Reader打开,看左侧的“签名”面板,自签证书需要手动信任才会显示“有效”,CA签发的证书会直接显示有效。

内容的提问来源于stack exchange,提问作者MAHA OUEGHLANI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 21:05:20