Génération PDF en PHP / Symfony : Les 4 critères déterminants pour choisir le bon outil

Génération PDF en PHP / Symfony : Les 4 critères déterminants pour choisir le bon outil

Le besoin de génération des documents PDF dans une application informatique devient de plus en plus demandé depuis la normalisation ISO du format en 2008. Plusieurs outils de génération sont disponibles sous php/symfony. Le choix de celui le plus adéquat dépend de certains critères déterminants. L’identification et l’analyse de ces critères clés font l’objet du présent article.

Commençons par PHP On peut classer en deux catégories les différents outils permettant la génération des documents PDF:

  • Les outils de création

Ils offrent des fonctionnalités de dessin pour créer un fichier PDF à partir d’une description PHP. En voici quelques exemples :

  1. FPDF

Propriétés: – Librairie open source écrite en PHP 4. – Ne dépend pas d’une librairie extérieure. – Permet de générer des fichiers PDF directement à partir de scripts PHP. – Une des bibliothèques les plus connues et les plus utilisées. – Assure les principales fonctionnalités (Choix des unités, choix du format des pages et des marges, gestion des en-têtes et pieds de page, saut de page automatique, saut de ligne automatique et justification, images (JPEG et PNG), couleurs, liens, gestion des polices TrueType et Type1 et compression des pages). – N’est pas adapté dans le cas de documents particulièrement lourds ou complexes. Cas d’usage : La génération d’un document pdf simple à partir d’un HTML rudimentaire et ne nécessitant pas des fonctions de dessin particulières telles que la génération des tableaux.

  1. TCPDF

Propriétés: – Librairie open source écrite en PHP 5, fortement inspirée de FPDF. – Supporte l’encodage UTF-8, l’unicode, les langues RTL (right to left), XHTML, le javascript, les signatures numériques. – Fournit l’essentiel des fonctionnalités de dessin. – D’utilisation très répandue et est intégrée dans des différents CMS et frameworks (Joomla, Drupal, Moodle …). Cas d’usage: – Les applications ne demandant pas des fonctions de dessin avancées telles que les arrières plan et les tableaux complexes. – Convient parfaitement aux besoins de reproduction de textes avec caractères spéciaux, écriture bidirectionnelle et écriture de droite à gauche.

  1. FPDI

Propriétés: – Une surcouche à FPDF ou TCPDF. – Permet de lire des pages PDF et de les utiliser comme étant des templates pour la génération des documents. – Le PDF final est une instance d’un objet FPDF ou TCPDF, ce qui permet de le personnaliser directement avec les méthodes de la classe parente, par exemple pour réaliser des en-têtes / pieds de pages automatiques. – Il y en a encore des solutions payantes comme par exemple PDFlib et ClibPDF. Cas d’usage: – Fusionner plusieurs pages PDF (templating). – Réaliser des en-têtes/pieds de pages automatiques. Ces bibliothèques offrent déjà une solution certes plus conviviale que la libraire PDF de base fournie avec PHP, mais cela nécessite toujours de décrire le PDF en utilisant des fonctions de dessin. Il faut donc calculer les dimensions et positions de tous les éléments au millimètre près. BANNIERE_ARTICLE_v08122017

  • Les outils de conversion

La conversion HTML vers PDF semble être la solution la plus adéquate surtout pour la génération des documents dans une application web dans la mesure où elle permettrait de rester le plus proche du projet du côté templating, css, … Elle permet de réaliser la mise en page du document entièrement en HTML ce qui est plus pratique que de manipuler des fonctionnalités de dessins en PHP. Dans cette catégorie, on trouve :

  1. DOMPDF

Propriétés: – Un convertisseur HTML vers PDF écrit en PHP5. – Respecte au mieux les styles CSS tout en assurant des fonctionnalités utiles pour l’impression (saut de page, numéro de page, couleurs CMJN, formats de page, résolution des images, etc). – Consiste à télécharger et lire les feuilles de style (incluses, locales, ou distantes), les balises, et les attributs des éléments individuels HTML pour ensuite les insérer dans le document PDF résultant. – Supporte la plupart des propriétés CSS 2.1 et quelques CSS3 ainsi que la plupart des attributs HTML de présentation. – N’est pas compatible avec les codes HTML non standardisés. Cas d’usage: Convient bien aux cas de conversion de document HTML avec tables complexes (avec span, modèles de bordures et styles de cellules) et images gif, png, bmp et jpeg.

  1. HTML2PDF 

Propriétés: – Un convertisseur open source HTML vers PDF écrit en PHP4 (utilise FPDF) et PHP5 (utilise TCPDF). – Pas possible de convertir directement n’importe quelle page HTML telle qu’elle est (rendu non garanti). Cas d’usage: – Facilite la création des fichiers pdf mais ne convertit pas directement une page HTML. – Exemple : génération des factures.

  1. MPDF

Propriétés: – Un ensemble de classes basées sur les outils FPDF et HTML2PDF. – En utilisant du PHP simple, elle permet une création et conversion simples des pages HTML (encodage UTF-8) en des fichiers PDF. Cas d’usage: Les applications utilisant le HTML simple avec les fonctions basiques.

  1. WKHTMLTOPDF

