HTML 渲染器
HtmlRenderer 是 Artisan 包的主要入口点。它负责启动 Chrome、加载 HTML 内容,并通过 CDP 的 Page.printToPDF 指令将页面渲染为 PDF。
创建实例
使用静态工厂方法创建渲染器:
php
use Yeeefang\TcpdfNext\Artisan\HtmlRenderer;
$renderer = HtmlRenderer::create();你也可以指定 Chrome 可执行文件的路径:
php
$renderer = HtmlRenderer::create(
chromePath: '/usr/bin/chromium-browser',
);加载 HTML
loadHtml() — 从字符串加载
直接传入 HTML 字符串,适合动态生成的内容:
php
$renderer->loadHtml('<h1>标题</h1><p>这是一段文字。</p>');loadFile() — 从本地文件加载
读取磁盘上的 HTML 文件:
php
$renderer->loadFile('/path/to/template.html');loadUrl() — 从 URL 加载
直接渲染网页,Chrome 会自动加载所有外部资源(CSS、JS、图片、字体):
php
$renderer->loadUrl('https://example.com/invoice/123');TIP
loadUrl() 支持 file://、http:// 与 https:// 协议。如果需要携带认证,可在 RenderOptions 中设置自定义的 HTTP 标头。
输出方式
save() — 保存到文件
php
$renderer->loadHtml($html)->save('/tmp/output.pdf');toString() — 获取 PDF 二进制字符串
php
$pdfBinary = $renderer->loadHtml($html)->toString();output() — 直接输出到浏览器
设置适当的 HTTP 标头并输出 PDF 内容,适用于非框架的 PHP 应用程序:
php
$renderer->loadHtml($html)->output('invoice.pdf');搭配 RenderOptions
通过 withOptions() 自定义渲染行为:
php
use Yeeefang\TcpdfNext\Artisan\RenderOptions;
$options = RenderOptions::create()
->landscape()
->margin(top: 20, right: 15, bottom: 20, left: 15)
->printBackground();
$renderer->withOptions($options)
->loadHtml($html)
->save('/tmp/report.pdf');完整范例:发票渲染
php
use Yeeefang\TcpdfNext\Artisan\HtmlRenderer;
use Yeeefang\TcpdfNext\Artisan\RenderOptions;
$html = <<<'HTML'
<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<style>
body { font-family: "Noto Sans TC", sans-serif; margin: 0; padding: 40px; }
.header { display: flex; justify-content: space-between; align-items: center; }
.logo { font-size: 24px; font-weight: bold; color: #ff6600; }
table { width: 100%; border-collapse: collapse; margin-top: 30px; }
th { background: #333; color: #fff; padding: 10px; text-align: left; }
td { border-bottom: 1px solid #eee; padding: 10px; }
.total { font-size: 18px; text-align: right; margin-top: 20px; }
</style>
</head>
<body>
<div class="header">
<div class="logo">ACME Corp.</div>
<div>发票编号:INV-2026-0042</div>
</div>
<table>
<tr><th>品名</th><th>数量</th><th>单价</th><th>小计</th></tr>
<tr><td>云端主机 (月费)</td><td>12</td><td>NT$ 3,000</td><td>NT$ 36,000</td></tr>
<tr><td>SSL 证书</td><td>1</td><td>NT$ 2,500</td><td>NT$ 2,500</td></tr>
<tr><td>技术支持方案</td><td>1</td><td>NT$ 15,000</td><td>NT$ 15,000</td></tr>
</table>
<div class="total"><strong>合计:NT$ 53,500</strong></div>
</body>
</html>
HTML;
$options = RenderOptions::create()
->pageSize('A4')
->margin(top: 10, right: 10, bottom: 10, left: 10)
->printBackground();
HtmlRenderer::create()
->withOptions($options)
->loadHtml($html)
->save('/tmp/invoice.pdf');方法一览
| 方法 | 返回值 | 说明 |
|---|---|---|
create(?string $chromePath) | static | 创建渲染器实例 |
loadHtml(string $html) | static | 从 HTML 字符串加载内容 |
loadFile(string $path) | static | 从本地文件加载 HTML |
loadUrl(string $url) | static | 从 URL 加载页面 |
withOptions(RenderOptions $options) | static | 设置渲染选项 |
save(string $path) | void | 将 PDF 保存至指定路径 |
toString() | string | 获取 PDF 的二进制字符串 |
output(string $filename) | void | 设置标头并输出至浏览器 |