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

如何使用html2pdf批量生成多个独立PDF文件

批量生成独立PDF的问题修复方案

你的代码仅能生成单个PDF的核心问题在于输出缓冲区管理混乱,同时存在代码结构、异常处理等多处错误,以下是具体修复点和完整修正代码:

核心问题分析

  1. 输出缓冲区未循环重启:初始ob_start()仅执行一次,第一次ob_get_clean()后缓冲区被清空关闭,后续循环无法捕获HTML内容。
  2. 代码嵌套结构错误:HTML输出逻辑与PDF生成逻辑层级混乱,while($rowIDPat)循环未正确闭合。
  3. 错误的缓冲区清理调用:ob_end_clean()在writeHTML后调用会直接终止缓冲区,导致后续循环无法再使用输出缓冲。
  4. 数组取值冗余:$idEcht_array存储的是关联数组,implode操作完全可以简化为直接取字段值。
  5. 异常类名不匹配:捕获的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:&nbsp;<?php echo $rowIDPat["Lastname"] . "&nbsp;" . $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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 04:15:39