CodeIgniter 集成 PDF 库常见问题源于字体配置、实例复用与输出控制:Dompdf 需手动加载中文字体并设默认字体;mpdf 循环生成须重建实例或调用 clean();TCPDF 要清空缓冲、禁用调试输出并预注册字体。

CodeIgniter 本身不带 PDF 生成功能,必须集成第三方库;选错库或配置不当,90% 的问题都出在中文乱码、CSS 不生效、生成空白、分页错位或内存溢出上。
Dompdf 在 CI 中为什么一用就乱码?
Dompdf 默认只认 DejaVu Sans,对 "SimSun"、"simhei" 这类 Windows 字体名完全无视——它不会去系统里找 .ttf 文件,也不会自动解析 CSS 里的字体声明。
- 必须手动把中文字体文件(如
simkai.ttf或SourceHanSansSC-Regular.otf)复制到vendor/dompdf/dompdf/lib/fonts/目录下 - 运行一次
vendor/bin/dompdf_font_loader.php simkai.ttf(CLI 下),生成对应的simkai.ufm和更新fonts/installed-fonts.json - 初始化时显式指定默认字体:
$options->set('defaultFont', 'simkai') - HTML 中仍需写
<style>body { font-family: "simkai", sans-serif; }</style>,否则 Dompdf v2+ 会 fallback 到无中文的字体 - 确保视图输出是 UTF-8 且无 BOM:检查
<meta charset="utf-8">存在,PHP 文件本身也保存为 UTF-8 without BOM
mpdf 生成多个 PDF 时内容叠加怎么办?
mpdf 实例不是线程安全的,也不自动清理内部缓冲。循环中复用同一个 $mpdf 对象,第二次调用 WriteHTML() 会把新内容追加到旧内容之后,最终 PDF 里出现重复页、错位文本甚至崩溃。
- 每次生成前重建实例:
$mpdf = new \Mpdf\Mpdf([...]),别提“性能损耗”,这是唯一稳的方式 - 若坚持复用,必须在每次
Output()后调用$mpdf->clean()(注意:v8.1+ 才有此方法,旧版无效) - 批量导出时禁用缓存:
$mpdf->showImageErrors = false,避免某张图 404 导致整个批次中断 - 临时目录要可写且隔离:
APPPATH . 'cache/mpdf/'每次生成建议用子目录,比如cache/mpdf/20260511_abc/,防并发冲突
TCPDF 输出为空或 headers already sent 怎么办?
TCPDF 对输出控制极其敏感,CI 的 output 类、调试语句、甚至模板末尾多一个空格,都会触发 headers already sent 错误,导致 PDF 内容为空白或乱码。
- 控制器开头加
ob_end_clean();,强制清空已有输出缓冲 - 绝对不要在
$pdf->Output()前有任何echo、var_dump、print_r,包括 CI 自动加载的 log 输出 - 中文必须预注册字体:
$pdf->addTTFfont(APPPATH . 'third_party/tcpdf/fonts/simhei.ttf', 'TrueTypeUnicode', '', 32),再用$pdf->setFont('simhei') -
writeHTMLCell()宽度参数传0时,若父容器没设width样式,内容会塌缩成一行;建议先$pdf->setCellPadding(2)+ 显式写<div style="width: 100%">
真正麻烦的从来不是“怎么生成”,而是“怎么让生成结果和 HTML 预览一致”——字体路径、CSS 范围、分页断点、远程图片加载权限,每个环节都可能无声失效。别信“一次配置全搞定”,每个项目都要单独验证字体注册、测试分页行为、抓包确认图片是否真被 dompdf 加载进来。



















