Make a PDF of any Entity in Drupal - Review of the Entity Print Module

Créer un PDF de n'importe quelle entité dans Drupal - Revue du module Entity Print

Créer un fichier PDF dynamique est l'un des points les plus importants d'un projet. L'essentiel est de trouver la solution adéquate qui réponde à vos attentes et exigences. Dans cet article, nous vous présenterons l'un des modules de génération de PDF les plus populaires pour Drupal, qui vous sera utile pour générer, visualiser ou télécharger des rapports, articles et factures en PDF.

Dates

La première version du module a été publiée le 22 janvier 2015, la dernière mise à jour - 18 juin 2020.

Le module peut être installé sur :

  • Drupal 7 (version stable 7.x-1.5),
  • Drupal 8 et 9 (version stable 8.x-2.2).

Toutes les versions stables de ce projet sont couvertes par la politique de conseils de sécurité.

Popularité du module

Selon les statistiques d'utilisation de la page du module, il est actuellement utilisé par environ 12 000 sites.

Créateurs du module

Le module est créé et maintenu par benjy.

À quoi sert le module ?

Entity Print vous permet d'imprimer (sauvegarder) toute entité Drupal (Drupal 7 et 8) ou Vue (uniquement Drupal 8+) dans un fichier PDF. Il utilise les moteurs PDF basés sur des bibliothèques PHP populaires comme Dompdf, Phpwkhtmltopdf et TCPDF.

Déballage

  1. Pour installer Entity Print, allez sur sa page web ou faites-le via composer : 

    composer require "drupal/entity_print 2.x"
  2. Installez Dompdf en exécutant composer require

    composer require "dompdf/dompdf:0.8.0" 
  3. De plus, vous pouvez installer les moteurs Wkhtmltopdf et TCPDF.

    composer require "mikehaertl/phpwkhtmltopdf ~2.1" 
            composer require "tecnickcom/tcpdf ~6" 
  4. Activez le module Entity Print.
  5. Accordez des autorisations aux utilisateurs non-administrateurs pour télécharger les PDFs.
  6. Si nécessaire, activez le module Entity Print Views.
Les paramètres d'installation du module Entity Print Drupal

 

Configurer Entity Print

Voyons ce que permet de configurer ce module.

  • Activer le CSS par défaut - fournir quelques styles très basiques.
  • Forcer le téléchargement - forcer le navigateur à télécharger le fichier PDF.
  • PDF - sélectionner le moteur PDF par défaut pour l'impression.
  • Taille du papier - changer la taille de la page pour imprimer le PDF.
  • Orientation du papier - changer l'orientation en Paysage ou Portrait.
  • Activer le parseur HTML5 - Dompdf ne fonctionne pas sans que cette option ne soit activée.
  • Désactiver le journal - désactiver la journalisation de Dompdf dans log.html dans le répertoire temporaire de Drupal.
  • Activer les URLs distantes - doit être activé pour que le CSS et les images fonctionnent, à moins de manipuler la source manuellement.
  • CONFIGURATION SSL - peut être nécessaire uniquement pour le développement, en production vous ne devriez pas la changer.
  • AUTHENTIFICATION HTTP - si votre site web est derrière une authentification HTTP, vous pouvez définir le nom d'utilisateur/mot de passe.
  • EPub - sélectionnez le moteur EPub par défaut pour l'impression (actuellement non pris en charge, vous pouvez suivre le problème ouvert).
  • Document Word - sélectionnez le moteur de document Word par défaut pour l'impression (actuellement non pris en charge, suivez le problème ouvert).
La configuration du module Entity Print

 

Le moteur PDF de préférence est Dompdf, qui est (principalement) un moteur de mise en page HTML conforme à CSS 2.1, écrit en PHP. C'est un moteur basé sur le style, il téléchargera et lira donc des feuilles de style externes, des balises de style en ligne, et les attributs de style des éléments HTML individuels. Il prend également en charge la plupart des attributs HTML de présentation.

Utilisation du module

Après que le module soit correctement configuré et que toutes les autorisations soient définies, nous pouvons commencer à exporter des entités et des vues vers un fichier PDF.

Exportation d'entités

Entity Print ajoute un champ désactivé aux modes d'affichage de chaque type de contenu. Le champ a une valeur d'étiquette par défaut de "Afficher PDF". Pour rendre ce champ visible sur n'importe quel type de contenu, activez-le sur la page Gérer l'affichage

(/admin/structure/types/manage/[content_type]/display).

Activation du champ Afficher PDF sur la page Gérer l'affichage du module Entity Print

Dès maintenant, nous aurons un bouton afficher PDF ajouté à notre type de contenu. Le bouton URL est :

https://example.com/print/pdf/[entity_type]/[entity_id]

