J'ai des formulaires PDF que je veux remplir automatiquement avec des données provenant de mon application web Django et que je propose ensuite à l'utilisateur de télécharger. Quelle bibliothèque python me permettrait de pré-remplir facilement des formulaires PDF ? Ces formulaires sont destinés à être imprimés.
Réponses
Trop de publicités?Reportlab est idéal si vous générez des PDF très dynamiques et que vous avez besoin de tout contrôler par programme : les données et la mise en page.
Pour simplement remplir des formulaires dans des PDF existants, reportlab est excessif et vous devrez reconstruire le PDF à partir de zéro dans reportlab au lieu de prendre un PDF avec un formulaire déjà créé.
Les formulaires PDF fonctionnent avec FDF données. Il y a quelque temps, j'ai porté une bibliothèque PHP FDF vers Python lorsque j'ai eu à faire cela et je l'ai publiée sous le nom de fdfgen . Je l'utilise pour générer un fichier fdf avec les données du formulaire, puis j'utilise la méthode suivante pdftk pour pousser le fdf dans un formulaire PDF et générer la sortie.
L'ensemble du processus fonctionne comme suit :
-
Vous (ou un concepteur) concevez le PDF dans Acrobat ou autre et marquez les champs du formulaire en prenant note des noms des champs (je ne sais pas exactement comment cela se fait ; notre concepteur s'occupe de cette étape). Disons que votre formulaire comporte des champs "nom" et "téléphone".
-
Utilisez fdfgen pour créer un fichier FDF :
from fdfgen import forge_fdf fields = [('name','John Smith'),('telephone','555-1234')] fdf = forge_fdf("",fields,[],[],[]) fdf_file = open("data.fdf","w") fdf_file.write(fdf) fdf_file.close()
-
Ensuite, vous exécutez pdftk pour fusionner et aplatir :
pdftk form.pdf fill_form data.fdf output output.pdf flatten
et un pdf rempli et aplati (ce qui signifie qu'il n'y a plus de champs de formulaire modifiables) sera dans output.pdf.
C'est un peu compliqué, et pdftk peut être difficile à installer (il nécessite une pile Java et il y a des bogues sur Ubuntu 9.10 qu'il faut contourner), mais c'est le processus le plus simple que j'ai pu trouver jusqu'à présent et le flux de travail est pratique (c'est-à-dire que nos concepteurs peuvent apporter toutes les modifications de mise en page qu'ils veulent au PDF et tant qu'ils ne changent pas les noms des champs, je peux insérer le nouveau et tout continue à fonctionner).
Je m'excuse pour le manque de documentation sur fdfgen. forge_fdf() est vraiment la seule fonction dont vous devriez avoir besoin et elle a une docstrings pour expliquer les arguments. Je n'ai juste jamais eu l'occasion d'en faire plus avec elle.
Essayez reportlab .
Jetez également un coup d'œil à Sortie des PDF .
Modifier
J'ai eu une autre idée (mais cela ne vous aidera pas si vous avez déjà les fichiers PDF, et je préfère la réponse de @thraxil).
Au début de l'année, j'ai travaillé sur un projet consistant à générer des "certificats d'achèvement" pour des cours de formation continue. L'un des angles que j'ai examinés était d'essayer de générer un PDF directement à partir d'une page Web au style approprié (quelque chose comme une "impression en PDF" côté serveur).
Un des outils que j'ai trouvé est wkhtmltopdf . Il s'agit d'un navigateur WebKit autonome qui transforme une URL en PDF, avec des résultats plutôt bons.
L'idée est d'utiliser le moteur de modèles de Django pour créer une page contenant ce que vous voulez (y compris des images), de passer l'url à wkhtmltopdf, de récupérer le résultat et de le renvoyer à l'utilisateur.
J'ai aimé cette approche car elle est très simple à mettre en œuvre (il suffit d'ouvrir un tuyau), vous n'avez pas à vous soucier de garder les fichiers PDF source accessibles au serveur, et vous pouvez remodeler les PDF en modifiant le HTML.