yaroslawww/laravel-pdf-builder

snappy 和 fpdi pdf 生成器的包装器。

2.1.1 2023-03-09 16:17 UTC

This package is auto-updated.

Last update: 2024-09-09 19:19:12 UTC


README

Packagist License Packagist Version Total Downloads Build Status Code Coverage Scrutinizer Code Quality

snappy 和 fpdi pdf 生成器的包装器。允许在 Laravel 中快速创建不同的模板,用于 MVP 或生产。

安装

通过 composer 安装此包

composer require yaroslawww/laravel-pdf-builder

可选地,您可以使用以下命令发布配置文件:

php artisan vendor:publish --provider="LPDFBuilder\ServiceProvider" --tag="config"

使用方法

使用 snappy html 构建

<?php

use LPDFBuilder\Generation\AbstractDocumentFromHtml;

class UserCertificate extends AbstractDocumentFromHtml
{
    protected User $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    public function viewName(): string
    {
        return 'certificates.user.body';
    }

    public function headerViewName(): ?string
    {
        return 'certificates.layout.header';
    }

    public function footerViewName(): ?string
    {
        return 'certificates.layout.footer';
    }

    public function viewData(): array
    {
        return [ 'user' => $this->user, ];
    }
}

使用 fpdi 构建

原始示例

<?php

use LPDFBuilder\Generation\AbstractDocumentFromImage;

class UserCertificate extends AbstractDocumentFromImage
{
    protected User $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    protected function generate(): Fpdi
    {
        $pdf = new Fpdi();

        $pdf->SetAutoPageBreak(false);
        $pdf->AddPage('L', [85.6, 53]);

        $pdf->SetFont('Arial', 'B', 9);
        $pdf->SetTextColor(0, 0, 0);
        $pdf->SetXY(3, 2);
        $pdf->Cell(79.6, 3, 'Name:', 0, 1, 'L');

        $pdf->SetFont('Arial', 'B', 10);
        $pdf->SetTextColor(1, 67, 92);
        $pdf->SetXY(3, 6);
        $pdf->Cell(79.6, 3, Str::limit($this->user->name, 30, ''), 0, 1, 'C');

        return $pdf;
    }
}

从模板

<?php

use LPDFBuilder\Generation\AbstractDocumentFromTemplate;

class UserCertificate extends AbstractDocumentFromTemplate
{
    protected ?string $sourceTemplateDisk = 'pfd_templates';
    protected ?string $sourceTemplateName = 'example.pdf';
    protected int $templatePageWidth      = 100;
    protected int $templatePageHeight     = 297;
    
    protected User $user;

    public function __construct(User $user)
    {
        $this->user = $user;
    }

    protected function applyContent(Fpdi $pdf, int $page = 1): Fpdi
    {
        $pdf->SetFont('Arial', 'B', 14);
        $pdf->SetTextColor(51, 51, 51);
        switch ($page) {
            case 1:
                $pdf->SetXY(5, 40);
                $pdf->Cell(90, 10, 'Test name', 0, 1, 'C');
                break;
            case 2:
                $pdf->SetXY(5, 40);
                $pdf->Cell(90, 10, 'Other page data', 0, 1, 'L');
                break;
        }
        
        return $pdf;
    }
}

代码使用

class CertificateController extends \App\Http\Controllers\Controller {

    function showCertificate(\Illuminate\Http\Request $request) {
        return (new UserCertificate($request->user))->inline();
    }
    
    function showCertificate(\Illuminate\Http\Request $request) {
        return (new UserCertificate($request->user))->download();
    }
  
    function saveCertificate(\Illuminate\Http\Request $request) {
        (new UserCertificate($request->user))->save();
        
        //...
    }
    
    function sendInMail(\Illuminate\Http\Request $request) {
        $message = (new MailMessage)
            ->subject('User certificate.')
            ->greeting('Hi!')
            ->greeting('Certificate created.')
            ->attach((new UserCertificate($request->user))->temporalFile());
        
        return $message;
    }
}

致谢

  • Think Studio