Skip to content

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设置标头并输出至浏览器

以 LGPL-3.0-or-later 许可证发布。