[RESOLU] enregistrer des données dans un pdf

Eléphant du PHP | 89 Messages

04 sept. 2022, 17:38

Rebonjour, j'ai poursuivi mon code et je bloque à nouveaux et je ne comprend pas comment faire. Voilà mon problème: je voudrais que lorsque je clique sur un bouton (ici un bouton enregistrer) cela créer un fichier pdf au nom de l'élève cocher et contenant le nom des compétences valider (sachant qu'il va y avoir des compétence de rajouter au fur et à mesure). Pour le moment j'arrive à écrire un pdf mais celui-ci n'est pas enregistrer il est juste visible (je l'ai fait avec le tuto fpdf)
au niveau du code du fichier pdf ça donne ça:

Code : Tout sélectionner

<?php require('fdpf/fpdf.php'); class PDF extends FPDF { // Pied de page function Footer() { // Positionnement à 1,5 cm du bas $this->SetY(-15); // Police Arial italique 8 $this->SetFont('Arial','I',8); // Numéro de page $this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C'); } } $pdf = new PDF(); $pdf->AliasNbPages(); $pdf->AddPage(); // Police Arial gras 15 $pdf->SetFont('Arial','B',15); // Décalage à droite $pdf->Cell(80); // Titre $pdf->Cell(50,10,"$ps",1,0,'C'); // Saut de ligne $pdf->Ln(20); $pdf->SetFont('Times','',12); $pdf->Cell(0,10,"$competence",0,1); $pdf->Output(); ?>
Pour le code php du bouton ça donne ça:

Code : Tout sélectionner

<?php if(isset($_POST["valider"])){ if(!empty($_POST['ps'])){ foreach($_POST['ps'] as $ps){ print_r ($ps ."<br>"); } } if(!empty($_POST['gs'])){ foreach($_POST['gs'] as $gs){ print_r ($gs ."<br>"); } } if(!empty($_POST['competence'])){ foreach($_POST['competence'] as $competence){ print_r ($competence ."<br>"); } } if($ps!="" and $competence!=""){ require "./pdf/test.php"; } else if($gs!="" and $competence!=""){ require "./pdf/test.php"; } } ?>
Pouvez vous m'aider ?

Avatar du membre
Mammouth du PHP | 1609 Messages

04 sept. 2022, 17:51

Rebonjour,

http://www.fpdf.org/en/doc/output.htm
F: save to a local file with the name given by name (may include a path).
$pdf->Output('F', 'chemin/du/fichier.pdf');
Développeur web depuis + de 20 ans

Eléphant du PHP | 89 Messages

04 sept. 2022, 17:58

Rebonjour,

http://www.fpdf.org/en/doc/output.htm
F: save to a local file with the name given by name (may include a path).
$pdf->Output('F', 'chemin/du/fichier.pdf');
Merci en effet ça permet d'enregistrer le fichier mais je n'arrive pas à faire en sorte que le nom du fichier soit "$ps.pdf" ça me met une erreur alors que si je met: "test.pdf" ça marche est-ce-que le fait que le nom soit variable pose problème ?

Avatar du membre
Mammouth du PHP | 1609 Messages

04 sept. 2022, 18:10

Il y a potentiellement plusieurs raisons pour que ça ne marche pas. Déjà peut-on simplement utiliser le $ dans un nom de fichier ? si ce n'est pas le cas tu auras une erreur.

Et sinon si dans le code tu as mis "$ps.pdf" avec des " comme ça, ça pose problème car avec une chaine entre " php va tenter d'interpréter les variables dedans, $ps va donc être considéré comme une variable qui n'existe probablement pas. En résultera un fichier .pdf tout court si le système l'accepte ou plus vraisemblablement une erreur.

Tu peux essayer en mettant '$ps.pdf' pour voir si ça marche.

PS : tu peux aussi avoir un problème de droit d'écriture sur le répertoire. Le serveur qui exécute le script doit avoir le droit d'écrire dans le répertoire de destination.
Développeur web depuis + de 20 ans

Eléphant du PHP | 89 Messages

04 sept. 2022, 18:15

Il y a potentiellement plusieurs raisons pour que ça ne marche pas. Déjà peut-on simplement utiliser le $ dans un nom de fichier ? si ce n'est pas le cas tu auras une erreur.

Et sinon si dans le code tu as mis "$ps.pdf" avec des " comme ça, ça pose problème car avec une chaine entre " php va tenter d'interpréter les variables dedans, $ps va donc être considéré comme une variable qui n'existe probablement pas. En résultera un fichier .pdf tout court si le système l'accepte ou plus vraisemblablement une erreur.
J'ai déjà utiliser cette méthode pour mettre des informations dans des documents txt donc ça devrait marcher je suppose (et je ne pense pas qu'il y ai des problème de droit car lorsque je met test.pdf au lieu de $ps.pdf ça marche)
(je te met le code pour que tu puisse mieux voir si il y a une erreur)

