Se connecter avec
S'enregistrer | Connectez-vous

php : générer du texte mis en forme

Dernière réponse : dans Programmation

Bonjour,

Un nouveau problème se pose à moi :
Il faudrait que les utilisateurs de mon site en php puissent par un simple clic obtenir un document texte avec entete de lettre (en fonction d'infos contenues dans la base), et retravailler dessus avec leur logiciel habituel (Word, j'en ai bien peur...).
Est-ce que quelqu'un aurait une idée du meilleur format à générer? le rtf a l'air assez complexe, le .doc assez contestable et brouillon...

Merci d'avance :) 

Autres pages sur : php generer texte mis forme

Lassé par la pub ? Créez un compte

Ca y est, j'ai réussi à générer du rtf!
Pour ceux que ça intéresse, voilà comment je m'y suis pris :

1.J'ai créé un document type dans Word, enregistré en rtf, avec mes images et tout...

2. Je l'ai ouvert dans un éditeur de texte, et j'ai remplacé tous les \n, \t, et \r par \\n, \\t et\\r (pour éviter que php échappe des lettres du code).

3.J'ai écrit un programme tout con avec fopen($nom_fichier, "w") et fwrite($fichier, "le_code_du_rtf_que_je_viens_de_modifier");

4. J'ai remplacé les endroits clés du texte par mes variables

Et voilà, ça marche, un header pour qu'il s'ouvre automatiquement, et c'est fini.

En espérant que ça servira à quelqu'un... :) 

J'ai pas d'exemple à proposer, mais je peux essayer de résumer le code :

