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

如何用PHP生成含MySQL用户信息的PDF并附加外部PDF?

解决方案

因为TCPDF本身不支持直接导入/合并外部PDF,你可以通过以下几种方案实现需求:

方案1:用FPDI扩展TCPDF(最适配原有代码)

FPDI是专门给TCPDF/FPDF添加PDF页面导入功能的库,能完美兼容你现有TCPDF生成用户信息的逻辑。

步骤:

  1. 安装FPDI-TCPDF:
    如果用Composer,执行:

    composer require setasign/fpdi-tcpdf
    
  2. 编写代码逻辑:

    • 先从MySQL查询用户信息,用TCPDF生成基础内容页
    • 导入外部PDF的每一页,追加到当前PDF末尾

    示例代码:

    require_once 'vendor/autoload.php';
    
    // 1. 初始化TCPDF+FPDI实例
    $pdf = new \setasign\FpdiTcpdf\Tcpdf('P', 'mm', 'A4', true, 'UTF-8', false);
    $pdf->SetMargins(15, 15, 15);
    $pdf->SetAutoPageBreak(true, 15);
    
    // 2. 从MySQL获取用户信息(示例)
    $pdo = new PDO('mysql:host=localhost;dbname=your_db', 'user', 'pass');
    $userId = 123; // 目标用户ID
    $stmt = $pdo->prepare("SELECT name, email, phone FROM users WHERE id = ?");
    $stmt->execute([$userId]);
    $user = $stmt->fetch(PDO::FETCH_ASSOC);
    
    // 3. 生成用户信息页面
    $pdf->AddPage();
    $pdf->SetFont('stsongstdlight', '', 12);
    $pdf->Cell(0, 10, '用户信息', 0, 1, 'C');
    $pdf->Ln(5);
    $pdf->Cell(30, 10, '姓名:', 0, 0);
    $pdf->Cell(0, 10, $user['name'], 0, 1);
    $pdf->Cell(30, 10, '邮箱:', 0, 0);
    $pdf->Cell(0, 10, $user['email'], 0, 1);
    $pdf->Cell(30, 10, '电话:', 0, 0);
    $pdf->Cell(0, 10, $user['phone'], 0, 1);
    
    // 4. 导入并追加外部PDF
    $externalPdfPath = '/path/to/user/' . $userId . '_attachment.pdf'; // 外部PDF路径
    if (file_exists($externalPdfPath)) {
        $pageCount = $pdf->setSourceFile($externalPdfPath);
        // 逐页导入
        for ($i = 1; $i <= $pageCount; $i++) {
            $tplId = $pdf->importPage($i);
            $pdf->AddPage();
            $pdf->useTemplate($tplId);
        }
    }
    
    // 输出PDF(下载或保存)
    $pdf->Output('user_' . $userId . '_combined.pdf', 'D');
    

方案2:用Ghostscript命令行合并(适合服务器环境允许执行系统命令)

如果不想修改太多PHP代码,可以先单独用TCPDF生成用户信息PDF,再用Ghostscript把两个PDF合并。

步骤:

  1. 用TCPDF生成用户信息PDF,保存到服务器临时目录

  2. 执行Ghostscript命令合并两个文件

  3. 输出合并后的文件,清理临时文件

    示例代码:

    // 1. 用原有TCPDF代码生成用户信息PDF,保存为临时文件
    $tempUserPdf = '/tmp/user_' . $userId . '_temp.pdf';
    // ... 此处省略TCPDF生成用户信息并保存到$tempUserPdf的代码 ...
    
    // 2. 外部PDF路径
    $externalPdf = '/path/to/user/' . $userId . '_attachment.pdf';
    $outputPdf = '/tmp/user_' . $userId . '_combined.pdf';
    
    // 3. 执行Ghostscript合并命令(需服务器已安装Ghostscript)
    $cmd = "gs -dBATCH -dNOPAUSE -q -sDEVICE=pdfwrite -sOutputFile={$outputPdf} {$tempUserPdf} {$externalPdf}";
    exec($cmd, $output, $returnVar);
    
    // 4. 检查合并是否成功,输出给用户
    if ($returnVar === 0 && file_exists($outputPdf)) {
        header('Content-Type: application/pdf');
        header('Content-Disposition: attachment; filename="user_' . $userId . '_combined.pdf"');
        readfile($outputPdf);
        // 清理临时文件
        unlink($tempUserPdf);
        unlink($outputPdf);
    } else {
        echo '合并PDF失败';
    }
    

方案3:换用支持PDF合并的PHP库(如mPDF)

如果可以替换TCPDF,mPDF本身支持导入外部PDF页面,逻辑更简洁:

require_once 'vendor/autoload.php';

$mpdf = new \Mpdf\Mpdf();
// 生成用户信息内容
$html = '<h1>用户信息</h1>' . '<p>姓名:' . $user['name'] . '</p>';
$mpdf->WriteHTML($html);
// 导入外部PDF
$mpdf->SetImportUse();
$pageCount = $mpdf->SetSourceFile($externalPdfPath);
for ($i = 1; $i <= $pageCount; $i++) {
    $tplId = $mpdf->ImportPage($i);
    $mpdf->UseTemplate($tplId);
    if ($i < $pageCount) $mpdf->AddPage();
}
$mpdf->Output();

注意事项:

  • 确保服务器对外部PDF路径有读取权限
  • 使用Ghostscript时,需确认服务器已安装该工具,且PHP的exec/shell_exec函数未被禁用
  • 临时文件要及时清理,避免占用服务器存储空间

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:07:38