Ada PDF Writer

Avoir la possibilité de générer des documents dans un format de haut niveau au sein d’une application Ada peut être très intéressant. Par exemple, dans le cas du développement de l’outil AdDoc (~ un Doxygen pour Ada), il aurait été beaucoup plus pratique de disposer nativement de cette fonctionnalité.

Comme cela n’était pas le cas, nous avions dû passer par une génération LaTeX et utiliser l’outil pdflaTeX.

La figure ci-dessous schématise la structure interne de l’outil AdDoc.

Plus de détails sur AdDoc ici : https://www.systerel.fr/expertises/technologies-ada/generateur-documentation-addoc/

Ada PDF Writer

Ce projet en full Ada$_{2005}$ (sous licence MIT) permet d’avoir nativement un générateur de code PDF.

Le projet est fourni avec un projet GNAT (pdf_out.gpr) et un projet ObjectAda (pdf_out_oa.prj) dont les éléments les plus caractéristiques sont :

  • La définition d’un type PDF_Out_Stream (abstract tagged private),

  • La mise à disposition de procédures Put,_xxx permettant d’insérer du texte, des entiers, des réels, etc.

  • La mise à disposition de fonctions permettant de contrôler la mise en page,

  • La mise à disposition de fonctions permettant d’insérer des images, des vecteurs, du code PDF, etc.

  • La mise à disposition de fonctions permettant de sélectionner les fonts.

Le code PDF généré est conforme à la norme ISO 32000-1 et est dans sa version PDF-1.3.

Le simple code Ada suivant :

permet de générer un fichier tati.pdf contenant :

Ce code a été testé sous Windows (objectada et gnat) et sous Linux (gnat).

Premières impressions

Avoir à disposition un tel paquetage est un vrai plus, mais il faut reconnaitre que l’API n’est pas très souple et il faut faire somme toute beaucoup d’ajustements pour obtenir une mise en page digne de ce nom.

Une solution serait de créer un paquetage héritant au sens propre du terme de PDF_Out.PDF_Out_Stream et offrant par exemple des services de mise en page plus aisés :

  • Support du chapitrage et de la table des matières,
  • Support des tableaux,
  • Support des graphiques,
  • Auto-ajustement de la position du texte en fonction des ajouts d’objets graphiques ou d’images,
  • Meilleure prise en compte des fonts,
  • etc.

Attention

Cependant, il faut garder à l’esprit qu’un tel paquetage ne permettra pas de générer de « beaux » documents, comme on pourrait par exemple le faire en LaTex. Ce paquetage et ses améliorations devraient être utilisés pour, par exemple, produire des formulaires ou des comptes-rendus.

Applications pratiques

Un premier exemple d’application a déjà été réalisé. Il consiste à remplacer les FAF (Fiche d’Appréciations de la Formation) pour les formations Ada supprimant ainsi la fiche papier.

Ainsi donc, les stagiaires auraient à disposition un code Ada générant le FAF qu’il leur suffit de compiler et d’exécuter !

L’application FAF s’appuie sur le paquetage FAF suivant :

Elle est compilée en Ada$_{2022}$ et utilise le nouveau symbole @. Ce symbole est l’équivalent du nom figurant à gauche de l’instruction d’affectation. Il permet d’éviter la duplication du code que l’on retrouve par exemple dans les expressions du type : a := @ + 1.

Comme cela a été évoqué, on constate qu’ici le type PDF_Descriptor_T hérite de PDF_Out.PDF_Out_Stream autorise de surcharger des opérations (ici Page_Header,Page_Footer).

L’application FAF donne aussi un exemple d’utilisation de GNATColl au travers du paquetage GNATCOLL.Config (https://docs.adacore.com/gnatcoll-docs/config.html).

La fiche générée pour le moment est un peu surannée (voir remarque précédente) :

Une autre application envisagée serait de produire des fiches de résultats au format PDF issues des sorties de l’outil GNATTest (https://www.adacore.com/dynamic-analysis/gnattest). Ces fiches contiendraient un bref descriptif du test, ses objectifs et ses attendus. Cela permettrait de produire des artefacts de tests structurés et pouvant être fusionnés avec les sorties de GNATCoverage (https://www.adacore.com/dynamic-analysis/gnatcoverage) ou gcv/lcov.

Références

[1] : https://sourceforge.net/projects/apdf/

[2] : https://apdf.sourceforge.io/

[3] : https://alire.ada.dev/crates/apdf.htm

[4] : https://github.com/zertovitch/ada-pdf-writer/

Comments