1. Tu fais un modèle de document Word que tu enregistres en rtf
2. Tu ouvres ce document avec un éditeur de texte quelconque (le Bloc-note fait très bien l'affaire, Wordpad aussi...)
3. Tu remplaces tous les slashes par des doubles slashes (pour que php n'imterprète pas les /n par exemple comme des retours à la ligne, il remplace tous les doubles slashes par des simples), en utilisant par exemple "chercher/remplacer"
4. Tu remplaces ce que tu as écrit dans ton document par tes variables
4. Tu commences ta page php, qui écrit ce que tu viens de faire dans un fichier :

  1. <?php
  2. //récupération des critères envoyés par formulaire
  3. //connexion à la base de données
  4. //extraction des infos (requête + attribution des variables)utilisées dans le document
  5. //ici, ça affichera : gilbert
  6.  
  7. $variable="Gilbert";
  8. //création et ouverture du fichier sur le serveur :
  9.  
  10. $nom_fichier='exemple.rtf';
  11. $fichier=fopen($nom_fichier, "w");
  12.  
  13. //on inscrit le code rtf avec les doubles slashes et les variables dans le fichier :
  14.  
  15. fwrite($fichier,"{\\rtf1\\ansi\\ansicpg1252\\uc1 \\deff0\\deflang1033\\deflangfe1036{\\fonttbl{\\f0\\froman\\fcharset0\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}{\\f16\\froman\\fcharset238\\fprq2 Times New Roman CE;}{\\f17\\froman\\fcharset204\\fprq2 Times New Roman Cyr;}
  16. {\\f19\\froman\\fcharset161\\fprq2 Times New Roman Greek;}{\\f20\\froman\\fcharset162\\fprq2 Times New Roman Tur;}{\\f21\\froman\\fcharset186\\fprq2 Times New Roman Baltic;}}{\\colortbl;\\red0\\green0\\blue0;\\red0\\green0\\blue255;\\red0\\green255\\blue255;
  17. \\red0\\green255\\blue0;\\red255\\green0\\blue255;\\red255\\green0\\blue0;\\red255\\green255\\blue0;\\red255\\green255\\blue255;\\red0\\green0\\blue128;\\red0\\green128\\blue128;\\red0\\green128\\blue0;\\red128\\green0\\blue128;\\red128\\green0\\blue0;\\red128\\green128\\blue0;
  18. \\red128\\green128\\blue128;\\red192\\green192\\blue192;}{\\stylesheet{\\widctlpar\\adjustright \\fs20\\lang1036\\cgrid \\snext0 Normal;}{\\*\\cs10 \\additive Default Paragraph Font;}}{\\info{\\title Ceci est un exemple qui affiche la variable \\'ab variable \\'bb :}
  19. {\\author XXX}{\\operator XXX}{\\creatim\\yr2005\\mo7\\dy25\\hr13\\min34}{\\revtim\\yr2005\\mo7\\dy25\\hr13\\min35}{\\version1}{\\edmins1}{\\nofpages1}{\\nofwords0}{\\nofchars0}{\\*\\company XXX}{\\nofcharsws0}{\\vern113}}
  20. \\paperw11906\\paperh16838\\margl1417\\margr1417\\margt1417\\margb1417 \\deftab708\\widowctrl\\ftnbj\\aenddoc\\hyphhotz425\\formshade\\viewkind1\\viewscale100\\pgbrdrhead\\pgbrdrfoot \\fet0\\sectd \\linex0\\headery709\\footery709\\colsx709\\endnhere\\sectdefaultcl {\\*\\pnseclvl1
  21. \\pnucrm\\pnstart1\\pnindent720\\pnhang{\\pntxta .}}{\\*\\pnseclvl2\\pnucltr\\pnstart1\\pnindent720\\pnhang{\\pntxta .}}{\\*\\pnseclvl3\\pndec\\pnstart1\\pnindent720\\pnhang{\\pntxta .}}{\\*\\pnseclvl4\\pnlcltr\\pnstart1\\pnindent720\\pnhang{\\pntxta )}}{\\*\\pnseclvl5
  22. \\pndec\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl6\\pnlcltr\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl7\\pnlcrm\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl8\\pnlcltr\\pnstart1\\pnindent720\\pnhang
  23. {\\pntxtb (}{\\pntxta )}}{\\*\\pnseclvl9\\pnlcrm\\pnstart1\\pnindent720\\pnhang{\\pntxtb (}{\\pntxta )}}\\pard\\plain \\qc\\widctlpar\\adjustright \\fs20\\lang1036\\cgrid {\\fs36 Ceci est un exemple qui affiche la variable \\ldblquote \\~variable\\~\\rdblquote \\~:
  24. \\par
  25. \\par }{\\fs36\\cf6 $variable
  26. \\par }}");
  27.  
  28. //on ferme le fichier
  29. fclose($fichier);
  30.  
  31. //on l'envoie au client
  32. header('Content-type: application/rtf');
  33.  
  34. header("Content-Disposition: attachment; filename=\"$nom_fichier\"");
  35.  
  36. readfile("$nom_fichier");
  37.  
  38. ?>


Voilà un exemple qui devrait t'afficher une petite page qui inscrit en rouge ce que tu mets dans la variable $variable. je ne l'ai pas essayé, mais logiquement ça devrait marcher. Je crois que je ne peux pas être plus précis.


Si on crée le RTF notemment avec Word, il ne faut pas oublier d'enlever les métadonnées :D ..... Exemple : la ligne 19 de ton code : author, operator et company.. Vu avec Word 2003 avant et après la "Suppression des métadonnées" proposée par Word..

Sinon, merci du tuyeau, je garde précieusement ;) ..

:jap: 
Expert Programmation

Johan_et_P irlouit> +1
J'ai eu à faire ce genre de chose autrefois.
Pour créer du RTF le plus simplement possible, j'ai employé WORDPAD. Le RTF généré est si simple que c'en devient facile à comprendre.

Petit exercice :

1°) Créer deux fichiers RTF très simples avec WORDPAD.
2°) Ouvrir l'un avec WINWORD, et enregistrer.
3°) Regarder l'un et l'autre avec NOTEPAD.
4°) Comprendre le fichier WORDPAD.
5°) Attraper mal au crâne en lisant le fichier WINWORD.

