
本文详解如何在原生 DOMPDF 中将 PHP 变量(如数组或对象)注入 HTML 模板并正确渲染,解决 loadHTML() 无法直接访问外部变量的核心痛点,无需框架、不依赖 isPhpEnabled(已弃用且不安全)。
本文详解如何在原生 dompdf 中将 php 变量(如数组或对象)注入 html 模板并正确渲染,解决 `loadhtml()` 无法直接访问外部变量的核心痛点,无需框架、不依赖 `isphpenabled`(已弃用且不安全)。
DOMPDF 原生不支持 Laravel 风格的 loadView() 或数据绑定语法(如 with()),但可通过 PHP 模板字符串预处理 实现安全、可控的数据注入。关键在于:不在 PDF 渲染时执行 PHP 代码(isPhpEnabled=true 已被 DOMPDF 官方标记为不安全且自 2.0+ 版本默认禁用),而是提前将 PHP 变量解析为纯 HTML 字符串,再交由 DOMPDF 处理。
✅ 推荐方案:使用 str_replace() 或 sprintf() 进行模板变量替换
这是最轻量、最可靠、最符合 DOMPDF 设计哲学的方式。修改您的 index.php 和 pdf.php 如下:
✅ 步骤 1:改造 pdf.php 为纯 HTML 模板(移除所有 PHP 逻辑)
<!-- pdf.php -->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Value To PDF</title>
<style>
body { font-family: sans-serif; margin: 40px; }
h1 { color: #333; }
</style>
</head>
<body>
<h1>Hello {{name}}</h1>
<p>Date: {{date}}</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/1025" title="FineVoice语音克隆"><img
src="https://img.php.cn/upload/ai_manual/001/503/042/68b6ccda9e6bc199.png" alt="FineVoice语音克隆" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/1025" title="FineVoice语音克隆">FineVoice语音克隆</a>
<p>免费在线语音克隆,1 分钟克隆你的声音,保留口音和所有细微差别。</p>
</div>
<a href="/ai/1025" title="FineVoice语音克隆" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/7fc7563c4182" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">PHP免费学习笔记(深入)</a>”;</p>
</body>
</html>✅ 步骤 2:在 index.php 中读取模板 → 替换占位符 → 加载 HTML
<?php
require_once 'dompdf/autoload.inc.php';
use Dompdf\Dompdf;
use Dompdf\Options;
function runPDF() {
$options = new Options();
$options->set('isRemoteEnabled', true); // 如需加载远程图片/CSS,可启用
$dompdf = new Dompdf($options);
// 1. 定义数据
$data = [
'name' => 'John Smith',
'date' => '1/29/2015'
];
// 2. 读取模板内容
$html = file_get_contents("pdf.php");
// 3. 安全替换占位符(支持多组数据)
foreach ($data as $key => $value) {
$html = str_replace('{{' . $key . '}}', htmlspecialchars($value, ENT_QUOTES, 'UTF-8'), $html);
}
// 4. 加载并渲染
$dompdf->loadHtml($html);
$dompdf->setPaper('A4', 'portrait');
$dompdf->render();
$dompdf->stream("niceshipest.pdf", ["Attachment" => false]); // Attachment=false → 浏览器内联打开
}
if (isset($_GET['pdf'])) {
runPDF();
exit;
}
?>
<a href="?pdf=true" target="_blank">Print to PDF</a>⚠️ 重要注意事项
- ❌ 不要启用 isPhpEnabled=true:该选项存在严重安全风险(任意代码执行),DOMPDF 2.x+ 已将其移除或严格限制;即使旧版本启用,也无法访问 runPDF() 函数作用域内的 $data 变量(file_get_contents() 仅读取文件文本,不执行其中 PHP)。
- ✅ 占位符优于 eval() 或 extract():避免动态执行代码,防止 XSS 和 RCE 漏洞;htmlspecialchars() 确保输出安全。
-
? 扩展建议:对复杂模板,可封装为简易模板引擎:
function renderTemplate($path, $data) { $html = file_get_contents($path); foreach ($data as $key => $val) { $html = preg_replace('/{{\s*' . preg_quote($key) . '\s*}}/', htmlspecialchars($val, ENT_QUOTES, 'UTF-8'), $html); } return $html; } $html = renderTemplate('pdf.php', $data);
✅ 总结
向 DOMPDF 传递数据的唯一健壮方式是预处理 HTML 字符串,而非依赖已废弃的 PHP 执行机制。通过语义化占位符(如 {{name}})配合 str_replace(),您既能保持代码清晰、安全可控,又能轻松扩展多语言、多数据结构支持。此方法兼容所有 DOMPDF 版本(0.8.6 至最新 3.x),是生产环境的最佳实践。










