使用Dompdf生成PDF时表格显示异常问题排查
解决Dompdf生成PDF时出现多余表格内容的问题
看起来你遇到的问题大概率是HTML结构不完整、CSS引入方式错误或者缓冲处理逻辑混乱导致的,我帮你拆解一下问题点并给出修正方案:
问题分析
- HTML结构缺失:你的
laporan.php只有表格代码,没有完整的<html>/<head>/<body>结构,而且CSS样式被放在表格之后输出,Dompdf在渲染时可能因为结构不规范出现异常,甚至重复渲染部分内容。 - CSS引入方式错误:用
include加载.css文件是隐患——如果文件路径不对,PHP会输出警告信息,这些警告会被混入HTML中,最终在PDF里显示成多余内容;同时你用了HTML注释<!-- BOOTSTRAP STYLES-->放在<style>标签里,这会导致CSS解析错误。 - 无意义的代码干扰:
$abc= include $value;这种赋值完全没必要,include本身就会直接输出文件内容,赋值的只是include的成功/失败状态,反而容易混淆逻辑。 - CSS选择器错误:
.table-no-border tr td th这个选择器写错了,应该分开选中td和th,否则样式不会生效。
修正后的代码
1. 重构print.php的逻辑
把HTML结构、CSS、表格内容整合为标准的HTML文档,避免缓冲处理混乱:
<?php require 'dompdf/autoload.inc.php'; use Dompdf\Dompdf; // 加载CSS文件(用file_get_contents避免include的警告问题) $cssFiles = [ 'assets/css/bootstrap.css', 'assets/css/font-awesome.css', 'assets/css/error.css', 'assets/css/basic.css', 'assets/css/custom.css' ]; $customStyles = " table, td, th { border: 1px solid black; } table { border-collapse: collapse; width: 100%; } .table-no-border tr td, .table-no-border tr th { border : none; } td { height: 50px; vertical-align: middle; text-align: center; } "; // 拼接所有CSS内容 $allCss = $customStyles; foreach ($cssFiles as $file) { if (file_exists($file)) { $allCss .= file_get_contents($file); } else { // 可以添加错误日志,避免警告混入HTML error_log("CSS文件不存在:$file"); } } // 获取表格HTML ob_start(); include 'laporan.php'; $tableHtml = ob_get_clean(); // 构建完整的HTML文档 $html = <<<HTML <!DOCTYPE html> <html lang="id"> <head> <meta charset="UTF-8"> <title>Laporan Siswa</title> <style>$allCss</style> </head> <body> $tableHtml </body> </html> HTML; // 生成PDF $dompdf = new Dompdf(); $dompdf->loadHtml($html); $dompdf->setPaper('A4', 'landscape'); // 可选:启用HTML5解析(Dompdf 0.8+默认启用) $dompdf->set_option('isHtml5ParserEnabled', true); $dompdf->render(); // 输出PDF,指定正确的文件名 $dompdf->stream('laporan_siswa.pdf', ["Attachment" => 0]); ?>
2. 保持laporan.php不变
你的表格代码本身没问题,不需要修改,保留原有的table结构即可。
额外排查建议
- 检查CSS文件路径:确保所有
assets/css/下的文件都存在,避免PHP输出警告信息混入HTML。 - 调试生成的HTML:直接访问
print.php,查看网页上的HTML内容是否有多余的文字(比如警告、错误),这些就是PDF里的多余内容。 - 调整表格宽度:如果表格还是有排版问题,可以给每个
<th>/<td>添加width属性,比如<th width="5%">#</th>,强制分配宽度,避免Dompdf自动换行导致的异常。
内容的提问来源于stack exchange,提问作者Jalz Ae




