必须显式调用$pdf->SetFont('stsongstdlight','',14)指定含中文字符集的字体,因TCPDF默认字体(如dejavusans)不包含中文,仅设UTF-8编码无法解决乱码;HTML样式须内联、图片用绝对路径、动态数据需预处理。

writeHTML(),先确保底层能正确加载中文字体并渲染基础内容。
为什么 new TCPDF() 后中文全变成方块或空格
根本不是编码没设成 UTF-8,而是 TCPDF 默认字体(如 dejavusans)不包含中文字符集。即使 HTML 是 UTF-8,SetFont() 指定的字体路径下没对应字形,照样显示为空白或方块。
- 必须显式调用
$pdf->SetFont('stsongstdlight', '', 14)或其他含中文的字体名,不能只靠default_font配置 -
stsongstdlight是 TCPDF 自带的简体中文字体,Windows/macOS/Linux 均可用,无需额外安装字体文件 - 如果要用自定义字体(如 Noto Sans CJK),需先用
addTTFfont()注册,且 TTF 文件路径必须可读 - 避免在 HTML 中写
style="font-family: SimSun"—— TCPDF 不解析 CSS font-family 回退链,只认SetFont()当前设置的字体名
如何安全地把动态数据塞进 TCPDF 的 writeHTMLCell()
writeHTMLCell() 不是浏览器,它只做静态 HTML 解析:不执行 JS、不重排版、不支持 Flex/Grid、position: fixed 会被忽略。传进去的 Blade 模板若含 Tailwind 类或复杂 CSS,基本等于白写。
- 所有样式必须内联,例如把
class="text-center font-bold"改成style="text-align:center;font-weight:bold;" - 表格必须带
border="1"属性,别指望 CSSborder生效;列宽建议用width="200"或width="30%",百分比在部分版本中兼容性差 - 图片路径要绝对(如
src="/public/images/logo.png"),相对路径在 TCPDF 内部会解析失败 - 如果数据含换行符
\n,先用nl2br()转成<br>,否则会丢失换行
导出失败但没报错?检查 exec 权限和临时目录
用 exec() 调 wkhtmltopdf 是常见做法,但生产环境常因权限或路径问题静默失败 —— 表现为浏览器空白、返回 0 字节 PDF 或直接超时。
-
wkhtmltopdf必须在系统 PATH 中,或明确指定完整路径(如/usr/bin/wkhtmltopdf),不能只写wkhtmltopdf - 临时 HTML 和 PDF 文件必须写入可写目录:
sys_get_temp_dir()在某些容器或共享主机上不可写,建议改用runtime/pdf_temp/并确保该目录存在且 chmod 755 - 务必用
escapeshellarg()包裹所有路径参数,否则含空格或特殊字符的文件名会导致命令截断 - 加
2>&1捕获 stderr,否则错误信息直接丢弃;检查$returnVar是否为 0,不为 0 就说明命令执行失败



















