mymediamagnet/laravel-snappy

适用于Laravel的Snappy PDF/Image

v0.4.8 2020-09-04 16:42 UTC

README

本软件包是Snappy的ServiceProvider: https://github.com/KnpLabs/snappy

Wkhtmltopdf 安装

选择以下选项之一来安装wkhtmltopdf/wkhtmltoimage。

  1. 这里下载wkhtmltopdf;
  2. 或者将其作为composer依赖项安装。有关更多信息,请参阅wkhtmltopdf二进制作为composer依赖项

注意!请注意,某些依赖项(例如libXrender)可能不在您的系统上,可能需要手动安装。

测试wkhtmltopdf安装

安装后,您应该能够从命令行/外壳运行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);

可选地,添加以下facades

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();

或使用外观

$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外观的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许可证