Laravel 动态生成 PDF:基于 KnpSnappy 实现多公司页眉页脚差异化配置

引言:为什么需要个性化 PDF 方案?

在多公司业务场景中,生成的 PDF 文件(如对账单、律师函)往往需要根据公司类型展示不同的页眉(如企业 Logo)和页脚(如联系方式)。本文基于barryvdh/laravel-snappy(封装自 KnpSnappy)和wkhtmltopdf工具,实现「按公司动态配置页眉页脚」的 PDF 生成方案,适用于需要差异化文档样式的业务系统。

一、技术栈与核心依赖

框架:Laravel(任意 5.5 + 版本均可)
PDF 生成工具:wkhtmltopdf(底层渲染引擎)
Laravel 扩展:barryvdh/laravel-snappy(封装 KnpSnappy,简化 PDF 操作)
核心能力:通过 HTML 模板定义页眉页脚,根据公司类型动态切换。

二、安装与配置

1、安装包

composer require barryvdh/laravel-snappy

2、发布配置

php artisan vendor:publish --provider="Barryvdh\Snappy\ServiceProvider"

3、配置 wkhtmltopdf 路径

在 config/snappy.php 中设置 pdf.wrapper 的路径:

'pdf' => [
    'enabled' => true,
    'binary'  => '/usr/local/bin/wkhtmltopdf', // 根据实际路径修改
    'timeout' => false,
    'options' => [],
    'env'     => [],
],

三、创建 PDF 服务类

为避免控制器逻辑臃肿,将 PDF 生成逻辑封装为PdfService,核心功能包括:模板匹配、路径生成、动态页眉页脚配置。


namespace App\Services;

use Barryvdh\Snappy\PdfWrapper;
use Illuminate\Support\Facades\Storage;
use Exception;

class PdfService
{
   
    private $pdf;
    private $config;

    public function __construct(PdfWrapper $pdf)
    {
   
        $this->pdf = $pdf;
        $this->config = config('pdf');
    }

    public function generatePdf($data, $type)
    {
   
        try {
   
            // 获取模板配置
            $templateConfig = $this->getTemplateConfig($type);
            
            // 生成文件路径
            $filePath = $this->generateFilePath($templateConfig['filename_en']);
            
            // 生成PDF
            $this->pdf
                ->loadView($templateConfig['view'], ['data' => $data])
                ->setPaper('a4')
                ->setOrientation('portrait')
                ->setOption('encoding', 'UTF-8')
                ->setOption('header-html', view('qa_header.' . $data['company_type'] . '_header')->render())
                ->setOption(

你可能感兴趣的:(laravel,pdf,android)