如何用PHP、MySQL和HTML2PDF生成多个独立PDF文件
解决方法
你的代码核心问题是输出缓冲位置错误、循环逻辑混乱,导致所有样本的内容被合并到同一个PDF中。以下是修正后的完整代码:
<?php require_once dirname(__FILE__).'/vendor/autoload.php'; use Spipu\Html2Pdf\Html2Pdf; use Spipu\Html2Pdf\Exception\Html2PdfException; use Spipu\Html2Pdf\Exception\ExceptionFormatter; $tablename = 'run01122017'; // 运行名 // 获取所有唯一的样本ID(idEcht) $query2 = "SELECT DISTINCT SUBSTRING(TABLE_NAME, 12, 8) AS idEcht FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE '{$tablename}%'"; $result2 = mysqli_query($conn, $query2) or die("查询失败"); // 遍历每个样本ID,生成独立PDF while ($row2 = mysqli_fetch_assoc($result2)) { $idEcht = $row2['idEcht']; // 开启输出缓冲,单独捕获当前样本的HTML内容 ob_start(); // 查询当前样本对应的患者信息 $FetchIdPat = "SELECT Firstname, Lastname FROM PAT WHERE idEcht = '{$idEcht}'"; $PerformIdPAT = mysqli_query($conn, $FetchIdPat) or die(mysqli_error($conn)); $rowIDPat = mysqli_fetch_assoc($PerformIdPAT); ?> <!DOCTYPE html> <html> <body> Patid: <b><?php echo $rowIDPat["Lastname"] . " " . $rowIDPat["Firstname"]; ?></b> <!-- 可在此添加更多当前样本的报告内容 --> </body> </html> <?php // 获取当前样本的HTML内容并清空缓冲 $content = ob_get_clean(); try { // 为每个样本创建独立的Html2Pdf实例 $html2pdf = new Html2Pdf('P', 'A4', 'fr'); $html2pdf->pdf->SetDisplayMode('fullpage'); $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); // 输出独立PDF文件,文件名包含样本ID // 若需直接下载可移除第二个参数'F';若需保存到服务器则保留(需确保目录有写入权限) $html2pdf->Output("{$tablename}-{$idEcht}-Report.pdf", 'F'); } catch (Html2PdfException $e) { $formatter = new ExceptionFormatter($e); echo $formatter->getHtmlMessage(); exit; } } ?>
关键修改说明:
- 输出缓冲本地化:将
ob_start()和ob_get_clean()移到样本循环内部,确保每个样本的HTML内容被单独捕获,不会累积合并。 - 循环逻辑简化:直接遍历查询到的每个样本ID,避免了未定义变量
$i的问题,逻辑更清晰。 - 数据库查询修正:每个样本单独查询对应患者信息,不再错误拼接多个ID,确保查询条件精准匹配单个样本。
- 独立实例创建:在循环内部新建
Html2Pdf实例,保证每个PDF的生成环境独立,不会互相干扰。 - 异常处理规范:使用正确的
Html2PdfException异常类,并通过官方提供的ExceptionFormatter格式化错误信息。
内容的提问来源于stack exchange,提问作者user979974
相关产品推荐
相关产品推荐

