Conception d’un template d’impression PDF

Principe général

Il est impératif d’avoir déjà lu l’article "Conception d’un modèle d’impression" avant d’aborder celui-ci !

Depuis la version 5.8.0 de MedShakeEHR, il est possible de compléter/remplacer le PDF fabriqué à l’issue de la validation d’un formulaire en utilisant comme base un PDF préexistant.
Ce PDF sert de fond de page sur lequel on va venir superposer des informations textuelles ou des images en les positionnant au mm près par rapport au coin supérieur gauche de la feuille.

Ce processus utilise FPDI / FPDF.
Toutes les informations nécessaires à l’action de ces class sont à définir au niveau du formulaire qui génère le document.

Mise en œuvre

Il convient en zone de configuration d’éditer les propriétés du formulaire concerné et de se placer à l’onglet "Options".
La rédaction de ces options se fait au format yaml au niveau optionsPdf > templatePdf (l’indentation est de 2 espaces par niveau).

optionsPdf:
  templatePdf:

Options générales

optionsPdf:
  templatePdf:
    source: '/path/to/the/PDF.pdf'
    mode: 'concat' 
    defautFont: 'Arial'
    defautFontSize: 9
    defautTextColor: '0,0,0'

Les options générales sont simples et nécessitent peu de commentaires.
Une seule doit retenir l’attention, il s’agit de mode qui peut prendre 2 valeurs :

  • replace : le PDF produit vient en remplacement du PDF produit par le processus habituel lié aux formulaires.
  • concat : le PDF est concaténé au PDF produit par le processus habituel.

Il faut noter que le mécanisme de concaténation de PDF préformatés est ici opérationnel, quel que soit le mode choisi.

Ajout de textes

optionsPdf:
  templatePdf:
    pagesTxtMapping:
      page1: 
        lastname: [20, 56]
        birthname: [42, 62]
        firstname: [25, 67]
        birthdate: [42, 73]
      page4:
        identiteCompleteTitreCourt: [39, 66, 8] 
        AuteurInitial_identiteUsuelleTitre: 
          - [40, 77, 8]
          - [16, 253, 6]

La définition de variables à incruster dans le document se fait page par page comme le montre l’exemple précédent.
La syntaxe générale est la suivante nomDeVariable: [X, Y, taille, couleur, font, texte de remplacement ] où :

  • X : distance en mm depuis le bord gauche de la page
  • Y : distance en mm depuis le bord supérieur de la page
  • taille : taille de la font
  • font : nom de la font (cf fpdi pour la liste des font supportées)
  • texte de remplacement : utile par exemple pour cocher des cases en indiquant X !

Seuls X et Y sont indispensables. Les autres paramètres s’ils sont absents prennent les valeurs par défaut.

Comme le montre l’exemple précédent, sur une même page, on peut incruster la variable à différents endroits en répétant le bloc [X, Y, taille, couleur, font, texte de remplacement ] autant de fois que souhaité.

Si on travaille sur une variable qui peut prendre des valeurs prédéterminées comme un type select ou radio, alors on peut préciser le comportement souhaité en fonction de la valeur de la variable :

       gynObsDpniAccordCPDPN:
          oui: [146, 129, '', '', '', 'X']
          non: [166, 129, '', '', '', 'X']  
        gynObsDpniRaisonDepMarqueursMat: 
          1erT:
            - [15, 142, '', '', '', 'X']
            - [98, 142, '', '', '', 'X']
          2eT:
            - [15, 142, '', '', '', 'X']
            - [129, 142, '', '', '', 'X']
        gynObsDpniGrossesseGemellaire:
          true: [15, 150.5, '', '', '', 'X'] 

Notez qu’il est préférable d’utiliser les clefs que les valeurs pour rédiger le yaml.
Dans l’exemple ci-dessus gynObsDpniRaisonDepMarqueursMat combine toutes les possibilités.

Ajout d’images

L’incrustation d’images fonctionne sur le même principe.

optionsPdf:
  templatePdf:
    pagesImgMapping: 
      page1:
        '/path/to/templates/tampon.png': [155, 48, 45, 0, 'PNG'] 
        '/path/to/templates/signature.png': [168, 73, 30, 0, 'PNG'] 
      page4:
        '/path/to/templates/tampon.png': [60, 240, 45, 0, 'PNG']
        '/path/to/templates/signature.png': [35, 240, 30, 0, 'PNG']

Le bloc de définition d’une image est composé comme ceci 'path/to/image.ext': [X, Y, width, height, type] où :

  • 'path/to/image.ext' : est le fichier image (voir plus bas)
  • X : distance en mm depuis le bord gauche de la page du coin supérieur gauche de l’image.
  • Y : distance en mm depuis le bord supérieur de la page du coin supérieur gauche de l’image .
  • width : largeur de l’image en mm
  • height : hauteur de l’image en mm, si non précisée alors le ratio de l’image original est utilisé pour déterminer la valeur à appliquer.
  • type : le type de l’image (si absent, déterminé par extension). Voir class FPDP et FPDI pour plus d’informations.

Priorité dans les images utilisées

Plusieurs possibilités existent pour spécifier 'path/to/image.ext' :

  • soit c’est un chemin absolu vers une image et c’est cette image précise qui sera utilisée quel que soit le contexte de génération du PDF
  • soit c’est un simple nom de fichier sans chemin et dans ce cas c’est le fichier présent dans le répertoire de l’utilisateur défini par templatesPdfFolder qui sera utilisé.

Exemple de réalisation

Illustration - Exemple de réalisation
 

Article précédent

 

Article suivant

Mise en production initiale

LAP : mise en production