Après cet exercice, tu auras à coeur de faire des fichiers RTF les plus simples possibles, d'autant que tes utilisateurs peuvent a priori utiliser le programme de leur choix pour ouvrir et remplir ton fichier.
Expert Programmation

générer un fichier word....

Si tu as besoin d'un fichier éditable dans Word, boubpopsyteam t'a répondu.

Si tu as besoin d'un fichier Word .DOC, il s'agit d'un format propriétaire, tu ne pourras pas trouver beaucoup d'aide ici.

bonjour
j'ai utilisé votre méthode de génération (génération et modification d'un fichier .rtf) mais j'ai un petit souci:
dans mon appli, j'ai une première page php dans laquelle l'utilisateur rentre un numéro d'analyse pour laquelle il voudrait créer un rapport. l'appli va chercher dans la table si l'analyse existe ou pas, jusqu'ici tout va bien.
le problème est que lorsqu’il trouve l'analyse il m'envoi un message de demande d'ouverture, ou d'enregistrement du fichier généré et ce message apparait 2 fois ( si on clique sur open on le message qui réapparait, mais si on clique sur save pas de problème).
ma question est la suivante : est-il possible d'enregistrer automatiquement le fichier généré sans que l'utilisateur n'ait besoin d'intervenir?
sinon comment faire en sorte que le fichier s'ouvre au premier clic de l'utilisateur?
sinon la méthode marche nickel, j'ai même réussi à piger certain truc du code rtf
merci d'avance

Expert Programmation

la seule manière de le faire c'est de configurer le navigateur du client.

sinon on peut pas faire ça, heureusement d'ailleurs, tu n'aurai pas envie que je fasse ouvrir un document word infécté ...

bonjour,

j'utilise également les headers pour permettre l'affichage ou l'enregistrement d'un document
généré par un formulaire hteumleumleu et php.

J'ai une page html, contenant le formulaire qui renvoit sur un script php qui complète un
document rtf pour afficher/enregistrer un nouveau document, cette fois en .doc.

Mon souci :
Si je clique sur ouvrir : word s'ouvre, avec un fichier format .doc. Si je veux enregistrer sous à ce moment là,
le format est en rtf par défaut.
Mon "clients" sont un peu déb..s et ils ne savent pas qu'on peut changer le format d'un document
dans la fenêtre "enregister sous".
Je voudrais donc leur faciliter la tâche et qu'ils n'aient plus qu'à changer le
nom du fichier (ce sera déjà beaucoup pour certains).

Par contre si je clique sur enregistrer lorsque le document est généré avant de l'afficher, alors là pani problème, j'obtiens le résultat
attendu.

Et si je change le format du document modèle en .doc, mon script ne fonctionne plus.

Cela inspire t il quelqu'un ou pourriez vous m'orienter ?
Merci d'avance !

Citation :
rien compris ...


Merci pour ton intervention.

C'est vrai que le problème n'est pas évident au premier abord. Donc je te la refais !

Ce que je veux faire : que mon script php génère un fichier .doc
Ce que mon script fait actuellement :
- lorsque le document est créé, un menu contextuel apparait : ouvrir ou enregistrer (tu me suis ?)
- si je clique sur enregistrer : une fenêtre windows apparaît, m'indique un titre (contenu dans mes headers php) et un format .doc
(lui aussi contenu dans mes headers). (Tu me suis toujours ?)

Là où j'ai un problème : c'est quand je clique sur ouvrir :
- le fichier s'ouvre bien dans word;
- mais si je fais un "enregistrer sous", le format du fichier est en .rtf ;

Donc je me demande comment je peux faire pour que mon fichier texte soit toujours au format .doc ???
Autrement dit que faire pour que mon fichier texte soit toujours un .doc par défaut dans les menus d'enregistrement ???

Merci
Expert Programmation

