tenantcloud/laravel-snappy

为Laravel提供的Snappy PDF/Image

0.4.8.3 2022-02-11 13:00 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/图片实例,并加载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许可许可。