Export PDF champ à plusieurs lignes

Bonjour,

Dans mon document, j’ai un champ de type « Texte » servant à recueillir des préconisations. Celles-ci sont mises en forme avec des passages à la ligne.

Quand j’affiche le pdf, toutes les indications se retrouvent les unes dernière les autres et ne sont pas facilement lisibles.

Resultat affiché

Dans mon code html, j’ai essayé de jouer avec la valeur « display » mais sans succès. J’ai même tenté le « Textarea » mais qui n’est pas pratique car il ne s’adapte pas à la longueur du texte (ou alors je n’ai pas réussi à le configurer).

Auriez-vous une solution?

bonjour,

je ne comprends pas bien votre demande, entre champ texte, HTM et affichage en pdf. Avez-vous un fichier exemple à partager ?

Je me suis mal exprimé, pardon.
J’ai une table avec plusieurs colonnes de type texte. Dans ces colonnes sont stockées des phrases avec parfois plusieurs lignes par cellule.
J’ai suivi le tuto post" par Audezu Générer des PDF personnalisés / Publipostage / Widget Markdown
afin de pouvoir exporter une fiche au format PDF mettant en forme ces données.
Mais toutes les phrases d’une cellule (ce que j’ai appelé « champ ») se retrouvent les unes derrière les autres, alors que je souhaiterai qu’elles soient l’une en-dessous de l’autre, comme ce qui est visible dans les colonnes de la table.

Voilà la table (simplifiée pour plus de clartée): dans l’exemple créé sur cette table, je souhaiterai que la cellule « Indications » puisse être exportée dans le PDF telle qu’elle apparaît dans la vue « Fiche ».

Pôle Ressource.grist (184 Ko)

J’espère avoir été plus clair et merci pour votre aide.

corrige ta formule en convertissant les retours à la ligne ne

import datetime
class Find_Data(dict):
  def __missing__(self, key):
    attr = getattr(rec, key)
    if attr is None:
      return "--"
    if isinstance(attr, datetime.date):
      return attr.strftime('%d-%m-%Y')
    if isinstance(attr, str) and key == "Indications":
      return attr.replace("\r\n", "\n").replace("\n", "<br>")
    return attr
template = Template_Retour_Saisine.lookupOne().Modele
return template.format_map(Find_Data())

1 « J'aime »

Merci beaucoup! C’est génial!
Je n’aurai pas penser à aller vers la formule pour régler cette problématique.
Si je comprends bien le code ajouté, je peux reprendre et ajouter un autre « if isinstance… » en changeant la valeur de « key » si j’ai d’autres cellules qui doivent s’afficher de la même manière?

1 « J'aime »

Bonjour YannP,
est ce que ça marche car j’ai exactement la même demande que toi, j’ai copié la formule en remplaçant après « key » la valeur de ma cellule à modifier mais ça ne fait rien. Est qu’il faut modifier autre choses dans le code ?

Bonjour,

Dans le code posté ici, c’est une réponse à mon cas particulier.
SI tu n’as pas de dates à convertir, tu peux enlever les lignes:

  • « import datetime »
  • "If isinstance(attr, datetime.date):
    return attr.strftime(‹ %d(%m-%Y ›)

Ce qui te donnerai le code suivant:

class Find_Data(dict):
  def __missing__(self, key):
    attr = getattr(rec, key)
    if attr is None:
      return "--"
    if isinstance(attr, str) and key == "Indications":
      return attr.replace("\r\n", "\n").replace("\n", "<br>")
    return attr
template = Template_Retour_Saisine.lookupOne().Modele
return template.format_map(Find_Data())

Ensuite tu dois modifier la ligne « template = Template_Retour_Saisine.lookupOne().Modele » en remplaçant « Template_Retour_Saisine » par le nom de la table qui contient ton code HTML et « Modele » par le nom de la colonne correspondante.

Par exemple, si la table que tu utilises pour ton code s’appelle « TemplateAffichage » et la colonne « CodeHTML », tu aurais la formule:
« template = TemplateAffichage.lookupOne().CodeHTML »

Intégré dans le code précédent, tu aurais:

import datetime
class Find_Data(dict):
  def __missing__(self, key):
    attr = getattr(rec, key)
    if attr is None:
      return "--"
    if isinstance(attr, datetime.date):
      return attr.strftime('%d-%m-%Y')
    if isinstance(attr, str) and key == "NomColonneàmodifier":
      return attr.replace("\r\n", "\n").replace("\n", "<br>")
    return attr
template = TemplateAffichage.lookupOne().CodeHTML
return template.format_map(Find_Data())

J’espère avoir répondu à ta question.