You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel9+PHP8.1下TCPDF多产品类PDF页面合并方案咨询

基于TCPDF的Laravel产品标签多类型单PDF生成方案

问题描述

在Laravel 9(PHP8.1)环境中使用TCPDF生成产品标签PDF,原逻辑为初始化TCPDF后逐产品调用addPage(),最后通过output()直接下载。现需针对不同产品类型调整标签内容,计划将各类型的渲染逻辑拆分到独立类,但要求最终生成单个PDF文件且不落地磁盘直接下载,同时排除FPDF/FPDI方案(担心兼容性及磁盘依赖问题)。

实现方案

1. 定义统一渲染接口

创建接口规范所有产品类型的渲染方法,确保不同类型的标签类遵循相同调用逻辑:

// app/Pdf/ProductLabelRenderer.php
namespace App\Pdf;

use TCPDF;

interface ProductLabelRenderer
{
    public function render(TCPDF $pdf): void;
}

2. 实现各产品类型渲染类

针对每种产品类型,编写独立的渲染类,在render方法中实现该类型标签的专属布局逻辑:

// app/Pdf/Types/ElectronicLabelRenderer.php
namespace App\Pdf\Types;

use App\Pdf\ProductLabelRenderer;
use TCPDF;

class ElectronicLabelRenderer implements ProductLabelRenderer
{
    private $product;

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

    public function render(TCPDF $pdf): void
    {
        $pdf->AddPage();
        $pdf->SetFont('helvetica', 'B', 16);
        $pdf->Cell(0, 10, '电子设备标签', 0, 1, 'C');
        $pdf->SetFont('helvetica', '', 12);
        $pdf->Cell(0, 8, "型号: {$this->product->model}", 0, 1);
        $pdf->Cell(0, 8, "序列号: {$this->product->serial}", 0, 1);
        // 其他电子类专属内容绘制...
    }
}

示例食品类标签渲染类:

// app/Pdf/Types/FoodLabelRenderer.php
namespace App\Pdf\Types;

use App\Pdf\ProductLabelRenderer;
use TCPDF;

class FoodLabelRenderer implements ProductLabelRenderer
{
    private $product;

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

    public function render(TCPDF $pdf): void
    {
        $pdf->AddPage();
        $pdf->SetFont('stsongstdlight', 'B', 16);
        $pdf->Cell(0, 10, '食品标签', 0, 1, 'C');
        $pdf->SetFont('stsongstdlight', '', 12);
        $pdf->Cell(0, 8, "名称: {$this->product->name}", 0, 1);
        $pdf->Cell(0, 8, "保质期: {$this->product->expiry_date}", 0, 1);
        // 其他食品类专属内容绘制...
    }
}

3. 核心PDF生成器类

负责TCPDF初始化、产品-渲染类匹配、批量渲染及直接输出:

// app/Pdf/ProductLabelPdfGenerator.php
namespace App\Pdf;

use TCPDF;

class ProductLabelPdfGenerator
{
    private $pdf;

    public function __construct()
    {
        // 初始化TCPDF,可根据标签尺寸调整参数(示例为A6竖版)
        $this->pdf = new TCPDF('P', 'mm', 'A6', true, 'UTF-8', false);
        $this->pdf->SetMargins(5, 5, 5);
        $this->pdf->SetAutoPageBreak(true, 5);
        $this->pdf->setPrintHeader(false);
        $this->pdf->setPrintFooter(false);
    }

    public function addProduct($product): void
    {
        $rendererClass = $this->getRendererClass($product->type);
        $renderer = new $rendererClass($product);
        $renderer->render($this->pdf);
    }

    private function getRendererClass(string $productType): string
    {
        // 产品类型与渲染类的映射,新增类型只需在此添加
        $map = [
            'electronic' => \App\Pdf\Types\ElectronicLabelRenderer::class,
            'food' => \App\Pdf\Types\FoodLabelRenderer::class,
        ];

        if (!isset($map[$productType])) {
            throw new \InvalidArgumentException("不支持的产品类型: {$productType}");
        }

        return $map[$productType];
    }

    public function download(string $filename = 'product_labels.pdf'): void
    {
        // 直接输出下载,'D'参数表示浏览器下载,不保存到磁盘
        $this->pdf->Output($filename, 'D');
        exit;
    }
}

4. 控制器调用示例

在Laravel控制器中整合逻辑,接收产品列表并触发下载:

// app/Http/Controllers/ProductLabelController.php
namespace App\Http\Controllers;

use App\Pdf\ProductLabelPdfGenerator;
use Illuminate\Http\Request;

class ProductLabelController extends Controller
{
    public function generate(Request $request)
    {
        // 获取选中的产品(示例从请求ID列表查询)
        $products = \App\Models\Product::whereIn('id', $request->input('product_ids'))->get();

        $generator = new ProductLabelPdfGenerator();
        foreach ($products as $product) {
            $generator->addProduct($product);
        }

        return $generator->download('批量产品标签.pdf');
    }
}

方案优势

  • 完全基于TCPDF,无需引入额外类库,兼容PHP8.1与Laravel9
  • 全程内存操作,无磁盘写入,直接输出下载
  • 扩展性强:新增产品类型只需实现ProductLabelRenderer接口,无需修改核心逻辑
  • 职责分离:各类型标签逻辑独立,代码易维护

内容的提问来源于stack exchange,提问作者exe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 01:25:38