Создание расширений
Архитектура TCPDF-Next открыта по замыслу. Шесть официальных расширений (Artisan, Pro, Laravel, Symfony, CodeIgniter, Adaptation) используют те же интерфейсы и точки подключения, доступные любому стороннему разработчику.
Контракты интерфейсов
Ваше расширение должно реализовывать один или несколько из этих интерфейсов:
PdfDocumentInterface
Основной контракт документа. Реализуйте его, если создаёте альтернативный движок документов.
namespace Yeeefang\TcpdfNext\Contracts;
interface PdfDocumentInterface
{
public function addPage(?PageSize $size = null, Orientation $orientation = Orientation::Portrait): static;
public function setMargins(Margin $margin): static;
public function setFont(string $family, string $style = '', float $size = 12.0): static;
public function cell(float $width, float $height, string $text = '', ...): static;
public function multiCell(float $width, float $height, string $text, ...): static;
public function writeHtml(string $html): static;
public function image(string $file, ...): static;
public function output(?string $filename = null, OutputDestination $dest = OutputDestination::Inline): string;
public function save(string $path): void;
}SignerInterface
Реализуйте для пользовательских бэкендов подписания (облачные HSM, удалённые сервисы подписания и т.д.).
namespace Yeeefang\TcpdfNext\Contracts;
interface SignerInterface
{
public function sign(string $data): SignatureResult;
public function timestamp(string $signatureValue): string;
public function supportsLtv(): bool;
}HsmSignerInterface
Для интеграции с аппаратными модулями безопасности:
namespace Yeeefang\TcpdfNext\Contracts;
interface HsmSignerInterface
{
public function sign(string $data, string $algorithm = 'sha256WithRSAEncryption'): string;
public function getCertificateDer(): string;
public function getCertificateChainDer(): array;
public function getPublicKeyAlgorithm(): string;
}FontManagerInterface
Для пользовательских стратегий загрузки шрифтов:
namespace Yeeefang\TcpdfNext\Contracts;
interface FontManagerInterface
{
public function registerFont(string $fontFile, string $alias = '', int $fontIndex = 0): FontInfo;
public function getFont(string $family, string $style = ''): ?FontInfo;
public function subset(FontInfo $font, string $text): string;
public function getRegisteredFonts(): array;
public function addFontDirectory(string $directory): void;
}Каркас расширения
Вот минимальное стороннее расширение:
composer.json
{
"name": "your-vendor/tcpdf-next-watermark",
"description": "Advanced watermark extension for TCPDF-Next",
"type": "library",
"require": {
"php": "^8.5",
"yeeefang/tcpdf-next": "^1.7"
},
"autoload": {
"psr-4": {
"YourVendor\\TcpdfNextWatermark\\": "src/"
}
}
}Класс расширения
namespace YourVendor\TcpdfNextWatermark;
use Yeeefang\TcpdfNext\Core\Document;
use Yeeefang\TcpdfNext\Graphics\Color;
final class WatermarkExtension
{
public function apply(
Document $document,
string $text,
float $angle = 45.0,
float $opacity = 0.15,
): Document {
return $document
->startTransform()
->setAlpha($opacity)
->rotate($angle, $document->getPageWidth() / 2, $document->getPageHeight() / 2)
->setFontSize(60)
->setTextColor(200, 200, 200)
->text(
$document->getPageWidth() / 4,
$document->getPageHeight() / 2,
$text,
)
->stopTransform();
}
}Как подключаются официальные расширения
Функциональные
Artisan -> Core
Chrome-рендерер внедряется через setChromeRendererConfig() в классе Document. Core хранит рендерер как ?object — без типовой зависимости от Artisan.
Pro -> Core
Классы Pro, такие как LtvManager и PdfAManager, работают с BinaryBuffer и ObjectRegistry — теми же внутренними API, которые использует Core. PadesOrchestrator принимает опциональные параметры, доступные только в Pro (CertificateChainValidator, OcspResponseVerifier).
Интеграция с фреймворками
Laravel -> Core
ServiceProvider создаёт привязку фабрики для PdfDocumentInterface, возвращающую настроенный экземпляр Document. Facade проксирует статические вызовы к экземпляру, разрешённому из контейнера.
Symfony -> Core
TcpdfNextBundle регистрирует PdfFactory как сервис. Внедряйте через конструктор или атрибут #[Autowire]. Интеграция с Messenger отправляет GeneratePdfMessage для асинхронной генерации.
CodeIgniter -> Core
TcpdfNextService регистрируется в сервис-контейнере CodeIgniter. Используйте service('tcpdfnext') или внедряйте через PdfLibrary в контроллерах. Интеграция с очередью использует планировщик задач CodeIgniter.
Совместимость
Adaptation -> Core
Класс-адаптер TCPDF наследует non-final базовый класс, отображая все 252 устаревших метода на эквиваленты TCPDF-Next. Переопределения Header() и Footer() работают как есть. Устаревшие вспомогательные классы (TCPDF_STATIC, TCPDF_FONTS, TCPDF_COLORS, TCPDF_IMAGES) делегируют современному API.
Конвенции пространств имён
Следуйте паттерну экосистемы:
YourVendor\TcpdfNext{ExtensionName}\
├── YourMainClass.php
├── Config\
├── Exception\
└── ...Используйте интерфейсы Yeeefang\TcpdfNext\Contracts\, а не внутренние классы Core\, для границ вашего публичного API.