Development #24364
Génération de document de PDF à partir de PDF remplissables (PDF Form)
0%
Description
Pour une utilisation rapide de CERFA remplissables, quand ça marche.
Fichiers
Demandes liées
Historique
Mis à jour par Benjamin Dauvergne il y a presque 6 ans
- Fichier 0001-workflows-add-pdf-filing-in-export-to-model-action-2.patch 0001-workflows-add-pdf-filing-in-export-to-model-action-2.patch ajouté
- Patch proposed changé de Non à Oui
Manque les tests mais c'est juste parce qu'on en a parlé à Toulouse aujourd'hui, et que je n'avais rien à dire, relecture ne presse pas.
L'idée c'est de prendre un CERFA comme celui-là: https://www.impots.gouv.fr/portail/formulaire/2494-sd/declaration-de-la-retenue-la-source
On l'upload comme un ODT, le formulaire de l'action se modifie pour afficher pour chaque champ du PDF un champ expression calculé (la présentation n'est pas super ergonomique, pourrait être plus sympa sur plusieurs colonnes).
De plus un lien "PDF Form example" renvoie le même PDF avec chaque champ pré-rempli avec son nom de variable (souvent ce n'est pas évident de savoir quelle variable correspond à quoi).
J'en ai un peu chié pour faire tourner w.c.s. en standalone avec Django, je m'y prends certainement mal:
diff --git a/wcs/settings.py b/wcs/settings.py index 0382d385..54eaaf65 100644 --- a/wcs/settings.py +++ b/wcs/settings.py @@ -60,7 +60,7 @@ MEDIA_URL = '/media/' # Don't put anything in this directory yourself; store your static files # in apps' "static/" subdirectories and in STATICFILES_DIRS. # Example: "/var/www/example.com/static/" -STATIC_ROOT = os.path.join(PROJECT_PATH, 'static') +STATIC_ROOT = os.path.join(PROJECT_PATH, 'app', 'collectstatic') # URL prefix for static files. # Example: "http://example.com/static/", "http://static.example.com/" @@ -68,6 +68,7 @@ STATIC_URL = '/static/' # Additional locations of static files STATICFILES_DIRS = ( + '/home/bdauvergne/wd/eo/wcs/static/', ) # List of finder classes that know how to find static files in @@ -75,7 +76,7 @@ STATICFILES_DIRS = ( STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.FileSystemFinder', 'django.contrib.staticfiles.finders.AppDirectoriesFinder', -# 'django.contrib.staticfiles.finders.DefaultStorageFinder', + 'django.contrib.staticfiles.finders.DefaultStorageFinder', ) # Make this unique, and don't share it with anybody. @@ -138,6 +139,7 @@ INSTALLED_APPS = ( 'wcs.ctl', 'wcs.qommon', 'django.contrib.staticfiles', + 'xstatic.pkg.jquery', ) CACHES = { --------------- [main] app_dir = /home/bdauvergne/wd/eo/wcs/app data_dir = /home/bdauvergne/wd/eo/wcs/data # Automatically create virtual host auto_create_appdir = true use_long_traces = true #error_log = /var/lib/wcs/error.log # Redirect on unknown virtual host #missing_appdir_redirect = http://www.mysite.com --------------- # wcs/local_settings.py DEBUG = True WCS_LEGACY_CONFIG_FILE = '/home/bdauvergne/wd/eo/wcs/wcs.cfg'
Le problème principal a été d'obtenir que django avec runserver serve jquery (je pense que l'ajout de xstatic.pkg.jquery a suffit à corriger le souci, le reste de mes modifications c'est de l'exploration) pour que l'admin soit utilisable (surtout le menu Publik à gauche).
Mis à jour par Benjamin Dauvergne il y a presque 6 ans
- Fichier example-prerempli.pdf example-prerempli.pdf ajouté
- Fichier screenshot-localhost 8000-2018-06-07-18-20-30.png screenshot-localhost 8000-2018-06-07-18-20-30.png ajouté
L'exemple du PDF avec les noms des champs.
Un screenshot du formulaire d'admin.
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
- Statut changé de Nouveau à Solution proposée
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
- Statut changé de Solution proposée à Nouveau
Mis à jour par Benjamin Dauvergne il y a plus de 5 ans
Quelques expériences sur une voie différente (et plus intéressante d'après moi), utiliser directement pdfrw et fpdf pour manipuler les PDFs finement : http://git.entrouvert.org/misc-bdauvergne.git/tree/pdf-experiments
Permet de générer un pdf comme celui que j'attache d'aide à la configuration du pré-remplissage (c'est le plus difficile dans l'histoire, arriver à indiquer aux fonctionnels où vont aller les données et sous quelle forme).
Mis à jour par Benjamin Dauvergne il y a environ 5 ans
- Projet changé de w.c.s. à Passerelle
Je déplace sur passerelle, à mon avis c'est inutile de charger w.c.s. sur ces aspects.
Mis à jour par Benjamin Dauvergne il y a environ 5 ans
- un connecteur PDFFilling
- un objet fils "FillablePDF"
- on choisit un PDF remplissable
- on repère l'emplacement des champs via le code donné plus haut (coordonnées PDF)
- on affiche le PDF via pdf.js
- on utilise les coordonnées PDF pour placer des boutons sur le PDF le canvas pdf.js (voir API convertToPdfPoint dans pdf.js et la notion de viewport)
- on définit pour chaque champ l'expression de pré-remplissage par rapport aux données poussé (éviter d'exposer la complexité du PDF aux appelants)
- POINT D'ATTENTION : les tableaux demandent une attention particulière car généralement définis comme un paquet de champs sans liens entre eux qu'il faudrait pouvoir pré-remplir en bloc selon une logique (genre comme un tableur A1:D10). Il devrait être possible de sélectionner une zone de champs et de la définir comme étant un tableau (et reconstruire lignes/colonnes via les coordonnées relatifs des champs entre eux)
Mis à jour par Thomas Noël il y a plus d'un an
- Lié à Development #73544: connecteur pdf : avoir un endpoint "fill-form", remplissage de fichier PDF avec les données d'un formulaire ajouté