ambengers/eloquent-pdf

Laravel 包,用于使用 Eloquent ORM 依赖创建 PDF 文件。

5.0 2023-10-27 23:03 UTC

This package is auto-updated.

Last update: 2024-09-05 04:11:40 UTC


README

此包提供了一个优雅的方式来使用 Eloquent 模型生成 PDF。使用 Laravel Snappy 生成 PDF,并使用 Laravel Medialibrary 将 PDF 作为模型媒体关联。

CircleCI StyleCI

Spatie Media Library 版本兼容性

安装

通过 Composer

$ composer require ambengers/eloquent-pdf

可选,您可以通过运行以下命令发布配置文件。

php artisan vendor:publish --tag=eloquent-pdf-config

用法

Eloquent PDF 类

您可以使用以下命令生成 Eloquent PDF 类。

$ php artisan make:eloquent-pdf PostPdf

默认情况下,该类将位于 App\Pdf 命名空间中。您可以在配置文件中自定义此设置。

您的 Eloquent PDF 类将包含 2 个方法

  • getData() 提供用于视图的数据
  • getView() PDF 模板文件的视图名称
namespace App\Pdf;

class PostPdf extends AbstractEloquentPdf
{
    public function getData() : array
    {
        return [
            'title' => $this->model->title,
            'body'  => $this->model->body,
        ];
    }

    public function getView() : string
    {
        return 'posts.pdf';
    }
}

现在您可以从控制器(或应用中的任何位置)使用 Eloquent PDF 类。

下载 PDF

return app(PostPdf::class)
    ->model($post)
    ->download()
    ->handle();

打印预览 PDF

return app(PostPdf::class)
    ->model($post)
    ->stream()
    ->handle();

Eloquent PDF 与 Media Library

此包还提供了使用 Media Library 包将 PDF 文件关联到 Eloquent 模型的一种优雅方式。为此,您需要在您的 Eloquent PDF 类上使用一个特质。

use Ambengers\EloquentPdf\InteractsWithMediaLibrary;

class PostPdf extends AbstractEloquentPdf
{
    use InteractsWithMediaLibrary;
}

然后在您的控制器中,就像在 media library 中做的那样,只需提供 PDF 文件将要关联的集合名称。

return app(PostPdf::class)
    ->model($post)
    ->toMediaCollection('reports')
    ->handle();

为了提供额外的便利,您还可以链式调用其他 media library 方法。

return app(PostPdf::class)
    ->model($post)
    ->toMediaCollection('reports')
    ->withCustomProperties(['foo' => 'bar'])
    ->withAttributes(['creator_id' => auth()->id()])
    ->handle();

在幕后,Eloquent PDF 将将这些方法调用转发到 media library 的 FileAdder::class,这样您就可以进一步利用其功能。

自定义

如果您需要进一步的自定义,例如更改默认 PDF 文件名、扩展名或设置 PDF 选项,您可以覆盖 Eloquent PDF 类中的某些方法。

namespace App\Pdf;

class PostPdf extends AbstractEloquentPdf
{
    public function getOrientation(): string
    {
        return 'landscape';
    }

    public function getOptions(): array
    {
        return [
            'footer-right'     => 'Right footer text goes here!',
            'footer-font-size' => 8,
            'encoding'         => 'UTF-8',
        ];
    }

    public function getFilename(): string
    {
        return 'new-file-name';
    }

    public function getExtension(): string
    {
        return 'odt';
    }
}

或者,如果您只想在运行时进行自定义,可以在调用 Eloquent PDF 类时链式调用一些设置方法。

return app(PostPdf::class)
    ->model($post)
    ->orientation('landscape')
    ->options(['footer-font-size' => 8])
    ->filename('some-cool-filename')
    ->toMediaCollection('reports')
    ->handle();

安全

如果您发现任何安全相关的问题,请通过作者电子邮件而不是使用问题跟踪器来联系作者。

许可证

有关更多信息,请参阅许可证文件