0

0

Dompdf PDF 生成教程:从 HTML 到 PDF 的正确实践

DDD

DDD

发布时间:2025-10-02 10:34:28

|

457人浏览过

|

来源于php中文网

原创

Dompdf PDF 生成教程:从 HTML 到 PDF 的正确实践

本文旨在解决使用 Dompdf 生成 PDF 时常见的输出纯 HTML 而非渲染 PDF 的问题。核心在于理解 Dompdf 的工作流程,特别是 render() 方法的重要性。我们将详细介绍 Dompdf 的初始化、HTML 加载、纸张设置、关键的渲染步骤以及最终的输出与保存,并探讨高级配置选项和 HTML 优化技巧,确保您能成功地将 HTML 内容转换为高质量的 PDF 文档。

Dompdf PDF 生成核心流程

在使用 dompdf 将 html 内容转换为 pdf 时,一个常见的错误是忘记调用 render() 方法。render() 是 dompdf 将加载的 html 内容解析并渲染成 pdf 格式的关键步骤。如果缺少此步骤,您最终可能会得到原始的 html 文本而不是一个格式化的 pdf 文件。

以下是使用 Dompdf 生成 PDF 的正确流程和基本代码示例:

  1. 初始化 Dompdf 实例:首先需要创建 Dompdf 对象。通常会传入一个 Options 对象来配置 Dompdf 的行为。
  2. 加载 HTML 内容:使用 loadHtml() 方法将待转换的 HTML 字符串加载到 Dompdf 实例中。
  3. 设置 PDF 纸张和方向:通过 setPaper() 方法指定 PDF 的纸张大小(如 'A4')和方向(如 'portrait' 或 'landscape')。
  4. 渲染 PDF 内容这是最关键的一步。调用 render() 方法,Dompdf 会在此阶段处理 HTML,将其转换为可打印的 PDF 结构。
  5. 输出或保存 PDF
    • 使用 output() 方法获取 PDF 的二进制内容,通常用于保存到文件。
    • 使用 stream() 方法直接将 PDF 发送到浏览器,通常用于在线预览或下载。

基本示例代码:

Dompdf PDF 生成示例
    

这是一个测试段落,用于演示如何使用 Dompdf 将 HTML 转换为 PDF。

@@##@@
  • 列表项 1
  • 列表项 2
'; // 1. 初始化 Dompdf 选项 $options = new Options(); $options->set('isHtml5ParserEnabled', true); // 启用 HTML5 解析器,通常更快 $options->set('isRemoteEnabled', true); // 允许加载远程资源(如图片、CSS) // 2. 初始化 Dompdf 实例 $dompdf = new Dompdf($options); // 3. 加载 HTML 内容 $dompdf->loadHtml($htmlContent); // 4. 设置 PDF 纸张大小和方向 $dompdf->setPaper('A4', 'portrait'); // A4 纸张,纵向 // 5. 渲染 PDF 内容 (关键步骤!) $dompdf->render(); // 6. 输出或保存 PDF // 方式一:直接输出到浏览器 // $dompdf->stream("document.pdf", ["Attachment" => false]); // Attachment => false 表示在浏览器中打开 // 方式二:获取 PDF 二进制内容并保存到文件 $pdfOutput = $dompdf->output(); $filePath = __DIR__ . '/generated_document.pdf'; // 保存路径 file_put_contents($filePath, $pdfOutput); echo "PDF 已成功生成并保存到: " . $filePath; ?>

在上述代码中,$dompdf->render(); 是确保 HTML 被正确处理并转换为 PDF 格式的核心指令。

立即学习前端免费学习笔记(深入)”;

Dompdf 配置选项详解

Dompdf 提供了丰富的配置选项,允许您精细控制 PDF 的生成过程。这些选项通过 Dompdf\Options 类进行设置。以下是一些常用的配置项及其说明:

use Dompdf\Options;

$options = new Options([
    // 'logOutputFile'           => 'data/log.htm',        // 日志文件路径
    'isPhpEnabled'            => false,                   // 是否允许在 HTML 中执行 PHP 代码 (出于安全考虑通常禁用)
    'isRemoteEnabled'         => true,                    // 是否允许加载远程资源 (如外部 CSS、图片)
    'isJavascriptEnabled'     => false,                   // 是否允许在 HTML 中执行 JavaScript (通常禁用,Dompdf 不支持 JS 渲染)
    'isHtml5ParserEnabled'    => true,                    // 启用 HTML5 解析器,通常能提高解析速度和兼容性
    'isFontSubsettingEnabled' => false,                   // 是否启用字体子集化,减少文件大小
    'debugPng'                => false,                   // 调试 PNG 图像
    'debugKeepTemp'           => false,                   // 调试时保留临时文件
    'debugCss'                => false,                   // 调试 CSS 解析
    'debugLayout'             => false,                   // 调试布局计算
    'debugLayoutLines'        => false,                   // 调试布局行
    'debugLayoutBlocks'       => false,                   // 调试布局块
    'debugLayoutInline'       => false,                   // 调试内联布局
    'debugLayoutPaddingBox'   => false,                   // 调试内边距框
    // 'pdfBackend'              => 'CPDF',                // PDF 后端,默认为 CPDF
]);

$domPdf = new Dompdf($options);

关键配置项说明:

  • isHtml5ParserEnabled:强烈建议设置为 true。它能更好地处理现代 HTML 结构,提高解析效率和准确性。
  • isRemoteEnabled:如果您需要在 HTML 中引用外部图片(如 CDN 上的图片)或外部样式表,必须将其设置为 true。但请注意潜在的安全风险。
  • isPhpEnabled / isJavascriptEnabled:出于安全和性能考虑,通常建议将这两个选项设置为 false。Dompdf 并非一个完整的浏览器环境,不支持复杂的 JavaScript 交互或服务器端 PHP 执行。

