56 votes

Comment remplir automatiquement un formulaire PDF dans Django/Python ?

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.

76voto

thraxil Points 1681

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 :

  1. 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".

  2. 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()
  3. 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.

5voto

joshua Points 836

Regardez également ce segment de code qui est une solution prête à l'emploi pour créer une vue pdf dans django qui s'appuie sur la solution de Thraxil ci-dessus. Merci à l'utilisateur de github zyegfryed.

https://gist.github.com/918403

5voto

Seth Points 18568

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X