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:
- 先通过composer安装FPDI:
composer require setasign/fpdi - 代码示例:
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
相关产品推荐
相关产品推荐