优化 HTML 输入:HTML 最小化

在将 HTML 传递给 Dompdf 之前,对其进行最小化处理可以带来以下好处:

Peachly AI
Peachly AI

Peachly AI是一个一体化的AI广告解决方案,帮助企业创建、定位和优化他们的广告活动。

下载
  • 减少文件大小:移除不必要的空格、换行符和注释,可以稍微减小 HTML 字符串的体积。
  • 提高解析效率:更紧凑的 HTML 有助于 Dompdf 更快地解析内容。
  • 避免潜在布局问题:有时多余的空白字符可能会在某些边缘情况下影响布局,最小化可以减少这类情况。

以下是一个简单的 HTML 最小化函数示例,它使用正则表达式移除标签之间和标签内部的多余空白字符:

/**
 * 最小化 HTML 源代码。
 * 移除标签后的空白、标签前的空白以及多个连续的空白字符。
 *
 * @param string $html 原始 HTML 字符串
 * @return string 最小化后的 HTML 字符串
 */
public function minimizeHtml(string $html): string
{
    return preg_replace(
        [
            '/\>[^\S ]+/s',  // 移除标签后的非空白字符,除了空格
            '/[^\S ]+\',
            '<',
            '\\1'
        ],
        $html
    );
}

在实际应用中,您可以在将 HTML 内容传递给 loadHtml() 方法之前,先调用此函数进行处理:

$minimizedHtml = $this->minimizeHtml($htmlContent);
$dompdf->loadHtml($minimizedHtml);

完整示例与最佳实践

结合上述所有要素,我们可以构建一个更健壮、更专业的 PDF 生成方法:

 false,
            'isRemoteEnabled'         => true, // 允许加载远程图片/CSS
            'isJavascriptEnabled'     => false,
            'isHtml5ParserEnabled'    => true,
            'isFontSubsettingEnabled' => false,
            // 调试选项通常在生产环境禁用
            'debugPng'                => false,
            'debugKeepTemp'           => false,
            'debugCss'                => false,
            'debugLayout'             => false,
        ]);

        // 2. 初始化 Dompdf 实例
        $domPdf = new Dompdf($options);

        // 3. 最小化 HTML 内容并加载
        $minimizedHtml = $this->minimizeHtml($html);
        $domPdf->loadHtml($minimizedHtml);

        // 4. 设置纸张大小和方向
        $domPdf->setPaper($size, $orientation);

        // 5. 渲染 PDF (核心步骤)
        $domPdf->render();

        // 6. 返回 PDF 的二进制内容
        return $domPdf->output();
    }

    /**
     * 最小化 HTML 源代码。
     *
     * @param string $html 原始 HTML 字符串
     * @return string 最小化后的 HTML 字符串
     */
    private function minimizeHtml(string $html): string
    {
        return preg_replace(
            [
                '/\>[^\S ]+/s',  // strip whitespaces after tags, except space
                '/[^\S ]+\',
                '<',
                '\\1'
            ],
            $html
        );
    }
}

// --- 使用示例 ---
$pdfGenerator = new PdfGenerator();
$sampleHtml = '
    
    
    
        
        我的报告
        
    
    
        

Dompdf 生成的报告

这份报告演示了 Dompdf 的强大功能,包括自定义样式和图片加载。

您可以轻松地将复杂的 HTML 页面转换为专业的 PDF 文档。

@@##@@ '; try { $pdfContent = $pdfGenerator->htmlToPdf($sampleHtml, 'A4', 'portrait'); $outputPath = __DIR__ . '/professional_report.pdf'; file_put_contents($outputPath, $pdfContent); echo "专业报告 PDF 已成功生成并保存到: " . $outputPath . "\n"; // 也可以直接流式输出到浏览器 // header('Content-Type: application/pdf'); // header('Content-Disposition: inline; filename="professional_report.pdf"'); // echo $pdfContent; } catch (Exception $e) { echo "生成 PDF 时发生错误: " . $e->getMessage() . "\n"; } ?>

注意事项:

  • 字体支持:Dompdf 对中文字体的支持可能需要额外配置。您可能需要嵌入支持中文的字体(如 DejaVu Sans,或通过 Dompdf 的字体工具添加自定义字体)并在 CSS 中指定。
  • CSS 兼容性:Dompdf 对 CSS3 的支持有限,尤其是一些高级布局(如 Flexbox、Grid)可能无法完美渲染。建议使用传统的块级元素和浮动布局。
  • 版本兼容性:上述代码基于 Dompdf v0.8.x 或更高版本。不同版本之间 API 可能略有差异,请查阅您所使用版本的官方文档。
  • 错误处理:在实际应用中,务必添加适当的错误处理机制,例如 try-catch 块来捕获 Dompdf 在渲染过程中可能抛出的异常。

总结

正确使用 Dompdf 生成 PDF 的关键在于遵循其工作流程,尤其是不能遗漏 render() 方法。通过合理配置 Options,您可以控制 Dompdf 的行为,使其更好地适应您的需求。此外,对 HTML 内容进行最小化处理是一种良好的实践,有助于提高性能和稳定性。掌握这些核心概念和技巧,您将能够高效且准确地将 HTML 内容转换为高质量的 PDF 文档。

占位图示例Logo

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2017

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1334

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1241

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

948

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1402

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1231

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1440

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1303

2023.11.13

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

74

2025.12.31

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.7万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.7万人学习

CSS教程
CSS教程

共754课时 | 17.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号