定制 phpsoftbox/pdf 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

phpsoftbox/pdf

Composer 安装命令:

composer require phpsoftbox/pdf

包简介

PDF rendering component for the PhpSoftBox framework

README 文档

README

Компонент генерации PDF для PhpSoftBox.

Назначение

  • рендерить HTML в PDF через Chromium (Gotenberg);
  • задавать точные размеры страницы (в т.ч. термоэтикетки);
  • отделить движок рендера интерфейсом PdfRendererInterface;
  • отдавать PDF и для просмотра в браузере (inline), и для скачивания (attachment).

Почему Gotenberg

Gotenberg это HTTP-сервис, который использует Chromium для печати HTML в PDF.

Плюсы для нашего кейса:

  • современный рендер CSS/HTML (включая @page, print-стили);
  • точные размеры листа/этикетки, поля, масштаб;
  • отдельный процесс/контейнер, не нагружает PHP-процесс браузерным runtime;
  • хорошо масштабируется горизонтально под batch-задачи.

В пакете реализован адаптер:

  • PhpSoftBox\Pdf\Gotenberg\GotenbergHtmlPdfRenderer
  • endpoint по умолчанию: /forms/chromium/convert/html

Быстрый старт

use PhpSoftBox\Pdf\Gotenberg\GotenbergHtmlPdfRenderer;
use PhpSoftBox\Pdf\PdfMargins;
use PhpSoftBox\Pdf\PdfPageSize;
use PhpSoftBox\Pdf\PdfRenderOptions;
use PhpSoftBox\Pdf\PdfUnit;

$renderer = new GotenbergHtmlPdfRenderer(
    client: $client,
    requestFactory: $requestFactory,
    streamFactory: $streamFactory,
    baseUrl: 'http://gotenberg:3000',
);

$document = $renderer->renderHtml(
    html: '<html><body>Этикетка #1</body></html>',
    options: new PdfRenderOptions(
        pageSize: new PdfPageSize(58, 40, PdfUnit::Mm),
        margins: PdfMargins::all(1, PdfUnit::Mm),
        printBackground: true,
    ),
);

Хелпер для этикеток:

$options = PdfRenderOptions::labelMm(58, 40, marginMm: 1);

Возврат PDF в HTTP-ответ

Для этого есть PdfHttpResponder.

use PhpSoftBox\Pdf\Http\PdfHttpResponder;

$responder = new PdfHttpResponder($responseFactory, $streamFactory);

// Просмотр в браузере
$response = $responder->inline($document, 'label.pdf');

// Скачивание файла
$response = $responder->download($document, 'label.pdf');

Компонент сам выставляет:

  • Content-Type;
  • Content-Length;
  • Content-Disposition (inline или attachment);
  • Cache-Control.

Большие batch-задачи (1000+ страниц)

Рекомендуемая стратегия:

  1. Генерировать PDF в фоне через очередь (Queue), не в HTTP-запросе.
  2. Делить задание на чанки по страницам/этикеткам.
  3. Сохранять каждый чанк как отдельный PDF в Storage.
  4. По завершении формировать индекс/архив или выдавать ссылки на части.

Для разбиения по диапазонам страниц есть:

  • PdfChunkPlanner::split(totalPages, pagesPerChunk).

Пример:

use PhpSoftBox\Pdf\Batch\PdfChunkPlanner;

$chunks = PdfChunkPlanner::split(totalPages: 1200, pagesPerChunk: 250);
// 1-250, 251-500, 501-750, 751-1000, 1001-1200

Тестовые артефакты PDF

В пакете предусмотрен каталог для артефактов интеграционных тестов:

  • local/tests/pdf

Он уже настроен через .gitignore, поэтому бинарные PDF не попадут в git.

Чтобы включить сохранение артефактов в интеграционных тестах:

PDF_TEST_SAVE_ARTIFACTS=1 vendor/bin/phpunit

Рекомендации для термопечати

  • Всегда явно задавайте PdfPageSize и PdfMargins.
  • Отключайте лишние отступы в CSS и используйте print-стили.
  • Для пиксельной точности этикеток тестируйте шаблон на целевом принтере.

统计信息

  • 总下载量: 2
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 4
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2026-04-10

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固