Skip to content

Construire des extensions

L'architecture de TCPDF-Next est ouverte par conception. Les six extensions officielles (Artisan, Pro, Laravel, Symfony, CodeIgniter, Adaptation) utilisent les mêmes interfaces et points d'accroche disponibles pour tout développeur tiers.

Contrats d'interface

Votre extension devrait implémenter une ou plusieurs de ces interfaces :

PdfDocumentInterface

Le contrat de document principal. Implémentez ceci si vous construisez un moteur de document alternatif.

php
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

Implémentez ceci pour backends de signature personnalisés (HSM cloud, services de signature distants, etc.).

php
namespace Yeeefang\TcpdfNext\Contracts;

interface SignerInterface
{
    public function sign(string $data): SignatureResult;
    public function timestamp(string $signatureValue): string;
    public function supportsLtv(): bool;
}

HsmSignerInterface

Pour intégration de module de sécurité matériel :

php
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

Pour stratégies de chargement de polices personnalisées :

php
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;
}

Squelette d'extension

Voici une extension tierce minimale :

composer.json

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/"
        }
    }
}

Classe d'extension

php
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();
    }
}

Comment les extensions officielles se connectent

Fonctionnel

Artisan → Core

Le moteur de rendu Chrome est injecté via setChromeRendererConfig() sur la classe Document. Core stocke le moteur de rendu comme ?object — pas de dépendance de type sur Artisan.

Pro → Core

Les classes Pro comme LtvManager et PdfAManager opèrent sur BinaryBuffer et ObjectRegistry — les mêmes API internes que Core utilise. Le PadesOrchestrator accepte des paramètres optionnels Pro uniquement (CertificateChainValidator, OcspResponseVerifier).

Intégration framework

Laravel → Core

Le ServiceProvider crée un binding factory pour PdfDocumentInterface qui retourne une instance Document configurée. La Facade proxyfie les appels statiques vers l'instance résolue du conteneur.

Symfony → Core

Le TcpdfNextBundle enregistre PdfFactory comme service. Injectez-le via injection de constructeur ou l'attribut #[Autowire]. L'intégration Messenger dispatch GeneratePdfMessage pour génération asynchrone.

CodeIgniter → Core

Le TcpdfNextService s'enregistre dans le conteneur de services de CodeIgniter. Utilisez service('tcpdfnext') ou injectez via PdfLibrary dans les contrôleurs. L'intégration queue utilise le planificateur de tâches de CodeIgniter.

Compatibilité

Adaptation → Core

La classe adapter TCPDF étend une base non finale, mappant toutes les 252 méthodes legacy vers les équivalents TCPDF-Next. Les surcharges Header() et Footer() fonctionnent tel quel. Les classes helper legacy (TCPDF_STATIC, TCPDF_FONTS, TCPDF_COLORS, TCPDF_IMAGES) délèguent à l'API moderne.

Conventions d'espace de noms

Suivez le modèle de l'écosystème :

YourVendor\TcpdfNext{ExtensionName}\
├── YourMainClass.php
├── Config\
├── Exception\
└── ...

Utilisez les interfaces Yeeefang\TcpdfNext\Contracts\, jamais les classes internes Core\, pour vos frontières d'API publique.

Distribué sous licence LGPL-3.0-or-later.