-
Notifications
You must be signed in to change notification settings - Fork 103
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Global - Génération des PDF #2195
Comments
Laquelle des trois solutions vous semble la plus pertinente pour la communauté géoNature ? |
Bonjour,
Finalement, une génération mixte semble être un bon compromis au vu des remarques faites.
|
Merci le retour. J'identifie donc ces travaux :
Des choses à compléter ? @bouttier @pierrejego |
ref #2205 pour la partie configuration |
Ok sur les différents points, sauf sur le dernier : je ne comprend pas le besoin lié à cette route permettant de récupérer des templates depuis un répertoire statique. |
Oui pardon c'est inutile ici je me suis mélangé avec les autres solutions.
|
Salut ! Merci pour toutes ces réflexions intéressantes et ces travaux sur la génération des PDF ! J'arrive un peu tard mais pour générer la carte côté backend, on avait utilisé cette solution : https://github.com/komoot/staticmap/ si jamais ça peut aider... Mais ça pose plusieurs soucis :
Donc votre décision de rester sur l'envoi d'images depuis le frontend va dans le bon sens. |
Description
Des besoins liés actuellement à l'export des metadata dans GeoNature (#2034, #1416, #1116 ) et modules connexes (PnX-SI/gn_module_import#398) indiquent qu'il devient nécessaire de repenser le système de génération des PDF.
Les travaux en cours sont centrés sur :
Analyse
Analyse détaillée
Les besoins et éléments fonctionnel liés à la génération d'un PDF et vu dans GeoNature semblent sont listés ci-dessous (liste à compléter).
Où trouver un export PDF ?
L'export PDF est actuellement disponible dans GeoNature pour les éléments suivants :
https://github.com/PnX-SI/GeoNature/search?q=%2Fexport_pdf
Export des graphiques dans le PDF
Les graphiques visibles dans l'interface GeoNature sont en premier transformés en URL (image/png) :
GeoNature/frontend/src/app/metadataModule/af/af-card.component.ts
Line 147 in ef3bc66
GeoNature/frontend/src/app/metadataModule/datasets/dataset-card.component.ts
Line 145 in bd7de66
L'image (sous forme d'URL) est ensuite envoyé par le frontend au backend via la route
/meta/upload_canvas
.GeoNature/frontend/src/app/GN2CommonModule/form/data-form.service.ts
Line 457 in bd7de66
GeoNature/backend/geonature/core/gn_meta/routes.py
Line 193 in bd7de66
Le backend s'occupe alors actuellement de stocker l'image sous forme de fichier PNG dans un répertoire statique
/static/images/taxa.png
:GeoNature/backend/geonature/core/gn_meta/routes.py
Line 197 in bd7de66
Le frontend appel ensuite la génération de PDF via la route
/xxx/export_pdf/id
:GeoNature/frontend/src/app/metadataModule/datasets/dataset-card.component.ts
Line 147 in bd7de66
... pour générer l'URL à partir :
du CA ou JDD
GeoNature/backend/geonature/core/gn_meta/routes.py
Line 487 in bd7de66
du graphique stocké précédemment
GeoNature/backend/geonature/core/gn_meta/routes.py
Line 498 in bd7de66
d'un template HTML
https://github.com/PnX-SI/GeoNature/blob/cef64b514613fa76ee85d6a861cdb4f957838548/backend/geonature/templates/dataset_template_pdf.html
geonature.utils.filemanager
)GeoNature/backend/geonature/core/gn_meta/routes.py
Line 505 in bd7de66
GeoNature/backend/geonature/utils/filemanager.py
Lines 86 to 90 in ef3bc66
Export de la carte dans le PDF
La carte semble être absente de l'export PDF des métadonnées.
Plus globalement, GeoNature ne prévoit pas l'export de la carte en image contrairement au module d'import qui, sur le même fonctionnement que les graphiques, permet l'export de la carte en tant qu'image déposée par le backend :
https://github.com/PnX-SI/gn_module_import/blob/eef177f6db4353e25fa4c74d1d0ddfa592fee781/frontend/app/components/import_report/import_report.component.ts#L198-L207
Si GeoNature doit prévoir de réaliser un export de carte dans le PDF, il sera alors nécessaire d'intégrer cette dépendance (leaflet-image) dans le frontend (si PDF généré par le front ou par front + back).
Personnalisation du PDF
Actuellement, le logo et le bandeau (images) semblent personnalisables :
GeoNature/backend/geonature/core/gn_meta/routes.py
Lines 698 to 700 in bd7de66
GeoNature/backend/geonature/templates/dataset_template_pdf.html
Lines 26 to 29 in cef64b5
Il semble donc utile (voir obligatoire) de pouvoir conserver ces éléments.
Le template peut également être personnalisé en modifiant le code source. En effet, les administrateurs semblent actuellement modifier ce template dans le code source directement ou au sein d'un fork dans le meilleur des cas.
La possibilité de pouvoir personnaliser le document entier (position des informations, couleurs, etc.) est donc un vrai plus qui semble être à conserver, mais à améliorer.
Analyse Globale
Le code développé actuellement utilise Weasyprint qui fonctionne très bien. Ce système en place intègre déjà un système de de template en tirant parti du render Flask. Weasyprint est aussi connu pour utiliser énormément de mémoire, mais uniquement avec un gros HTML (ce qui n'est pas le cas ici). Les premiers tests réalisés au sein de notre installation sur les métadonnées sur n'affichent aucun pic de mémoire sur un jeux de données pauvre.
Cependant :
Solutions pressenties
Plusieurs solutions sont possibles.
Génération full front
La génération d'un PDF par le frontend uniquement est possible via l'utilisation d'une librairie (e.g pdfMake).
Le front end serait notamment plus à même de générer la carte Leaflet comme c'est le cas dans le module gn_import :
https://github.com/PnX-SI/gn_module_import/blob/eef177f6db4353e25fa4c74d1d0ddfa592fee781/frontend/app/components/import_report/import_report.component.ts#L198-L207
Pour la gestion des templates, il semble complexe de la déléguer entièrement au frontend sans devoir réaliser un build (Angular) à chaque modification d'un template. La notion de template dynamique n'est donc plus là.
Nous pensons donc qu'une route backend peux permettre de récupérer le template.
Cette option a plusieurs avantages :
/export_pdf/<nom_template>
Cette option a aussi des inconvénients car un template contient des variables (ex: nombre d'observation, unique_dataset_id, etc.) qui proviennent d'une source qui doit contenir toutes ces valeurs :
Si le contexte frontend ne contient par toutes ces valeurs au moment de la génération du PDF partir du template, il sera nécessaire d'appeler le backend pour récupérer ces valeurs.
La génération full frontend perd alors son intérêt.
Génération full back
Dans le fonctionnement actuel, seule la génération du graphique est gérée par le frontend.
Ce graphique pourrait alors être généré par une librairie type plotly ou highchart ou matplotlib.
La librairie la plus simple serait préférable puisque les graphiques actuels ne sont pas complexes.
Pour la question du composant de carte, il est nécessaire de trouver une librairie pour générer une carte dans python et exportable en PNG (voir folium). Autrement il faudra voir comment regénérer une carte par le backend. Cette dernière option serait potentiellement moins simple que la génération d'un graphique puisqu'il faudrait prendre en compte les couches visibles, les features affichées, l'étendue visible (bbox, zoom) pour recréer une carte dans le backend et réaliser un snapshot de la carte Leaflet. Ce point est questionnable.
Pour générer le PDF sans problème d'export simultané, on peut améliorer l'existant en générant le PDF avec un filename + timestamp.
Autrement, on peut utiliser un système sans dépôt sur le serveur via un BytesIO ou un StringIO et une réponse type :
Génération mixte
C'est le fonctionnement actuel.
Il fonctionne correctement et n'est pas forcément complexe puisque seule la partie des graphique est générée par le front.
Ce fonctionnement permet notamment de déléguer la création de l'image de la carte au front end si cette dernière est à utiliser dans un PDF. Le code serait alors potentiellement lus simple que si le backend généré lui-même la carte.
Ce fonctionnement peut être amélioré via :
The text was updated successfully, but these errors were encountered: