|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre du Club
![]() Alain Développeur informatique Inscription : mai 2008 Messages : 117 ![]() |
Bonjour,
J'ai 2 soucis liés à la fabrication de fichiers PDF avec FPDF. J'ai cherché et n'ai pas trouvé. Pourtant je suis persuadé que mes soucis ne sont pas incontournables. Voici donc. CONTEXTE J'ai une table Mysql qui comporte plusieurs enregistrements (univers). Chaque univers a un nom et une partie descriptive. Je souhaite créer un fichier PDF que l'utilisateur pourra ouvrir ou enregistrer selon son souhait.Le fichier est simple puisqu'il comporte une entête (header), un corps de texte et un pied de page (footer). Dans l'entête est mentionné le nom de l'univers. Je souhaite pouvoir enchainer la création des fichiers sachant qu'il a un fichier par univers. STRUCTURE DE MES SCRIPTS 1er script : (fichier PHP n°1) 1 l'utilisateur sélectionne les univers pour lesquels il veut un fichier. La sélection est récupérée dans le tableau $ref_univers. 2 lecture du tableau et pour chaque valeur du tableau via un foreach ($ref_univers) , appel à une fonction existante (description_univers_impression($ref_univers)) dans un autre fichier qui est bien sur inclus (include) en début de script. 2ème script: la fonction description_univers_impression($ref_univers); (fichier PHP n°2) 1 récupération du nom de l'univers ($nom_univers) à partir de sa référence ($ref_univers) via une requête SQL. 2 définition du header (qui n'est pas décrite dans FPDF) par une extension de la classe PDF de FPDF . Dans cette définition il y a intégration du nom de l'univers après avoir déclaré en tête du header qu'il s'agit d'une variable GLOBAL 3 - fabrication du fichier + enregistrement temporaire du fichier sur disque 4 - proposition à l'utilisateur d'ouvrir ou d'enregistrer le fichier avec $pdf->Output($fichier); 5 - destruction du fichier sur disque unlink($fichier) MES 2 SOUCIS 1 - Le header ne reprend pas le nom de l'univers qui lui est passé via la variable: ??? Cela est-il du au fait que l'extension de la classe FPDF pour déclarer le header est (elle même une fonction) incluse dans ma fonction appelée (script 2). 2 - la boucle foreach du script n°1 n'est appelée qu'une seule fois même lorsqu'il y a plusieurs valeurs à lire dans le tableau . Il n'y a pas de retour sur le script 1 après appel de la fonction du script n°2. ??? Cela est-il du à une 'interruption' liée au point 4 du script n°2 ? Pourtant l'utilisateur ouvre le fichier qui est parfaitement correct sauf le header mais lorsqu'il le referme, il n'y a pas retour au script n°1. Je précise que tout fonctionne bien sauf le header et le retour au script n°1. La valeur nom_univers existe bien juste avant le passage à la fonction header. Merci pour vos conseils au débutant FPDF que je suis. |
|
|
00
|
|
|
#2 | ||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Salut
Citation:
FPDF offre plusieurs façon de mettre en sortie le flux du Pdf. Entre autre, de générer le PDF "à la volée", tout est géré par le système (l'OS), c'est à dire que, une fois le flux du PDF est envoyé vers le client, le fichier n'existe plus. Grosso modo, ces 3 étapes sont faites sans avoir strictement rien à faire. Citation:
Pour tes autres soucis, il faudrait mettre du code, parce que là, je n'ai pas vraiment compris. Parviens tu déjà à avoir une document PDF, ne serait ce qu'avec un simple "Hello Wold" ? (sans rien d'autre). Aussi, comme apparemment tu as des données qui sont reçues en paramètres via un formulaire, le problème qu'il y a, c'est que le document PDF ne fait théoriquement pas partie de la page qui la reçois, mais une autre page dédiée uniquement au PDF. Souvent c'est une <iframe> ou alors un <object>, il faut alors transmettre les paramètres au iframe ou object. Peut être est ce lié à ça ?
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||
|
|
00
|
|
|
#3 | ||||||||
|
Membre du Club
![]() Alain Développeur informatique Inscription : mai 2008 Messages : 117 ![]() |
Merci RunCodePHP
Voici quelques précisions 1 - non prise en compte de la valeur de la variable dans le Header J'ai constaté que si je passe la valeur par le biais d'une variable de SESSION, cela fonctionne !! Mais cela m'oblige à détruire cette variable de session tout de suite après, ce qui n'est pas très beau. Précision : bien sur j'ai retrouvé le même problème avec Footer. Les valeurs initiales sont dans les variables $nom_univers et $msg_detail_univers Code :
2 - suppression du fichier J'utilise bien OUPUT . Mais, après l'action de l'utilisateur (ouverture du fichier PDF via son navigateur) j'ai constaté que le fichier PDF est systématiquement enregistré sur le serveur, ce que je ne veux pas. Donc je détruit le fichier 3 - Fabrication de plusieurs fichiers PDF J'ai 2 tableaux : - $Univers_Array qui contient les noms et références des univers - $Impression_Array qui contient le type d'impression que choisi l'utilisateur Dans le code ci dessous, l'utilisateur a choisi 357 (la description de l'univers) Il peut demander l'impression de plusieurs univers. Cela doit générer UN fichier PDF PAR univers. Code :
- la récupération via des requêtes SQL de valeurs diverses (dictionnaire de langue...etc.) - le paramétrage des fonctions Header et Footer de FPDF avec les petits problèmes déjà évoqués - la création de deux fonctions TitreChapitre() et CorpsChapitre(). Ces 2 fonctions marchent correctement. Code :
Code :
1 - le foreach appelle la fonction description_univers_impression($ref_univers) en lui passant la valeur du premier univers 2 - la fonction description_univers_impression($ref_univers) - fabrique le fichier PDF - propose (via le navigateur utilisateur) à l'utilisateur l'ouverture ou l'enregistrement du fichier PDF - retourne dans la boucle foreach pour récupérer s'il y a la référence d'un nouvel univers 3 - retour au point 1 tant que foreach n'es pas terminé. Le programme fonctionne bien pour les points 1 et 2 ci dessus et n'exécute pas le point 3. Voilà le problème. Avez vous quelque(s) piste(s) ? |
||||||||
|
|
00
|
|
|
#4 | ||||||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Avant même de commencer quoi que ce soit, il aurait fallut résoudre se problème. Comme je te l'ai dit, normalement le fichier qui contient le code qui génère le PDF n'est pas le même que celui qui reçoit les paramètre GET (ou POST). Il faut qu'au niveau de la page (ou fichier) qui reçois ces paramètre les retransmettre à celui qui génère la PDF. Le principe est quasi le même que pour une image dynamique avec GD, je ne sais pas si tu connais. Je te donne un exemple de mon coté, légèrement différent car au bout il n'y a pas de téléchargement, mais le PDF est intégrer dans dans une autre page Web. Page article_pdf.php Code html :
Ca se peut que dans ton cas, les données GET (ou POST) sont reçues comme ici dans article_pdf, mais pas doc_pdf.php. Puis doc_pdf.php (qui est intégrée dans article_pdf.php) Code :
Je n'ai mis que l'essentiel, mais la classe MyPDF est une classe dérivée de PDF, et les 3 paramètres sont les suivants : 1/ 'article_'.$reference : Le document aura comme nom article_123 si l'utilisateur souhaite l'enregistrer. 2/ $reference : Ca c'est perso, c'est pour récupérer les données d'un article en particulier. 3/ I : C'est pour la sortie, methode PDF::output(), est comme c'est I alors le flux du PDF sera renvoyé directement vers le navigateur. En aucun cas le fichier est déposé dans mon espace disque, ce qui fait qu'il n'y pas besoin de supprimer quoi que ce soit sur le serveur. Ton cas est différent, car tu souhaiter que le document soit a télécharger. Mais normalement il n'est pas nécessaire de générer le PDF dans ton espace disque pour ensuite le lire et générer le flux et enfin le supprimer. La classe PDF permet de le faire, il faut juste rajouter en 2ème paramètres à la méthode PDF::output('nom.pdf', 'D') le bon type en sortie. Il y a plusieurs choix (I, D, F ou S), c'est ce que j'ai mis dans le post précédent. Je te conseils d'ailleurs de générer "à la volée" le PDF au lieu de le proposer en téléchargement. C'est plus simple car on voit tout de suite s'il y a erreur ou pas. Commence par un banal "Hello Wold", fait simple de façon à visualiser dans le navigateur le document. Après, résout le problème du paramètre pour éviter les sessions. En dernier le contenu du PDF. Citation:
Normalement, quand on génère un PDF, il faut avoir toutes les infos, ou disons qu'on doit pouvoir tout récupérer (requête SQL par ex.). On ne peux pas commencer à créer le document, ensuite interroger l'utilisateur pour ensuite terminer le document. Ca c'est pas possible. Où alors j'ai mal compris.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
||||||
|
|
10
|
|
|
#5 | ||||||||
|
Membre du Club
![]() Alain Développeur informatique Inscription : mai 2008 Messages : 117 ![]() |
Merci pour ton intérêt.
Si le paramètre est bien reçu, j'ai vérifié avec une fonction personnelle de debug. Voici la structure (ce n'est pas du code) fichier 1 appel à la fonction avec la valeur reçu du formulaire utilisateur description_univers_impression($_POST['ref_univers']) fichier 2 la fonction description_univers_impression($ref_univers) est dans ce fichier et elle reçoit la valeur que lui a passé le fichier 1 Si je passe cette valeur (qui existe à cet endroit, j'ai vérifié) à Header dans l'extension de la classe FPDF, cela ne fonctionne pas (avec ou sans déclaration de la variable en global. J'ai simplifié le code de Header pour l'illustration Code :
Code :
Citation:
J'ai essayé chaque paramètre, aucun ne fonctionne. Citation:
Je ne comprend pas : de générer "à la volée" le PDF Citation:
Citation:
foreach lisant un tableau avec n élément (fichier 1) envoi de l'élément n°1 à la fonction qui fabrique le PDF 1 (fichier 2) retour à foreach pour recommencer avec l'élément n°2 (fichier 1) envoi de l'élément n°2 à la fonction qui fabrique le PDF 2 (fichier 2) retour à foreach pour recommencer avec l'élément n°3 (fichier 1) .... et ainsi de suite jusqu'à l'élément n Il n'y a dans mon cas que la fabrication de l'univers n°1 et pas des autres. Passionnant ce problème et je pense qu'il y a forcément une solution. A suivre. |
||||||||
|
|
00
|
|
|
#6 | |||||||||
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 691 ![]() |
Citation:
Ce qui veut dire qu'il n'est pas utile de la "passer" en argument dans la fonction description_univers_impression($_POST['ref_univers']) par exemple. Code :
Citation:
Code :
Citation:
Plusieurs PDF ? Ou plusieurs pages que contiendra le (l'unique) PDF ? A ma connaissance (donc sauf erreur), il n'est pas possible d'envoyer plusieurs PDF d'un coup. Il faudrait théoriquement recharger la page autant de fois qu'il y aura de documents PDF à générer (à proposer). Ce qui sous entend qui ne faudrait pas boucler sur les Univers, mais les faire 1 par 1. Si tel est le cas, pourquoi ne pas proposer plusieurs pages (donc 1 seul PDF) avec les différents Univers par exemple ? Citation:
Le visiteur (navigateur) reçois le flux, affiche le PDF, le visiteur le visualise dans son navigateur (mais au fond le document n'existe pas). Mais comme un PDF réclame un plugin Adobe Reader (comme Flash entre autre), le plugin donne la possibilité d'enregistrer le document. C'est la cas si on renseigne I comme 2ème argument du output, soit : Citation:
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|||||||||
|
|
10
|
|
|
#7 |
|
Membre du Club
![]() Alain Développeur informatique Inscription : mai 2008 Messages : 117 ![]() |
Bien, bien.
Tout d'abord, effectivement je retiens la solution de fabriquer un seul PDF qui contiendra les descriptions des univers choisis plutôt que de fabriquer un PDF par univers. Au reste, c'est peut être plus pratique pour l'utilisateur. J'ai donc passé mon tableau ($_POST['variable']) en argument de la fonction. Mais il me reste toujours 2 problèmes qui subsistent : 1° utilisation de S_SESSION pour passer les valeurs à Header,Footer. Cela ne fonctionne toujours pas et je ne comprends pas d'autant que les valeurs à passer sont récupérées au sein de la fonction. 2° Output ne fonctionne toujours pas malgré la syntaxe que j'ai vérifiée plusieurs fois en faisant plusieurs essais. J'en suis à me demander si l'erreur de viendrait pas de FPDF lui même !!! Cela ne me semble pas possible. Je pense que je vais en rester là pour l'instant car le résultat obtenu est conforme à ce que j'attends mis à part 2 anomalies pas très académiques que j'essaierai de corriger plus tard. Merci à toi RunCodePhp. Tu as été très sympa. ![]()
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com