A mon avis, ce que génère php est un .rtf que tu renommes artificiellement en .doc avec les headers...

Quand tu l'ouvres directement avec Word, ce dernier lit les infos contenus dans le fichier et repère que c'est un .rtf... Donc il l'enregistre ensuite par défaut en .rtf.

Il va falloir que tu génères du "vrai" .doc avec ton script, mais je ne sais pas si c'est possible (format fermé, toussa...)

merci marsien,
j'avais l'impression que ce n'était pas évident.
je vais voir si le xml peut m'être utile.

en tout cas, lorsque j'utilise un fichier .doc comme "modèle à remplir dynamiquement", j'obtiens une erreur.

mais j'ai l'impression que le format .doc étant propriétaire, ça va être difficile vu mon niveau.

Merci encore.

Generer un .docx (format XML utilisé par office 2007) serait certainement plus facile mais imposes aux users d'avoir soit office 2007, soit 2003/XP 2000 (mais PAS office 97) + le plug in pour lire le format en question (dispo gratuitement chez microsoft).

Par contre GROS avantage pour les coders, le format est fortement documenté, et c'est un container (zippé) avec des fichiers XML assez "facile" (a comparer à avant) à générer dedans.
Expert Programmation

Ben dans ce cas, il existe quelque chose de stable et fonctionnant sans plug-in pour lire les odt et les doc, ça s'appelle OpenOffice.org :D  Et c'est en version 2.1, donc là l'admin fera pas la fine bouche :jap: 

Merci beaucoup pour toutes ces réponses et précisions.
Disons que je suis développeur amateur, mais que mon admin ne veut pas installer OOo sur les postes (et pourtant dieu sait que je trouve ça pratique).
Je vais creuser la piste xml et plug in.

bonjour
j'ai grâce au message de cette partie pu générer un automatiquement un fichier rtf qui represente un la page de garde d'un rapport que les utilisateurs peuvent compléter à leur guise. et jusque là tout marche bien. le problème survient lorsqu'on essaye de rajouter des images dans le fichier généré, la taille de ce dernier augmente et passe à 50 mega
pourtant lors de la génération, lorsqu'il n'y a que du texte le fichier a une taille normale
est-ce que quelqu'un a déjà rencontré ce pb?
Expert Programmation

Citation :
Une taille normale
Ca ne veux rien dire :o 
Quelle est la taille de tes images ?

Le fichier RTF "contient" les images et pas seulement un lien vers elles.

tout d'abord merci de me repondre
quand je génère le fichier,il ne contient que du texte( des données prises dans la database) sa taille est d'environ 123kb, mais quand on ouvre ce fichier et qu'on rajoute des images elle passe à 50mega

en faite la taille des images varie , mais j'ai trouver une solution:
apparemment le problème vient de l'insertion des image dans un fichier rtf, lors de l'enregistrement des modifications apportées au fichier généré, si on fait un save as et on enregistre en .doc, le fichier garde une petite taille (quelque soit la taille des images) .donc pour l'instant je ferai comme ça à moins que quelqu'un ait une autre solution

Bonjour
Est ce que qqun a une idée comment générer la table de matière en php dans un doc rtf à partir des données réécupérer de la BDD,
sachant que g déjà bien généré mon doc .rtf en faisant appel à la classe rtfHandler.

Bah si tu as ecris la classe toi même, on va avoir du mal à tester ;) 

Enfin niveau piste:
* vu que tu génère le document toi même tu peux indiquer le n° de page dans une arborescence (array à 3 entrée -> "intitulé" / "profondeur" / "page") créée au fur et a mesure de la génération.
* plus qu'a creer une (des) page(s) de sommaire.

merci pour ton aide boubpopsyt eam, je vais essayer de marcher en arrière(créer le sommaire manuellement et voir le code générer en ouvrant le doc par un éditeur)et j essayerai d intégrer le code généré si ça marche je le signalerai sur le forum
Lassé par la pub ? Créez un compte