php代码示例怎么生成pdf文件_php生成pdf文件代码示例【示例】

发布时间 - 2026-01-31 00:00:00    点击率:
最稳当的PHP PDF生成库是tcpdf,它纯PHP实现、中文兼容好、无需系统命令,适合报表等结构化内容;需显式设置中文字体、避免输出干扰header、用ob_end_clean()清理缓冲。

tcpdf 生成 PDF 最稳当

PHP 原生不支持 PDF 生成,得靠第三方库。目前最成熟、中文兼容好、不用依赖系统命令的,就是 tcpdf。它纯 PHP 实现,file_get_contentscurl 拉来的 HTML 也能转 PDF,适合生成报表、合同、票据这类结构化内容。

安装方式(推荐 Composer):
composer require tecnickcom/tcpdf

关键点:

  • TCPDF 默认使用 ISO-

    8859-1
    编码,直接输出中文会乱码,必须显式设置中文字体(如 dejavusans 或自定义 simhei.php 字体)
  • 不要用 echo 或任何输出干扰 header,否则 PDF 文件头损坏,浏览器提示“文件已损坏”
  • 生成后建议用 ob_end_clean() 清空输出缓冲,避免空白字符混入二进制流

mpdf 对 HTML/CSS 支持更友好

如果你要渲染带样式、浮动、Flex 布局的 HTML 页面为 PDF,mpdftcpdf 更省心。它对 @media printfont-face、甚至部分 CSS Grid 都有基础支持。

安装:
composer require mpdf/mpdf

常见踩坑:

  • 默认不加载远程图片,需开启 setHttpHeader(true) 并确保 allow_url_fopen = On,或改用本地路径 + base_path
  • 中文仍需注册字体:$mpdf->SetFont('simhei', '', 12),字体文件(.ttf)要放在 ttfonts/ 目录下并配置好路径
  • 调用 Output() 前不能有任何 var_dumpprint_r 或未捕获的 warning,否则 PDF 解析失败

dompdf 快速原型但别上生产

dompdf 上手最快,require 后几行就能出 PDF,适合临时导出、内部工具。但它内存占用高、CSS 兼容弱,复杂表格或长页面容易超时或崩溃。

最小可用示例:

require_once 'vendor/autoload.php';
use Dompdf\Dompdf;
$dompdf = new Dompdf();
$dompdf->loadHtml('

测试

'); $dompdf->setPaper('A4', 'portrait'); $dompdf->render(); $dompdf->stream('test.pdf');

注意:

  • 不支持 position: fixed 和大部分伪类(:hover, ::before
  • 字体嵌入不稳定,中文建议用 mbstring 扩展 + set_option('default_font', 'sans')
  • 大文件生成慎用,memory_limit 至少设为 256M

生成 PDF 后怎么安全响应给浏览器

不是所有 Output() 调用都等价。用户下载失败,十次有八次是 header 写错了。

正确姿势(以 mpdf 为例):

  • 必须在 Output() 前调用 header('Content-Type: application/pdf')
  • 文件名含中文要用 rawurlencode() 编码:header('Content-Disposition: inline; filename="'.rawurlencode('订单_2025.pdf').'";')
  • 禁用缓存:header('Cache-Control: no-cache, must-revalidate')
  • 如果走 AJAX 请求,前端要用 responseType: 'blob' 接收,再用 URL.createObjectURL() 触发下载

最容易被忽略的是:PDF 生成过程中的警告(比如字体缺失、GD 扩展未启用)会混入二进制流,导致文件头污染。上线前务必关闭 display_errors,并用 error_log() 记录异常。


# php  # css  # html  # 前端  # ajax  # composer  # 编码  # 浏览器  # app  # 工具  # curl  # ai  # pdf  # echo  # print  # require 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: ,怎么在广州志愿者网站注册?  北京网站制作公司哪家好一点,北京租房网站有哪些?  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel的.env文件有什么用_Laravel环境变量配置与管理详解  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  Laravel如何使用Vite进行前端资源打包?(配置示例)  如何在腾讯云服务器快速搭建个人网站?  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  PHP 500报错的快速解决方法  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Java遍历集合的三种方式  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Laravel怎么调用外部API_Laravel Http Client客户端使用  手机软键盘弹出时影响布局的解决方法  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  LinuxCD持续部署教程_自动发布与回滚机制  香港服务器网站生成指南:免费资源整合与高速稳定配置方案  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  Laravel如何处理表单验证?(Requests代码示例)  WordPress 子目录安装中正确处理脚本路径的完整指南  如何在阿里云服务器自主搭建网站?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  如何用PHP快速搭建高效网站?分步指南  中山网站推广排名,中山信息港登录入口?  如何用虚拟主机快速搭建网站?详细步骤解析  什么是javascript作用域_全局和局部作用域有什么区别?  太平洋网站制作公司,网络用语太平洋是什么意思?  大同网页,大同瑞慈医院官网?  使用豆包 AI 辅助进行简单网页 HTML 结构设计  如何快速搭建FTP站点实现文件共享?  Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层  Android使用GridView实现日历的简单功能  如何选择可靠的免备案建站服务器?  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  原生JS获取元素集合的子元素宽度实例  如何挑选优质建站一级代理提升网站排名?  如何快速上传自定义模板至建站之星?  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  个人网站制作流程图片大全,个人网站如何注销?  Android自定义listview布局实现上拉加载下拉刷新功能  做企业网站制作流程,企业网站制作基本流程有哪些?  如何快速搭建支持数据库操作的智能建站平台?  SQL查询语句优化的实用方法总结  C语言设计一个闪闪的圣诞树  Laravel如何与Pusher实现实时通信?(WebSocket示例)  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  Laravel如何使用Service Provider注册服务_Laravel服务提供者配置与加载