登录
首页 >  文章 >  php教程

PHP生成PDF文档全攻略

时间:2026-05-22 08:09:40 410浏览 收藏

PHP生成PDF并非简单调用函数即可搞定,而是需要深入理解tcpdf、mpdf、dompdf三大主流库的核心差异与典型陷阱:tcpdf需手动加载中文字体并慎用writeHTML以防乱码;mpdf虽CSS支持更优但仅兼容部分CSS2.1特性,现代布局和响应式规则形同虚设;dompdf在处理大表格时极易内存溢出,必须精简结构并合理分片;而导出失败往往源于HTTP头顺序错误或输出缓冲未清理——每一个环节都可能静默崩溃。真正可靠的PDF生成,始于最小可行示例,成于对字体、样式、内存和响应机制的全程掌控。

一文搞懂PHP生成PDF文档

PHP 本身不内置 PDF 生产能力,直接用 echo 输出 PDF 二进制或靠浏览器渲染 HTML 为 PDF 都不可靠——真要稳定生成 PDF,得依赖外部库,而 tcpdfmpdfdompdf 是目前最常被选中的三个,它们定位和适用场景差异明显,选错就容易卡在中文乱码、分页错位、CSS 不生效这些地方。

为什么 tcpdf 生成中文经常是方块或空白

tcpdf 默认字体不支持 UTF-8 中文,即使你用了 setLanguageArray() 或设置了 mb_internal_encoding('UTF-8'),只要没显式加载中文字体,文本照样渲染失败。

  • 必须用 addTTFfont() 提前注册一个支持中文的 TrueType 字体(如 simhei.ttfmsyh.ttc),再通过 setFont() 切换过去
  • 字体文件路径需为服务器绝对路径,相对路径在 CLI 模式下大概率失效
  • 别用 writeHTML() 直接塞含中文的 HTML —— 它对内联样式和自定义字体的支持弱,优先改用 Cell()MultiCell() 等原生方法写入文本
  • 若坚持用 HTML 渲染,得配合 setHtmlVSpace()setRTL() 调整行高与方向,否则中文段落会挤在一起

mpdf 里 CSS margin/padding 不生效的常见原因

mpdf 对 CSS 的支持比 tcpdf 强,但不是全兼容。比如 margin-top: autodisplay: gridposition: sticky 这些现代属性它压根不认。

  • 只认部分 CSS2.1 属性,flex 布局基本无效,表格布局更稳
  • @media print 规则会被忽略,响应式写法在这里没意义
  • 外边距折叠(margin collapse)行为和浏览器不一致,建议统一用 padding 控制内部间距,margin 只用于模块间隔离
  • 如果用了 autoScriptToLanguseSubstitutions,某些字体替换逻辑会干扰盒模型计算,关掉试试

dompdf 渲染大表格时内存溢出或超时

dompdf 是纯 PHP 实现,解析 HTML + CSS + 渲染三步都在内存里完成,遇到几百行带样式表格很容易撑爆 memory_limit 或触发 max_execution_time