如何使用html2pdf批量生成多个独立PDF文件
批量生成独立PDF的问题修复方案
你的代码仅能生成单个PDF的核心问题在于输出缓冲区管理混乱,同时存在代码结构、异常处理等多处错误,以下是具体修复点和完整修正代码:
核心问题分析
- 输出缓冲区未循环重启:初始
ob_start()仅执行一次,第一次ob_get_clean()后缓冲区被清空关闭,后续循环无法捕获HTML内容。 - 代码嵌套结构错误:HTML输出逻辑与PDF生成逻辑层级混乱,
while($rowIDPat)循环未正确闭合。 - 错误的缓冲区清理调用:
ob_end_clean()在writeHTML后调用会直接终止缓冲区,导致后续循环无法再使用输出缓冲。 - 数组取值冗余:
$idEcht_array存储的是关联数组,implode操作完全可以简化为直接取字段值。 - 异常类名不匹配:捕获的
HTML2PDF_exception与引入的Html2PdfException类名不一致,无法正确捕获异常。
修正后的完整代码
<?php //Connect to MySQL database require_once 'configphp'; require_once dirname(__FILE__).'/vendor/autoload.php'; use Spipu\Html2Pdf\Html2Pdf; use Spipu\Html2Pdf\Exception\Html2PdfException; use Spipu\Html2Pdf\Exception\ExceptionFormatter; //define the prefix of the tables $tablePrefix = 'run01122017'; //GET idEcht from table names $query2 = "SELECT DISTINCT SUBSTRING(TABLE_NAME, 12, 8) AS idEcht FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE '{$tablePrefix}%'"; $result2 = mysqli_query($conn, $query2) or die("Query failed"); //Store idEcht into an array (直接存储字段值,而非关联数组) $idEchtArray = []; while($row2 = mysqli_fetch_assoc($result2)) { $idEchtArray[] = $row2['idEcht']; } $arraysizeECHT = count($idEchtArray); for($i = 0; $i < $arraysizeECHT; $i++) { $currentIdEcht = $idEchtArray[$i]; //Query to pick up Idsample information from PAT table $fetchIdPat = "SELECT Lastname, Firstname FROM PAT WHERE idEcht = '{$currentIdEcht}'"; $performIdPAT = mysqli_query($conn, $fetchIdPat) or die(mysqli_error($conn)); // 每次循环重新开启输出缓冲区,捕获当前PDF的HTML内容 ob_start(); ?> <h2>TITLE OF THE DOC</h2> <hr/> <?php while($rowIDPat = mysqli_fetch_assoc($performIdPAT)) { ?> Pat: <?php echo $rowIDPat["Lastname"] . " " . $rowIDPat["Firstname"]; ?> <?php } // 闭合while($rowIDPat)循环 ?> <?php // 获取当前缓冲区的HTML内容并清空缓冲区(但不关闭) $content = ob_get_clean(); try { $html2pdf = new Html2Pdf('P', 'A4', 'fr'); $html2pdf->pdf->SetDisplayMode('fullpage'); $html2pdf->writeHTML($content, isset($_GET['vuehtml'])); // 生成PDF文件,使用'D'参数确保下载/保存,避免输出冲突 $html2pdf->Output("{$tablePrefix}-{$currentIdEcht}-Report.pdf", 'D'); unset($html2pdf); } catch(Html2PdfException $e) { $formatter = new ExceptionFormatter($e); echo $formatter->getHtmlMessage(); exit; } } // end of the for loop mysqli_close($conn); ?>
关键修复细节
- 循环内重启缓冲区:在每次循环生成PDF前调用
ob_start(),确保每个PDF的HTML内容都能被独立捕获。 - 简化数组存储:直接将
idEcht字段值存入数组,避免后续implode的冗余操作。 - 修正嵌套结构:正确闭合
while($rowIDPat)循环,确保HTML结构完整。 - 移除错误的
ob_end_clean():改用ob_get_clean()仅获取内容并清空缓冲区,不关闭缓冲区,后续循环可重新开启。 - 修正异常捕获类:使用正确的
Html2PdfException类,并利用ExceptionFormatter输出更友好的错误信息。 - 明确Output参数:给
Output方法添加第二个参数'D',确保每个PDF都能被正确触发下载(若需保存到服务器可改为'F')。
内容的提问来源于stack exchange,提问作者user979974
相关产品推荐
相关产品推荐

