dompdf中文乱码需五步解决:①添加中文字体文件(如simsun.ttf)到fonts目录;②用load_font.php注册字体;③css中@font-face声明并设font-family;④配置defaultfont为该字体;⑤确保html编码为utf-8且数据正确传入。

DomPDF 渲染中文乱码怎么办
默认 DomPDF 不支持中文字体,直接输出中文会显示方块或空白。核心是替换字体并显式声明 font-family。
- 把支持中文的 TTF 字体(如
simsum.ttf或NotoSansCJKsc-Regular.otf)放到public/fonts/目录下 - 在 PDF Blade 模板顶部加 CSS:
@font-face { font-family: 'SimSun'; src: url('{{ public_path('fonts/simsum.ttf') }}') format('truetype'); } body { font-family: 'SimSun', sans-serif; } - 不要依赖系统字体路径——DomPDF 运行在服务端,和本地浏览器环境无关
- 如果用
barryvdh/laravel-dompdfv2+,还需在config/dompdf.php中设置'default_font' => 'SimSun'
发票模板里动态渲染金额、税号等字段不生效
常见原因是 Blade 模板未被正确传入数据,或 PDF 渲染时上下文丢失了请求/会话信息。
- 确保控制器中用
PDF::loadView()时明确传参:PDF::loadView('invoices.pdf', ['invoice' => $invoice, 'company' => $company]) - 避免在 Blade 中调用
auth()->user()或session()—— DomPDF 是无会话的 CLI 环境,这些 helper 返回 null - 金额格式化别用前端 JS:PHP 侧用
number_format($amount, 2, '.', ',')或money_format()(注意 locale 设置) - 增值税号、银行账号等敏感字段建议提前在 Controller 中做脱敏处理,而非模板里用
{{ $invoice->tax_id ?? '' }}硬写
生成大发票(50+页)时内存溢出或超时
DomPDF 是纯 PHP 渲染引擎,对长文档和复杂 CSS 友好度低,不是设计用来跑报表的。
- 禁用不必要的 CSS:移除
box-shadow、border-radius、嵌套flex布局,DomPDF 对现代 CSS 支持极弱 - 图片务必压缩并指定宽高属性,否则 DomPDF 会反复重排导致 OOM;优先用 base64 内联小图标,避免外部 HTTP 请求
- 在
config/dompdf.php中调大配置:'chroot' => public_path(), // 限定文件访问根目录 'max_execution_time' => 120, 'log_output_file' => storage_path('logs/dompdf.log') - 真要处理大批量发票,请改用
spatie/browsershot(基于 Puppeteer)或导出为 HTML 后用 wkhtmltopdf CLI
Laravel 10+ 下 barryvdh/laravel-dompdf 报错 Class "DOMDocument" not found
这不是包的问题,是 PHP 缺少 dom 扩展 —— DomPDF 依赖它解析 HTML。
- Ubuntu/Debian:运行
sudo apt-get install php-dom,然后重启 PHP-FPM 或 Apache - macOS(Homebrew + PHP 8.2):
brew install php@8.2-dom,确认php -m | grep dom有输出 - Docker 用户注意:基础镜像如
php:8.2-cli默认不含dom,需在 Dockerfile 中加docker-php-ext-install dom - 别试图用
composer require ext-dom—— 这是无效的,扩展必须由 PHP 编译或系统包管理器安装











