Aller au contenu

Intégration de NextPDF avec Symfony

Installe nextpdf/symfony, laisse Flex enregistrer le bundle (ou enregistre-le toi-même), ajoute config/packages/nextpdf.yaml, puis injecte PdfFactory. Cette page sert d’index pour l’intégration. Chaque étape renvoie à une page plus détaillée.

Fenêtre de terminal
composer require nextpdf/symfony

Le bundle requiert nextpdf/core^3.0 || ^5.2, symfony/*^7.2 et psr/log^3.0. Les classes sont autochargées sous le préfixe PSR-4 NextPDF\Symfony\, mappé sur src/Symfony/. Un autoloader PSR-4 résout le préfixe de namespace en le faisant correspondre à ce répertoire de base (PSR-4 §2). Pour la liste complète des dépendances et des packages optionnels, voir /integrations/symfony/install/.

Avec Symfony Flex, l’entrée extra.symfony.bundles du composer.json du bundle enregistre NextPDF\Symfony\NextPdfBundle pour tous les environnements. Sans Flex, ajoute-le toi-même à config/bundles.php :

return [
NextPDF\Symfony\NextPdfBundle::class => ['all' => true],
];

Pour la séquence de démarrage complète et le comportement de la passe de compilation, voir /integrations/symfony/boot-and-discovery/.

Le fichier config/services.php du bundle enregistre ces services :

Service / aliasCycle de vie
NextPDF\Symfony\Service\PdfFactorypartagé, public — injecte ce service
nextpdf.documentPdfDocumentInterfaceDocumentnon partagé, public — nouveau à chaque résolution
NextPDF\Contracts\FontRegistryInterfacepartagé, verrouillé après le préchauffage
NextPDF\Graphics\ImageRegistrypartagé, kernel.reset
NextPDF\Contracts\DocumentFactoryInterfacepartagé
NextPDF\Symfony\Http\PdfResponseassistant public sans état

La liaison du document est non partagée à dessein. PSR-11 autorise un conteneur à renvoyer une valeur différente lors d’appels get() successifs pour un même identifiant. Un nouveau document évite l’état partagé entre les requêtes dans les workers de longue durée (PSR-11 §1.1.2). Pour le tableau complet des services et des alias, y compris les liaisons EInvoice conditionnelles, voir /integrations/symfony/configuration/.

L’alias de configuration est nextpdf. Crée config/packages/nextpdf.yaml. Quand une recipe Flex est publiée, elle dépose pour toi une copie par défaut. Chaque clé a une valeur par défaut, donc un fichier minimal ressemble à ceci :

nextpdf: ~

L’arbre de configuration complet est documenté dans /integrations/symfony/configuration/.

Injecte PdfFactory, puis renvoie le résultat via PdfResponse :

src/Controller/PdfController.php
<?php
declare(strict_types=1);
namespace App\Controller;
use NextPDF\Symfony\Http\PdfResponse;
use NextPDF\Symfony\Service\PdfFactory;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
final class PdfController
{
#[Route('/hello.pdf', name: 'hello_pdf')]
public function hello(PdfFactory $pdf): Response
{
$doc = $pdf->create();
$doc->addPage();
$doc->cell(0, 10, 'Hello from NextPDF on Symfony.');
return PdfResponse::inline($doc, 'hello.pdf');
}
}

Pour un contrôleur de bout en bout et le parcours asynchrone via Messenger, voir /integrations/symfony/quickstart/.

Vérifie le câblage sans écrire aucun code applicatif :

Fenêtre de terminal
php bin/console debug:container nextpdf
php bin/console debug:config nextpdf
php bin/console lint:container

debug:container nextpdf doit lister PdfFactory, l’alias nextpdf.document et les registres. lint:container vérifie que chaque argument de service peut être résolu. Pour tester la génération, ajoute le contrôleur ci-dessus puis envoie une requête à /hello.pdf.

Voici les symboles publics pris en charge pour le code applicatif :

SymboleRôle
NextPDF\Symfony\Service\PdfFactory::create()nouveau et préconfiguré : Document
NextPDF\Symfony\Http\PdfResponse::inline() / download()réponse mise en mémoire tampon avec en-têtes de sécurité
NextPDF\Symfony\Http\PdfResponse::streamInline() / streamDownload()réponse diffusée en flux par fragments
NextPDF\Symfony\Message\GeneratePdfMessageDTO de génération asynchrone (validé)
NextPDF\Symfony\Message\PdfBuilderInterfacecontrat de builder résolu par le handler

Chaque ligne est une assertion normative formulée sur cette page. Chaque assertion est rattachée à un reference_id complet de 64 caractères hexadécimaux issu du corpus SDO sous accès contrôlé. La provenance (manifeste du corpus, transport de récupération) se trouve dans _sidecars/rag-citations.yaml.

SpécificationClausereference_idAssertion
PSR-11psr_11_container#1.1.2.p4Contrat d’identifiant has()/get() du conteneur
PSR-4psr_4_autoload#x1.x2.p5Mappage de namespace de l’autoloader
  • /integrations/symfony/install/ — dépendances et enregistrement.
  • /integrations/symfony/boot-and-discovery/ — découverte, démarrage, passe de compilation.
  • /integrations/symfony/configuration/ — schéma complet et tableau des services.
  • /integrations/symfony/quickstart/ — contrôleur exécutable et exemple asynchrone.
  • /integrations/symfony/production-usage/ — sécurité des workers et diffusion en flux.