Code : Tout sélectionner

$pdf->Output("F","./$ps.pdf");
et quand je regarde l'erreur qui en ressort ça à l'air de marcher mais pas complètement (voici l'erreur)

Warning: file_put_contents(./grdbd .pdf): failed to open stream: No such file or directory in C:\wamp64\www\site dossier scolaire\saisir\pdf\fdpf\fpdf.php on line 1015
Call Stack
# Time Memory Function Location
1 0.0008 366256 {main}( ) ...\saisir.php:0
2 0.0024 367664 require( 'C:\wamp64\www\site dossier scolaire\saisir\pdf\test.php ) ...\saisir.php:63
3 0.0041 384400 FPDF->Output( $dest = 'F', $name = './grdbd\r\n.pdf', $isUTF8 = ??? ) ...\test.php:32
4 0.0051 390336 file_put_contents( $filename = './grdbd\r\n.pdf', $data = '%PDF-1.3\n3 0 obj\n<</Type /Page\n/Parent 1 0 R\n/Resources 2 0 R\n/Contents 4 0 R>>\nendobj\n4 0 obj\n<</Filter /FlateDecode /Length 147>>\nstream\nx�]�1\n\0021\020F�>�K-��L2&i\005-�\004Sڬd]V\004!�^_wED\017=�`k,i�ì2�\r���E>a���\022\v";R\017L�a!���v��e��|H�b@.��\034ˡ�9y�La\001�7<:&N\b.�}�[{�\016\025��v�!X\t�D��Nv�\035��z\002\n\r1\r\nendstream\nendobj\n1 0 obj\n<</Type /Pages\n/Kids [3 0 R ]\n/Count 1\n/MediaBox [0 0 595.28 841.89]\n>>\nendobj\n5 0 obj\n<</Filter /FlateDecode /Length 364>>\nstre' ) ...\fpdf.php:1015

Avatar du membre
Mammouth du PHP | 1609 Messages

04 sept. 2022, 18:21

Je vois un problème avec cette partie du message d'erreur non ? le \r\n c'est pas terrible dans un nom de fichier non ?
file_put_contents( $filename = './grdbd\r\n.pdf',
Développeur web depuis + de 20 ans

Eléphant du PHP | 89 Messages

04 sept. 2022, 18:24

Je vois un problème avec cette partie du message d'erreur non ? le \r\n c'est pas terrible dans un nom de fichier non ?
file_put_contents( $filename = './grdbd\r\n.pdf',
Oui je pense que c'est ce qui gêne mais je ne vois pas d'où ça vient car en gros dans le cas présent $ps="grdbd"

Avatar du membre
Mammouth du PHP | 1609 Messages

04 sept. 2022, 18:30

Ben non, visiblement $ps = 'grdbd\r\n' ^^

Comment est alimentée la variable ?

Après c'est pas compliqué de les virer avec un str_replace par exemple.

Sais-tu au moins ce que représente \r\n ?
Développeur web depuis + de 20 ans

Eléphant du PHP | 89 Messages

04 sept. 2022, 18:34

la variable est alimentée comme ceci:

Code : Tout sélectionner

<?php if(isset($_POST["valider"])){ if(!empty($_POST['ps'])){ foreach($_POST['ps'] as $ps){ print_r ($ps ."<br>"); }
et je viens de faire un essai en mettant var_dump($ps) pour voir ce qui en est ressortie et j'obtiens ceci:
C:\wamp64\www\site dossier scolaire\saisir\saisir.php:68:string 'grdbd' (length=7)

Avatar du membre
Mammouth du PHP | 1609 Messages

04 sept. 2022, 18:39

Ok, ça vient d'un champ de formulaire. Ton champ ne serait-il pas un textarea ?

Je vois que tu fais un foreach dessus pourquoi ?

Et je te redemande sais-tu ce que représente \r\n et pourquoi ce bout de chaine pourrait être présent dans la variable bien que non visible dans ton navigateur ?
Développeur web depuis + de 20 ans

Eléphant du PHP | 89 Messages

04 sept. 2022, 18:41

ça ne vient pas d'un textarea mais de la value d'une checkbox et il n'y a aucune raison pour que le \r\n apparaisse dans la variable.

Eléphant du PHP | 89 Messages

04 sept. 2022, 18:43

L'origine de la checkbox c'est ce code

Code : Tout sélectionner

<?php $fp = @fopen("popup/ps.txt", "r"); // Ouverture du tableau contenant les prénoms $tab = array(); if ($fp) { while ($buffer = fgets($fp)) { echo '<input type="checkbox" name="ps[]" value="'.$buffer.'"; />'.$buffer ."<br><br>"; if (isset( $_POST['envoie'])) { if (isset( $_POST['value_1'])) echo $_POST['value_1'].'<br />'; // Contenu de la global P_POST print_r($_POST); } } fclose($fp); } ?>
Qui est ensuite utilisé comme ça:

Code : Tout sélectionner

<?php if(isset($_POST["valider"])){ if(!empty($_POST['ps'])){ foreach($_POST['ps'] as $ps){ print_r ($ps ."<br>"); } } if(!empty($_POST['gs'])){ foreach($_POST['gs'] as $gs){ print_r ($gs ."<br>"); } } if(!empty($_POST['competence'])){ foreach($_POST['competence'] as $competence){ print_r ($competence ."<br>"); } } if($ps!="" and $competence!=""){ require "./pdf/test.php"; } else if($gs!="" and $competence!=""){ require "./pdf/test.php"; } } ?>
Et où l'on découvre un problème dans ce dernier code:

Code : Tout sélectionner

$pdf = new PDF(); $pdf->AliasNbPages(); $pdf->AddPage(); // Police Arial gras 15 $pdf->SetFont('Arial','B',15); // Décalage à droite $pdf->Cell(80); // Titre $pdf->Cell(50,10,"$ps",1,0,'C'); // Saut de ligne $pdf->Ln(20); $pdf->SetFont('Times','',12); $pdf->Cell(0,10,"$competence",0,1); $pdf->Output("F","./$ps.pdf"); ?>

Avatar du membre
Mammouth du PHP | 1609 Messages

04 sept. 2022, 18:47

Il semble pourtant bien introduit à un moment ou un autre, sinon il n’apparaitrait pas dans le message d'erreur.

Ça ne peut pas venir du foreach ou du print_r et comme ça vient du value d'une checkbox alors je suppose que la checbox doit être déclarée comme ceci :

Code : Tout sélectionner

<input type="checkbox" name="ps[]" value="rgdbd "/>
Le \r\n correspond à une nouvelle ligne dans windows (CRLF Carriage Return + Line Feed) et il viendrait de la ?
Développeur web depuis + de 20 ans

Avatar du membre
Mammouth du PHP | 1609 Messages

04 sept. 2022, 18:48

Yes bah voilà le \r\n doit venir de $buffer.

Tu lis un fichier txt ligne par ligne et quand tu récupères une ligne le \r\n de fin de ligne est également retourné.

Tu dois donc le retirer à ce niveau la.
echo '<input type="checkbox" name="ps[]" value="'.str_replace("\r\n", '', $buffer).'" />'.$buffer ."<br><br>";
Attention tu as un ; inutile ici value="'.$buffer.'";
Développeur web depuis + de 20 ans

Eléphant du PHP | 89 Messages

04 sept. 2022, 18:55

en gros je t'explique avec des mots plutôt que de te montrer tous le code.
à l'origine on rentre le nom des élèves dans un document txt (où il y a un nom par ligne). Ensuite on va récupérer ligne par ligne avec un $buffer=fgets les prénom qui seront contenu dans le $buffer. Ce $buffer va servir de value à la checkbox qui possède un name 'ps[]'. Cette value va être récupérer lorsque la checkbox va être coché et que l'on va appuyer sur le bouton et le $ps va être créer de cette façon : foreach($_POST['ps'] as $ps) donc je contenue de $buffer sera identique à celui de $ps