đȘđ§Ÿ Remplir un template PDF avec Pdftk.
Au programme aujourdâhui :
Remplir un template PDF avec Pdftk. par Stanislas
Temps de lecture : 5 minutes
Hello les petits Biscuits !
Bienvenue sur la 30Úme édition de Ruby Biscuit.
Vous ĂȘtes maintenant 555 abonnĂ©s đ„ł
Maintenant Ruby biscuit, câest aussi votre meilleur alliĂ© pour recruter des devs Ruby !
Si vous nâavez pas encore rejoint le club, RDV sur https://recrutement.rubybiscuit.fr
Bonne lecture.
Remplir un template PDF avec Pdftk
Bonjour Ă tous ! Ce mois-ci nous allons voir comment remplir dynamiquement un template PDF, c'est parti đđ»
Mise en place
Nous allons avoir besoin d'installer pdftk sur notre machine, sur lequel se base la gem pdf_forms
Ătapes :
1. Installation de pdftk et pdf_forms
2. Configuration Ă mettre en place
3. Comprendre comment assigner les variables sur le PDF
4. Création d'un dictionary pour assigner les variables
5. Génération du PDF
Pré-requis : Doc PDF avec variables assignées.
1) Installation de pdftk et pdf_forms
â Installer pdftk sur sa machine avec
brew install pdftk-java Pourquoi suffixer avec java ? Parce homebrew nous le conseille sur Mac Ă partir du M1 .
â ïž Par dĂ©faut homebrew va vouloir faire un update gĂ©nĂ©ral, pour Ă©viter cela et se prĂ©munir de conflits potentiels on va pouvoir prĂ©fixer avec HOMEBREW_NO_AUTO_UPDATE=1.
HOMEBREW_NO_AUTO_UPDATE=1 brew install pdftk-javaâ Mettre pdf-forms dans le Gemfile et bundle install
2) Configuration Ă mettre en place
Ă mettre dans application.rb đ
Se créer un petit poro dans le dossier qui vous arrange à l'interieur de app/ pour qu'il soit autoloadé.
3) Comprendre comment assigner les variables sur le PDF
Maintenant qu'on a fait la mise en place et qu'on a un PDF vide, comment va-t-on pouvoir dire qu'on veut telle donnée à tel endroit ?
Tout se passe dans la configuration du PDF, et plus précisément dans la partie "Préparer un formulaire" sur Adobe Acrobat (ou bien sejda, voir fin de l'article).
Une fois que vous avez créé votre champ, accédez aux "propriétés" de ce dernier :
â Pour les champs string pas trop de soucis de ce cĂŽtĂ© lĂ , vous pouvez les appeler comme vous voulez. Par exemple profile_type, civility, toto, etc. Attention tout de mĂȘme Ă ne pas avoir de doublon.
â En revanche pour les checkboxes soyez attentifs. MĂȘme si l'on peut Ă©galement les appeler comme on le souhaite, first_checkbox par exemple, vous allez devoir renseigner une "valeur d'exportation". Cette derniĂšre dĂ©terminera si la checkbox est cochĂ©e ou non. Dans l'exemple suivant, j'ai choisi 1. En d'autres termes, une autre valeur que 1 n'aura aucun effet.
4) Création d'un dictionary pour assigner les variables
Maintenant qu'on a configuré les champs dans le PDF il va falloir les remplir, et pour cela on va se créer un dictionary nous permettre d'extraire la logique de mise en forme des données dans un objet dont c'est la seule responsabilité et qui sera trÚs facilement testable. Celui-ci va nous renvoyer un hash que l'on pourra utiliser pour la génération du document.
Si l'on reprend les champs précédemment cités cela donnera :
Maintenant si l'on est pas certain du nom des champs ou bien que l'on souhaite vérifier leurs noms dans notre document, nous pouvons exécuter les commandes suivantes :
pdftk = PdfForms.new
pdftk.get_field_names(mon_document.download)Ce qui va nous retourner un array avec le nom des champs présents dans le PDF :
["profile_type",
"civility",
"toto",
"first_checkbox"]Pratique pour éviter les confusions !
5) Génération du PDF
Tout est en place, il ne reste plus qu'à générer notre document et l'enregistrer en db. Vous pouvez vous créer un service comme suit :
Plus que le fichier de test :
NB : La version originale de pdftk est obsolÚte sur Linux en raison de sa dépendance à GCJ et a été retirée de plusieurs dépÎts. En alternative, pdftk-java, une réécriture en Java, est activement maintenu et compatible avec les distributions modernes.
Tada đ
Quelques resources :
La gem pdf-forms oĂč l'on peut trouver quelques calls Ă faire Ă
pdftkSejda pour créer/nommer des champs et se passer de Adobe Acrobat
â Stanislas










Excellente NL, comme d'habitude... =)