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

DOMPDF如何拼接多个输出 解决超长表格分页后仅显示最后一页问题

问题原因

你代码的核心错误有两处:

  • 对$dompdf->output()的用法理解错误:该方法返回的是单个完整PDF文件的二进制流数据,直接拼接多个PDF的二进制串不会生成合法的多页PDF文件,PDF阅读器只会识别二进制内容中最后一个完整的PDF结构,所以你只能看到最后一页。
  • 调用$dompdf->stream()的参数传错了:该方法第一个参数是PDF的文件名,第二个才是输出配置,你把拼接的二进制串作为文件名传入,实际输出的是循环最后一次创建的$dompdf实例自身生成的单页PDF,你之前拼接的$output变量完全没有被用到。
解决方法

推荐两种可行方案,你可以根据自己的场景选择:

方案1:拼接带分页符的HTML一次性渲染(更简单)

不需要循环创建多个DOMPDF实例,把每一页的表格HTML拼接起来,每页末尾加CSS分页符,一次性传入DOMPDF渲染即可:

$html = '';
$initrow = 0;
$rowsperpage = 25;
$items_nr = 100; // 总行数

$options = new Options();
$options->set('enable_html5_parser', true);
$options->set('isJavascriptEnabled', true);
$dompdf = new Dompdf($options);

while ($initrow < $items_nr) {   
    ob_start();
    $_GET['initrow'] = $initrow;
    $_GET['rowsperpage'] = $rowsperpage;
    require "./mypage.php"; 
    $page_html = ob_get_clean();
    // 除了最后一页,其他页末尾加分页符
    if ($initrow + $rowsperpage < $items_nr) {
        $page_html .= '<style> .page-break { page-break-after: always; } </style><div class="page-break"></div>';
    }
    $html .= $page_html;
    $initrow += $rowsperpage;
}

$dompdf->loadHtml($html);
$dompdf->setPaper('A4', $x_orientation);
$dompdf->render();
$dompdf->stream('表格导出.pdf', ["Attachment" => false]);
exit;

方案2:合并多个PDF文件

如果你确实需要逐页生成PDF再合并,可以使用FPDI库将循环生成的多个单页PDF合并为一个完整的多页PDF:

  1. 先通过composer安装FPDI:composer require setasign/fpdi
  2. 代码示例:
use setasign\Fpdi\Fpdi;

$initrow = 0;
$rowsperpage = 25;
$items_nr = 100;
$pdfPaths = [];

// 逐页生成单页PDF临时文件
while ($initrow < $items_nr) {   
    $options = new Options();
    $options->set('enable_html5_parser', true);
    $options->set('isJavascriptEnabled', true);
    $dompdf = new Dompdf($options);

    ob_start();
    $_GET['initrow'] = $initrow;
    $_GET['rowsperpage'] = $rowsperpage;
    require "./mypage.php"; 
    $html = ob_get_clean();
    
    $dompdf->loadHtml($html);
    $dompdf->setPaper('A4', $x_orientation);
    $dompdf->render();
    
    // 保存临时文件
    $tmpPath = tempnam(sys_get_temp_dir(), 'pdf_');
    file_put_contents($tmpPath, $dompdf->output());
    $pdfPaths[] = $tmpPath;
    
    $initrow += $rowsperpage;
}

// 合并所有PDF
$fpdi = new Fpdi();
foreach ($pdfPaths as $path) {
    $pageCount = $fpdi->setSourceFile($path);
    for ($i = 1; $i <= $pageCount; $i++) {
        $tpl = $fpdi->importPage($i);
        $size = $fpdi->getTemplateSize($tpl);
        $fpdi->AddPage($size['orientation'], [$size['width'], $size['height']]);
        $fpdi->useTemplate($tpl);
    }
    unlink($path); // 删除临时文件
}

// 输出合并后的PDF
$fpdi->Output('表格导出.pdf', 'I'); // I参数表示直接输出到浏览器
exit;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:54:08