barryvdh / laravel-snappy
Snappy PDF/Image for Laravel
Requires
- php: >=7.2
- illuminate/filesystem: ^9|^10|^11.0
- illuminate/support: ^9|^10|^11.0
- knplabs/knp-snappy: ^1.4.4
Requires (Dev)
- orchestra/testbench: ^7|^8|^9.0
README
此包是 Snappy 的 ServiceProvider: https://github.com/KnpLabs/snappy。
Wkhtmltopdf 安装
选择以下选项之一安装 wkhtmltopdf/wkhtmltoimage。
- 从这里下载 wkhtmltopdf;
- 或者将其作为 composer 依赖项安装。有关更多信息,请参阅wkhtmltopdf 二进制文件作为 composer 依赖项。
注意!请注意,某些依赖项(例如 libXrender)可能不在您的系统上,可能需要手动安装。
测试 Wkhtmltopdf 安装
安装后,您应该可以从命令行/shell中运行 wkhtmltopdf。
如果您选择了第二个选项,二进制文件将在 /vendor/h4cc/wkhtmltoimage-amd64/bin
和 /vendor/h4cc/wkhtmltopdf-amd64/bin
中。
注意 vagrant 用户!
将二进制文件移动到不在同步文件夹中的路径,例如
cp vendor/h4cc/wkhtmltoimage-amd64/bin/wkhtmltoimage-amd64 /usr/local/bin/ cp vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64 /usr/local/bin/
并使其可执行
chmod +x /usr/local/bin/wkhtmltoimage-amd64 chmod +x /usr/local/bin/wkhtmltopdf-amd64
这将防止错误 126。
包安装
在您的 composer.json 中要求此包,并更新 composer。
composer require barryvdh/laravel-snappy
Laravel
Laravel 5.5 使用包自动发现,因此不需要您手动添加 ServiceProvider/Facade。如果您还使用 laravel-dompdf,请注意冲突。最好手动注册 Facade。
更新 composer 后,将 ServiceProvider 添加到 config/app.php 中的 providers 数组
Barryvdh\Snappy\ServiceProvider::class,
可选地,您可以使用 Facade 来缩短代码。将此添加到您的 facades
'PDF' => Barryvdh\Snappy\Facades\SnappyPdf::class, 'SnappyImage' => Barryvdh\Snappy\Facades\SnappyImage::class,
最后,您可以发布配置文件
php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"
Snappy 配置文件
对此配置文件(config/snappy.php)的主要更改将是二进制文件的路径。
例如,当使用 composer 加载时,行应如下所示
'binary' => base_path('vendor/h4cc/wkhtmltopdf-amd64/bin/wkhtmltopdf-amd64'),
如果您遵循 vagrant 步骤,行应如下所示
'binary' => '/usr/local/bin/wkhtmltopdf-amd64',
对于 Windows 用户,您必须在 wkhtmltopdf 的 bin 路径中添加双引号
'binary' => '"C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf"'
Lumen
在 bootstrap/app.php
中添加
class_alias('Barryvdh\Snappy\Facades\SnappyPdf', 'PDF'); $app->register(Barryvdh\Snappy\LumenServiceProvider::class);
可选地,添加 Facade 如下所示
class_alias(Barryvdh\Snappy\Facades\SnappyPdf::class, 'PDF'); class_alias(Barryvdh\Snappy\Facades\SnappyImage::class, 'SnappyImage');
要自定义配置文件,请将文件 /vendor/barryvdh/laravel-snappy/config/snappy.php
复制到 /config
文件夹。
用法
您可以创建一个新的 Snappy PDF/Image 实例,并加载一个 HTML 字符串、文件或视图名称。您可以将其保存到文件中,或内联(在浏览器中显示)或下载。
使用 App 容器
$snappy = App::make('snappy.pdf'); //To file $html = '<h1>Bill</h1><p>You owe me money, dude.</p>'; $snappy->generateFromHtml($html, '/tmp/bill-123.pdf'); $snappy->generate('http://www.github.com', '/tmp/github.pdf'); //Or output: return new Response( $snappy->getOutputFromHtml($html), 200, array( 'Content-Type' => 'application/pdf', 'Content-Disposition' => 'attachment; filename="file.pdf"' ) );
使用包装器
$pdf = App::make('snappy.pdf.wrapper'); $pdf->loadHTML('<h1>Test</h1>'); return $pdf->inline();
或使用 Facade
$pdf = PDF::loadView('pdf.invoice', $data); return $pdf->download('invoice.pdf');
您可以链式调用方法
return PDF::loadFile('http://www.github.com')->inline('github.pdf');
您可以更改方向和纸张大小
PDF::loadHTML($html)->setPaper('a4')->setOrientation('landscape')->setOption('margin-bottom', 0)->save('myfile.pdf')
如果您需要以字符串的形式输出,可以使用 output() 函数获取渲染的 PDF,然后您可以自己保存/输出。
有关更多信息/设置,请参阅 wkhtmltopdf 手册。
测试 - PDF 伪造
作为模拟的替代方案,您可以使用 PDF
Facade 的 fake
方法。在使用伪造时,断言是在测试代码执行之后进行的
<?php namespace Tests\Feature; use Tests\TestCase; use PDF; class ExampleTest extends TestCase { public function testPrintOrderShipping() { PDF::fake(); // Perform order shipping... PDF::assertViewIs('view-pdf-order-shipping'); PDF::assertSee('Name'); } }
其他可用的断言
PDF::assertViewIs($value); PDF::assertViewHas($key, $value = null); PDF::assertViewHasAll(array $bindings); PDF::assertViewMissing($key); PDF::assertSee($value); PDF::assertSeeText($value); PDF::assertDontSee($value); PDF::assertDontSeeText($value); PDF::assertFileNameIs($value);
许可证
此 Laravel 的 Snappy 包装器是开源软件,许可协议为 MIT 许可证