(c-à-d. https://example.com/print/pdf/node/1)

Option Afficher PDF visible dans un fichier PDF

 

Voici le PDF que nous souhaitons sauvegarder ou imprimer:

Exemple de fichier PDF à sauvegarder ou imprimer dans le module Entity Print Drupal

 

Exportation de vues

Avec le module Entity Print Views activé, une option "Imprimer" peut être ajoutée à l’en-tête ou au pied de page de la vue.

Le bouton URL ressemble à :

https://example.com/print/view/pdf/[view_id]/[display_id]

Ajout d'une option Imprimer globale à l'en-tête de la vue dans le module Entity Print

 

Débogage

Pour un débogage facile et rapide, Entity Print nous fournit une version HTML des entités envoyées au moteur PDF. L'URL ressemble à peu près à celle ci-dessus avec simplement /debug ajouté.

Par exemple, https://example.com/print/pdf/[entity_type]/[entity_id]/debug.

Comment masquer le lien Afficher PDF dans le fichier exporté

Par défaut, le lien "Afficher PDF" est également ajouté au PDF. Pour le supprimer, allez sur la page Gérer l'affichage pour le type de contenu spécifique. Dans la section Paramètres d'affichage personnalisé, vous devez activer le mode d'affichage PDF.

Paramètres d'affichage personnalisés dans le module Entity Print

 

Vous pouvez maintenant désactiver le champ Entity Print sur ce mode d'affichage. La prochaine fois que vous exporterez le PDF, le lien "Afficher PDF" ne sera plus inclus.

Par défaut, le mode d'affichage PDF est installé pour les nœuds uniquement. Si vous avez des entités personnalisées, vous devez d'abord créer un mode d'affichage PDF pour le type d'entité spécifique via "admin/structure/display-modes/view". Vous pouvez le nommer comme vous le souhaitez, mais souvenez-vous qu'un nom machine doit être "pdf", car il sera automatiquement préfixé avec le nom de l'entité.

Style du PDF depuis votre thème

Les exemples suivants montrent comment enregistrer des fichiers CSS entity_print depuis le fichier your_theme_name.info.yml. Vous pouvez le faire pour tout type d'entité ou même de vue.

#Ajouter une bibliothèque css à tous les nœuds :

entity_print: 
  node: 
    all: 'YOUR_THEME_NAME/print-styling' 

#Ajouter une bibliothèque CSS aux entités Node mais uniquement aux bundles d'articles :

entity_print: 
  node: 
    article: 'YOUR_THEME_NAME/print-styling' 

#Ajouter une bibliothèque CSS à toutes les vues :

entity_print: 
  view: 
    all: 'YOUR_THEME_NAME/print-styling' 

N'oubliez pas de définir une bibliothèque CSS dans votre YOUR_THEME_NAME.libraries.yml :

print-styling: version: VERSION css: theme: css/print-style.css: { } 

 

Modification des templates

Toutes les méthodes habituelles pour surcharger les templates sont disponibles. En utilisant les suggestions de hooks de thème, vous pouvez créer un template Twig et modifier le contenu de toute entité spécifique (par ex. node--blog-post--pdf.html.twig). Dans ce template, vous pouvez modifier le balisage comme vous le faites habituellement en utilisant {{ content.field_example }} ou {{ node.field_example }}.

Vous pouvez modifier la sortie HTML de l'ensemble du template Entity Print. Il suffit de copier le fichier entity-print.html.twig de son emplacement de base dans votre dossier de thème. En utilisant les suggestions de hooks de thème, vous pouvez également créer un fichier entity-print--node--[content-type].html.twig.

<html>
 <head>
   <meta charset="utf-8">
   <title>{{ title }}</title>
   {{ entity_print_css }}
 </head>
 <body>
   <div class="page">
     {{ content }}
   </div>
 </body>
</html>

Assurez-vous que {{ entity_print_css }} est toujours inclus à l'intérieur de la balise tag head dans votre fichier de template Twig personnalisé. Sinon, vos bibliothèques CSS personnalisées ne fonctionneront pas.

Moteurs PDF personnalisés

Il est intéressant de noter que les moteurs PDF Entity Print sont branchables. Cela signifie que vous pouvez facilement implémenter vos propres moteurs. Pour ce faire, vous devez créer une classe dans your_module_name/src/Plugin/EntityPrint/NewPdfEngine.php qui implémente Drupal\entity_print\Plugin\PrintEngineInterface avec tous ses méthodes requises. Après cela, votre plugin sera disponible dans la liste de sélection des moteurs sur la page de configuration.

Solutions alternatives

Il existe quelques autres options pour créer un PDF d'une entité dans Drupal que vous pourriez envisager d'étudier.

PrintFriendly & PDF est un plugin pour Drupal 7, 8 et 9. Ci-dessous, vous trouverez sa liste de fonctionnalités :

  • Il est entièrement personnalisable.
  • Avec l'option On-Page-Lightbox, le fichier PDF s'ouvre dans une lightbox.
  • Il vous permet d'imprimer ou de récupérer un PDF.
  • Vous pouvez modifier la page avant de l'imprimer ou de récupérer un PDF, par exemple en supprimant les images et les paragraphes dont vous n'avez pas besoin.

Versions imprimante et PDF pour Drupal 8+ est un module qui fonctionne également pour Drupal 9. Il vous permet de générer les versions suivantes adaptées à l'impression de n'importe quel nœud :

  • version imprimante de la page web (à /node/[node_id]/printable/print),
  • version PDF (à /node/[node_id]/printable/pdf).

Bibliothèques supportées :

  • mPDF,
  • TCPDF,
  • wkhtmltopdf,
  • dompdf.

Résumé

Le module Entity Print offre plusieurs méthodes d'exportation des entités vers des PDFs via différents moteurs PDF. C'est un module très flexible et personnalisable qui vous aidera dans la génération dynamique de vos articles, factures ou autres contenus liés à votre site web Drupal. Le module a une couverture de test complète et est prêt à être utilisé en production pour Drupal 7, 8 et 9.

As part of Drupal support, we maintain existing websites and expand them with new functionalities