如何用FPDF导入MySQL图片并实现文本单元格换行生成PDF?
实现方案及代码示例
直接放弃Table()方法的自动生成逻辑,改用手动循环数据库结果集,结合Image()插入图片、MultiCell()实现文本自动换行,完全自定义表格布局。以下是完整实现步骤和代码:
核心思路
- 手动执行数据库查询,获取所有行数据,而非依赖
Table()的内置查询 - 定义每列的固定宽度,适配PDF页面尺寸
- 循环遍历每行数据:
- 用
Image()插入图片,匹配图片列宽度 - 用
MultiCell()渲染文本字段,该方法原生支持自动换行
- 用
- 控制行内单元格的垂直对齐,避免内容错位
完整代码示例
// 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
相关产品推荐
相关产品推荐

