如何在Symfony中使用DomPDF或Snappy生成PDF文件

夏辰君_2890

夏辰君_2890

2026-05-19

801人浏览

原创

dompdf和snappy生成pdf失败主因是字体配置、路径权限、子进程执行及html上下文隔离问题;需注册中文字体、绝对化资源路径、确认wkhtmltopdf路径与权限、校验pdf内容非空。

如何在symfony中使用dompdf或snappy生成pdf文件

DomPDF 和 Snappy 都能用,但选错一个会卡在中文乱码、页眉页脚不生效、或 PDF 渲染空白上——关键不在“怎么装”,而在“怎么配字体和上下文”。

DomPDF 中文乱码的根本原因和解法

DomPDF 默认不加载中文字体,mb_convert_encoding 或 iconv 强转编码只是掩耳盗铃,真正要的是注册字体+指定字体族。

  • 把 simhei.ttf(或 NotoSansCJKsc-Regular.otf)放到 public/fonts/ 目录下
  • 在 config/packages/dompdf.yaml 里显式声明字体路径:
    dompdf:
      options:
        font_dir: '%kernel.project_dir%/public/fonts'
        font_cache: '%kernel.project_dir%/var/cache/dompdf/fonts'
  • 在 Twig 模板中用 @font-face 注册并强制使用:
    @font-face {
      font-family: 'SimHei';
      src: url('{{ absolute_url('fonts/simhei.ttf') }}') format('truetype');
    }
    body { font-family: 'SimHei', sans-serif; }
  • 避免在模板里用 {{ entity.title|raw }} 直接输出未转义 HTML,DomPDF 对非法标签极敏感,容易静默失败

Snappy(wkhtmltopdf)生成空白 PDF 的常见触发点

Snappy 本身不渲染,它调用 wkhtmltopdf 命令行工具,空白 PDF 多数是子进程执行失败但没抛异常。

Symfony Linux版
Symfony Linux版

Symfony Linux版整理 Symfony CLI 5.17.1 官方下载入口和 Symfony 框架安装配置说明。

下载
  • 确认 wkhtmltopdf 已安装且可执行:which wkhtmltopdf 或 wkhtmltopdf --version
  • 在 Symfony 中配置时必须指定完整路径(尤其 Docker 或生产环境):
    knplabs_knp_snappy:
      pdf:
        binary: '/usr/local/bin/wkhtmltopdf'
        timeout: 60
  • 禁用远程资源加载(如 CDN 字体、外部 CSS):默认 enable-javascript 和 no-stop-slow-scripts 可能导致超时,建议显式关闭:
    $snappy->setOption('enable-javascript', false);
    $snappy->setOption('no-stop-slow-scripts', true);
  • Twig 模板里不要用 localhost 或 127.0.0.1 加载 CSS/JS,Snappy 在无网络容器里无法解析;改用绝对 URL 或内联样式

在 Controller 中安全导出 PDF 的最小可行写法

别直接返回 Response,先生成再校验内容长度,否则空 PDF 也会返回 200。

  • 用 generateFromHtml() 而非 generate(),避免文件路径权限问题:
    $html = $this->renderView('pdf/invoice.html.twig', ['invoice' => $invoice]);
    $pdfContent = $this->get('knp_snappy.pdf')->generate($html); // 或 $this->get('dompdf.wrapper')->stream('invoice.pdf');
  • 加一层空内容检查:
    if (empty($pdfContent) || strlen($pdfContent) 
  • 设置正确 header:
    return new Response(
        $pdfContent,
        200,
        [
            'Content-Type' => 'application/pdf',
            'Content-Disposition' => 'attachment; filename="invoice.pdf"',
        ]
    );

字体注册、路径绝对化、子进程权限、HTML 上下文隔离——这四点漏掉任一个,PDF 就可能成功“生成”却打不开。尤其在 CI/CD 或容器部署时,wkhtmltopdf 的二进制兼容性和 DomPDF 的缓存目录写权限,比语法错误更难排查。

相关文章

极轻PDF
极轻PDF

专业的在线PDF工具,支持PDF编辑、转换、合并、压缩等多种功能,操作简单,处理高效,满足日常办公与学习中的PDF处理需求。

下载

相关标签:

symfony

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
PHP Symfony框架
PHP Symfony框架

本专题专注于PHP主流框架Symfony的学习与应用,系统讲解路由与控制器、依赖注入、ORM数据操作、模板引擎、表单与验证、安全认证及API开发等核心内容。通过企业管理系统、内容管理平台与电商后台等实战案例,帮助学员全面掌握Symfony在企业级应用开发中的实践技能。

2025.09.11

5437

17

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

2026.10.16

20

10

OpenJDK怎么配置Java开发环境
OpenJDK怎么配置Java开发环境

怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。

2026.10.16

0

10

OpenJDK怎么部署Java应用
OpenJDK怎么部署Java应用

Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。

2026.10.16

0

10

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

Revel框架入门与安装配置
Revel框架入门与安装配置

本专题从Revel框架环境搭建讲起,系统介绍命令行工具安装、项目创建、目录结构、配置文件及热代码重载,帮助开发者快速完成首个Go Web应用。

2026.10.16

0

15

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

2026.10.15

20

20

MySQL 忘记密码怎么办
MySQL 忘记密码怎么办

MySQL忘记密码专题汇集不同版本与系统下的root密码重置方法,覆盖MySQL 5.7、8.0、Mac、Linux及本地集成环境,并提示恢复权限与重新登录的检查步骤。

2026.10.15

20

18

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Symfony 官方文档
Symfony 官方文档

共0课时 | 0人学习

Composer手册
Composer手册

共0课时 | 0人学习

Symfony5【从0开始开发博客系统】
Symfony5【从0开始开发博客系统】

共120课时 | 15.6万人学习