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

如何用FPDF导入MySQL图片并实现文本单元格换行生成PDF?

实现方案及代码示例

直接放弃Table()方法的自动生成逻辑,改用手动循环数据库结果集,结合Image()插入图片、MultiCell()实现文本自动换行,完全自定义表格布局。以下是完整实现步骤和代码:

核心思路

  1. 手动执行数据库查询,获取所有行数据,而非依赖Table()的内置查询
  2. 定义每列的固定宽度,适配PDF页面尺寸
  3. 循环遍历每行数据:
    • 用Image()插入图片,匹配图片列宽度
    • 用MultiCell()渲染文本字段,该方法原生支持自动换行
  4. 控制行内单元格的垂直对齐,避免内容错位

完整代码示例

// 1. 初始化TCPDF(根据你的需求调整页面参数)
require_once('tcpdf/tcpdf.php');
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// 设置基础参数
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$pdf->AddPage();

// 2. 连接数据库并执行查询(替换为你的数据库信息)
$host = 'localhost';
$dbname = 'your_db';
$username = 'your_user';
$password = 'your_pass';
$link = new mysqli($host, $username, $password, $dbname);
if ($link->connect_error) {
    die("数据库连接失败: " . $link->connect_error);
}

// 执行查询,获取结果集
$result = $link->query('select image, description, code, size, units from sheet order by ID');

// 3. 定义表格列宽(总宽度建议不超过页面可用宽度,这里按A4横向示例)
$colWidths = [
    40,  // 图片列宽度
    60,  // description列宽度
    30,  // code列宽度
    25,  // size列宽度
    20   // units列宽度
];

// 可选:添加表头(如果需要)
$pdf->SetFont('stsongstdlight', '', 12);
$pdf->Cell($colWidths[0], 10, '图片', 1, 0, 'C', false);
$pdf->Cell($colWidths[1], 10, '描述', 1, 0, 'C', false);
$pdf->Cell($colWidths[2], 10, '编码', 1, 0, 'C', false);
$pdf->Cell($colWidths[3], 10, '尺寸', 1, 0, 'C', false);
$pdf->Cell($colWidths[4], 10, '单位', 1, 1, 'C', false); // 最后一个参数1表示换行

// 4. 循环处理每行数据
$pdf->SetFont('stsongstdlight', '', 10);
while ($row = $result->fetch_assoc()) {
    // 记录当前Y坐标,用于对齐行内单元格
    $currentY = $pdf->GetY();
    
    // 插入图片:注意图片路径要正确(绝对路径或相对TCPDF的访问路径)
    // 调整图片高度,确保和文本行高度匹配,这里设为30
    $imagePath = $row['image'];
    if (file_exists($imagePath)) {
        $pdf->Image($imagePath, $pdf->GetX(), $currentY, $colWidths[0]-2, 30, '', '', '', false, 300, '', false, false, 1, false, false, false);
    } else {
        // 图片不存在时显示占位文本
        $pdf->MultiCell($colWidths[0], 30, '无图片', 1, 'C', false, 0, $pdf->GetX(), $currentY, true, 0, false, true, 30, 'M');
    }
    
    // 移动到下一列的X坐标
    $pdf->SetX($pdf->GetX() + $colWidths[0]);
    
    // 处理description字段(自动换行)
    $pdf->MultiCell($colWidths[1], 30, $row['description'], 1, 'L', false, 0, $pdf->GetX(), $currentY, true, 0, false, true, 30, 'M');
    
    $pdf->SetX($pdf->GetX() + $colWidths[1]);
    
    // 处理code字段
    $pdf->MultiCell($colWidths[2], 30, $row['code'], 1, 'C', false, 0, $pdf->GetX(), $currentY, true, 0, false, true, 30, 'M');
    
    $pdf->SetX($pdf->GetX() + $colWidths[2]);
    
    // 处理size字段
    $pdf->MultiCell($colWidths[3], 30, $row['size'], 1, 'C', false, 0, $pdf->GetX(), $currentY, true, 0, false, true, 30, 'M');
    
    $pdf->SetX($pdf->GetX() + $colWidths[3]);
    
    // 处理units字段
    $pdf->MultiCell($colWidths[4], 30, $row['units'], 1, 'C', false, 1, $pdf->GetX(), $currentY, true, 0, false, true, 30, 'M');
    
    // 每行结束后添加额外间距(可选)
    $pdf->Ln(2);
}

// 关闭数据库连接
$link->close();

// 输出PDF
$pdf->Output('output.pdf', 'I');

关键参数说明

  • MultiCell()的第7个参数设为0表示不换行,最后一个单元格设为1表示换行
  • Image()的第8个参数(y坐标)固定为当前行的$currentY,确保图片和文本垂直对齐
  • MultiCell()的最后一个参数'M'表示垂直居中对齐,解决文本和图片高度不一致的问题
  • 图片路径要确保TCPDF有权限访问,建议用绝对路径

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 18:25:30