Propriétés: – Un outil exécutable en ligne de commande. – Convertit une URL quelconque en document PDF. – Accepte un nombre élevé de paramètres (orientation et dimensions de la page, marges, en-tête, pied de page, etc.). – Supporte parfaitement le HTML et le CSS et même le JavaScript. – Apporte un gain de productivité énorme comparé aux solutions classiques. – Nécessite l’installation de dépendances, il faut donc avoir la main sur l’hébergement (serveur dédié ou virtuel requis, un hébergement mutualisé n’est pas suffisamment souple). – Requiert l’exécution d’un binaire externe à l’application web, brèche potentielle dans la politique de sécurité. Cas d’usage: Les applications avec HTML riche et CSS évolués.

BANNIERE_ARTICLE_v08122017

Qu’en est-il de Symfony? Certes , les convertisseurs HTML vers PDF sont des solutions puissantes et fonctionnelles en théorie, la mise en page étant entièrement réalisée en HTML (donc facile à faire), mais, leur utilisation peut très vite devenir complexe quand il s’agit d’une mise en forme parfaite du contenu. Pourquoi ? Car les feuilles CSS ne sont pas entièrement prises en charge par le format pdf qui va se limiter à l’interprétation des éléments basiques de ce langage : En conséquent, le rendu de la conversion ne sera pas fidèle au HTML de départ. Avec Symfony, il existe pas mal de solutions de conversion de HTML vers PDF. Elles reposent essentiellement sur les outils PHP décrits précédemment. Des bundles ont été créés autour pour faciliter la manipulation et la génération des PDF. Le choix final d’une solution ou de l’autre dépend des objectifs de l’application et des contraintes de réalisation. Ci-dessous un récapitulatif résumant les propriétés des principaux Bundles Symfony:

  • WhiteOctoberTCPDF

– Librairie de base: TCPDF / License MIT. – Facilite l’utilisation de la librairie TCPDF dans un projet Symfony2 pour la génération des fichiers PDF. – Aucune dépendance externe. – Qualité du rendu moyenne : Nécessite la manipulation des fonctionnalités de dessin en PHP.

  • EnseparHtml2pdf

– Librairie de base: HTML2PDF. – Donne la main aux développeurs Symfony2 pour utiliser la librairie HTML2PDF dans leurs projets. – Permet d’enregistrer un service avec un ensemble de paramètres configurables dans le fichier de configuration Symfony2. – Aucune dépendance externe. – Plus dédié à la conversion que WhiteOctoberTCPDFBundle. – Avoir un rendu de conversion parfait est soumis à une condition : Avoir un code HTML de départ strictement normalisé (aucun écart n’est toléré).

  • MpdfPort

– Librairie de base: MPDF. – Possibilité de générer des documents PDF dans Symfony2 sans installation de convertisseurs externes sur une machine serveur. – Supporte plus de CSS que HTML2PDF et FPDF. – Lent.

  • KnpSnappy

– Librairie de base: WKHTMLTOPDF. – Il supporte tout le HTML, CSS et le JavaScript ; Il permet de générer soit des fichiers PDF ou des images à partir des documents HTML en utilisant le moteur de WebKit. – Le KnpSnappyBundle permet une intégration simple de wkhtmltopdf dans un projet Symfony2. – Rendu identique à l’origine HTML. – Rapide. – Exige l’installation d’un webkit sur le système.

Les cas d’utilisation des Buldnles sus-cités sont les mêmes que leurs librairies d’origine.

Que peut-on conclure? Le choix d’un outil de génération PDF est donc tributaire de certains critères clés :

  • Le type et la complexité des données à reproduire sur le document pdf final depuis le HTML :
  1. Formes (texte, tableaux, images).
  2. Encodage des textes (UTF-8, langage RTL etc …).
  • La compatibilité avec le HTML/CSS utilisés et le degré de complexité ou la normalisation de ces derniers.
  • Le seuil d’exigence sur la conformité du document produit : est ce qu’on peut tolérer certaines différences avec le document d’ori gine ou bien qu’on exige une reproduction strictement fidèle du contenu.
  • La présence ou non de dépendances externes.

La génération des pdf pour l’application Coopérons! Dans cette application, on a souvent besoin de générer certaines pages HTML en pdf (notamment les factures,  attestations et contrats personnalisables). L’application utilise initialement la librairie TCPDF et le Bundle WhiteOctoberTCPDF. Le client souhaite résoudre la problématique majeure : non support de tout le HTML et CSS3 d’où un pdf non conforme au HTML de départ. Le besoin était donc d’obtenir un rendu pdf conforme au HTML lors de la conversion, ainsi qu’une intégration facile de la solution. L’équipe Fondative a opté pour le Bundle knpsnappy de la bibliothèque Wkhtmltopdf, vu qu’il répond parfaitement au besoin client et aux contraintes de réalisation (intégration facile dans un projet Symfony 2):

    • Numérotation des pages.
    • Intégration de deux types de headers/footers (Un pour la première page et un différent pour le reste).
    • Disposition des données sur les pages : si la longueur d’une page permet d’inclure toute une table, cette dernière ne doit pas être divisée sur 2 pages.
    • Un rendu de qualité identique à la mise en forme HTML.
    • Compatibilité avec tous les environnements Windows / Linux / Mac.
BANNIERE_ARTICLE_v08122017

Laisser un commentaire