Project

General

Profile

Development #24364

Génération de document de PDF à partir de PDF remplissables (PDF Form)

Added by Benjamin Dauvergne almost 2 years ago. Updated 6 months ago.

Status:
Nouveau
Priority:
Bas
Assignee:
-
Target version:
-
Start date:
07 Jun 2018
Due date:
% Done:

0%

Patch proposed:
Yes
Planning:
No

Description

Pour une utilisation rapide de CERFA remplissables, quand ça marche.

0001-workflows-add-pdf-filing-in-export-to-model-action-2.patch View (16.8 KB) Benjamin Dauvergne, 07 Jun 2018 06:09 PM

example-prerempli.pdf (356 KB) Benjamin Dauvergne, 07 Jun 2018 06:20 PM

screenshot-localhost 8000-2018-06-07-18-20-30.png View (157 KB) Benjamin Dauvergne, 07 Jun 2018 06:21 PM

out.pdf (741 KB) Benjamin Dauvergne, 21 Jan 2019 03:15 PM

25355

History

#1 Updated by Benjamin Dauvergne almost 2 years ago

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).

#2 Updated by Benjamin Dauvergne almost 2 years ago

25355

L'exemple du PDF avec les noms des champs.

Un screenshot du formulaire d'admin.

#3 Updated by Benjamin Dauvergne almost 2 years ago

  • Priority changed from Normal to Bas

#4 Updated by Benjamin Dauvergne over 1 year ago

  • Status changed from Nouveau to Solution proposée

#5 Updated by Benjamin Dauvergne over 1 year ago

  • Status changed from Solution proposée to Nouveau

#6 Updated by Benjamin Dauvergne about 1 year ago

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).

#7 Updated by Benjamin Dauvergne about 1 year ago

  • Project changed from w.c.s. to Passerelle

Je déplace sur passerelle, à mon avis c'est inutile de charger w.c.s. sur ces aspects.

#8 Updated by Benjamin Dauvergne about 1 year ago

Plan à long terme:
  • 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)

#9 Updated by Benjamin Dauvergne 6 months ago

  • Assignee deleted (Benjamin Dauvergne)

Also available in: Atom PDF