lib FPDF et insertion de variables

Eléphanteau du PHP | 29 Messages

23 oct. 2006, 13:37

Bonjour à tous, j'ai clos le sujet sur la gestion de la BDD. Aujourd'hui, un formulaire récupère des réponses d'internautes qui sont modifiables et supprimables par l'admin. Le but final de ce projet est de générer un pdf qui inclut les réponses de ces internautes dans ces champs.

J'utilise donc FPDF (mais je serai prêt à payer pdflib si je suis sûr qu'il est mieux). Après avoir observé, je pourrai presque réaliser le document, même si j'ai des problèmes... Dans mon document final, le texte a beaucoup d'attributs différents (un mot en gras, l'autre en italique etc...) donc je peux pas importer de texte comme on le voit dans le doc2.php de FPDF, je dois écrire le texte dans le fichier PHP. Mais j'ai des soucis avec les CELL, la seule méthode que j'ai pu comprendre (petit niveau de php) c'est de créer ces cellules avec $pdf>Cell(80) $pdf->setfont etc... mais je pense pas être dans la bonne voie, puisque l'auteur du doc écrit également des fonctions pour l'en-tete et le bas de page (qui ne me servent pas) mais j'aimerai reprendre le principe pour donner tous les attributs au texte, aujourd'hui j'en suis là :
//Instanciation de la classe dérivée
$pdf=new PDF();
$pdf->AliasNbPages();
$pdf->AddPage();
//Images haut et bas à gauche
$pdf->Image('logo.jpg',10,15,50);
$pdf->Image('logo2.jpg',10,240,50);

	//Encadré gris
$pdf->SetFont('times','I','B',8);
$pdf->Cell(80);
$pdf->Cell(0,0,'Titre',1,0,'C');

	//Bloc texte 1
$pdf->SetFont('times','B',10);
//Décaler le texte vers la droite
$pdf->Cell(80);
$pdf->Cell(10,15,'Entre',0,'C');


$pdf->Output();

$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
Mais bon je m'apercois que //encadré gris et //bloc texte 1 sont incompatibles, puisqu'au moment de générer l'un prend le pas sur l'autre... auriez-vous une idée qui me permettrait d'avancer un peu ? je vous remercie très beaucoup [-o<

Mammouth du PHP | 1029 Messages

23 oct. 2006, 14:51

Bonjour,

Alors tout d'abord, je pense que Fpdf est un très bonne librairie, pas besoin d'aller voir ailleurs.

Tu dois comprendre, que ton pdf tu vas le créer de bout à bout, pour commencer tu devrais définir la création de ton pdf avec des attributs ,dont on est sur de maitriser
<?php
$pdf=new FPDF('P','mm','A4');
?>
Portrais,milimetre,A4

Ensuite chaque cellule est à déposé sur ta feuilles, c'est à dire que c'est toi qui place là ou il faut(Perso j'indique chaque éléments, plus long mais plus juste).

dans ton cas
utilise:
<?php
$pdf->SetXY()
?>
<?php
/Encadré gris
$pdf->SetXY(15,35);//15mm du bord gauche de la feuilles, 35mm du haut de la feuilles
$pdf->SetFont('times','I','B',8);
$pdf->Cell(0,0,'Titre',1,0,'C');

    //Bloc texte 1
$pdf->SetXY(15,70);15mm du bord gauche de la feuilles, 70mm du haut de la feuilles
$pdf->SetFont('times','B',10);
$pdf->Cell(10,15,'Entre',0,'C');

?>

L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 29 Messages

23 oct. 2006, 15:19

(chapeau les mecs, vos publicités google sont très bien ciblées, on me propose "the solution for your dynamic PDF needs", hasard.... :-k )

merci pour tes explications très claires maitrepylos ! J'ai crû lire que cette manip' prenait pas mal en ressources système, d'ailleurs depuis que je réessaie de générer, ca plante ! même si je reviens au script tel qu'il fonctionnait hier...

rectification : en fait c'était forcément de ma faute ce plantage...

Mammouth du PHP | 1029 Messages

23 oct. 2006, 16:07

met ton code complet
L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 29 Messages

23 oct. 2006, 16:12

Par les pouvoirs d'Informatos, j'invoque "CopiCol" !

<?php
require('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');
}
}

//Instanciation de la classe dérivée
$pdf=new PDF();
$pdf->AliasNbPages();
$pdf->AddPage();
//Images haut et bas à gauche
$pdf->Image('logo.jpg',10,15,50);
$pdf->Image('logo2.jpg',10,240,50);

$pdf->SetXY(50,35);//15mm du bord gauche de la feuilles, 35mm du haut de la feuilles
$pdf->SetFont('times','I','B',8);
$pdf->Cell(0,0,'Titre','C');

    //Bloc texte 1
$pdf->SetXY(80,70);//15mm du bord gauche de la feuilles, 70mm du haut de la feuilles
$pdf->SetFont('times','B',10);
$pdf->Cell(10,15,'Entre',0,'C'); 

$pdf->Output();


?>


Mammouth du PHP | 1029 Messages

23 oct. 2006, 16:32

Salut essaye ceci, chez moi ça marche.
<?php
<?php
ob_start();
require('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');
}
}

//Instanciation de la classe dérivée
$pdf=new PDF();
$pdf->AliasNbPages();
$pdf->AddPage();
//Images haut et bas à gauche
$pdf->Image('logo.jpg',10,15,50);
$pdf->Image('logo2.jpg',10,240,50);

$pdf->SetXY(50,35);//15mm du bord gauche de la feuilles, 35mm du haut de la feuilles
$pdf->SetFont('times','I','B',8);
$pdf->Cell(0,0,'Titre','C');

    //Bloc texte 1
$pdf->SetXY(80,70);//15mm du bord gauche de la feuilles, 70mm du haut de la feuilles
$pdf->SetFont('times','B',10);
$pdf->Cell(10,15,'Entre',0,'C'); 

ob_end_flush(); 
$pdf->Output();


?>
?>

Je sais faut pas m'en vouloir, mais je n'ai jamais rien comprios avec cette histoire de caractère passer au travers de l'envoi.

Donc je fais un parade pas très propre, mais qui fonctionne.

Désolé aux modos qui seront pas d'accord
L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 29 Messages

23 oct. 2006, 16:54

le dernier script que j'ai copié collé fonctionnait, mais avec le ob_and_flush, il me dit qu'il a rien à vider dans la mémoire vive. En tout cas, je me dis franchement que c'est un p$$$ de taff de reproduire un pdf avec le php... surtout que l'intérêts c'est de pouvoir y insérer des variables, j'en suis pas encore là, je vais essayer de mettre les 3 pages en forme avec la méthode que tu m'as donné (merci !) et puis je vais revenir - sans doute rapidement - en cas de problème !

Modérateur PHPfrance
Modérateur PHPfrance | 6037 Messages

23 oct. 2006, 17:10

EssaieFPDIqui te permet de mettre des morceaux de PDF dans ton fPDF !
Règle n°2 du webmaster : Toujours commencer par le HTML qu'on veut obtenir....toujours ! :priere:
J'aime apprendre de nouvelles choses.

Eléphanteau du PHP | 29 Messages

23 oct. 2006, 17:48

Merci mere-theresa qui porte très bien son nom :lol:

je teste, ca peut fonctionner mais avant d'aller un peu plus loin avec cette méthode, j'aimerai savoir si je peux insérer à des endroits précis du doc (j'ai envie de dire par dessus l'image générée par fpdi) des entrées de ma base de données.

pour bambi par exemple : il était une fois bambi

et puis pour benny hill : il était une fois benny hill

Ce qui est génial avec la méthode de mere-theresa, c'est que le texte est long, ca me ferait gagner un temps monstre, mais à des endroits précis de ce texte, je dois y insérer une quarantaine d'entrées de la base.

Mammouth du PHP | 1029 Messages

24 oct. 2006, 09:42

Bien sur que c'est possible comme ceci
<?php
$pdf->Cell(10,15,$variable[champsdetatable],0,'C');
?>
L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 29 Messages

24 oct. 2006, 10:12

génial !

J'ai bossé dessus hier soir et j'en suis arrivé à quelque chose approchant... mais j'ai remarqué que lorsque je demandais dans le même document une connexion à la base de données, cela empêchait la création du pdf....
je mets le code avec la connexion à la BDD même si je pense qu'il y a des erreurs dans le placement du if.... :oops:
<?php
  
  $cnx = mysql_connect( "localhost", "root", "" ) ;
   mysql_selectdb("mysql") or die;
  $id  = $_GET["idPersonne"] ;
  
  $sql = "SELECT * FROM bddcs WHERE id = ".$id ;
	    
  $requete = mysql_query( $sql, $cnx ) ;
  
  
define('FPDF_FONTPATH','font/');
require('fpdi.php');
require('fpdf.php');

$pdf= new fpdi();
class PDF extends FPDF
{
}

if( $result = mysql_fetch_object( $requete ) )
  {
  
$pagecount = $pdf->setSourceFile("pdfdoc.pdf");

$pdf->addPage();
$tplidx = $pdf->ImportPage(1);
$pdf->SetFont('times','B',15);
$pdf->Cell(100,150,$result[etnom],0,'C');
$pdf->useTemplate($tplidx,0,0,210);


$tplidx = $pdf->ImportPage(2);
$pdf->addPage();
$pdf->useTemplate($tplidx,0,0,210);

$tplidx = $pdf->ImportPage(3);
$pdf->addPage();
$pdf->useTemplate($tplidx,0,0,210);

$pdf->Output("newpdf.pdf","I");
$pdf->closeParsers();
}
?> 

Mammouth du PHP | 1029 Messages

24 oct. 2006, 10:17

Je ne connais pas Fpdi, mais je dirais comme ceci
<?php
  
  $cnx = mysql_connect( "localhost", "root", "" ) ;
   mysql_selectdb("mysql") or die;
  $id  = $_GET["idPersonne"] ;
  
  $sql = "SELECT * FROM bddcs WHERE id = ".$id ;
        
  $requete = mysql_query( $sql, $cnx ) ;
  
  
define('FPDF_FONTPATH','font/');
require('fpdi.php');
require('fpdf.php');

$pdf= new fpdi();


if( $result = mysql_fetch_object( $requete ) )
  {
  
$pagecount = $pdf->setSourceFile("pdfdoc.pdf");

$pdf->addPage();
$tplidx = $pdf->ImportPage(1);
$pdf->SetFont('times','B',15);
$pdf->Cell(100,150,$result[etnom],0,'C');
$pdf->useTemplate($tplidx,0,0,210);


$tplidx = $pdf->ImportPage(2);
$pdf->addPage();
$pdf->useTemplate($tplidx,0,0,210);

$tplidx = $pdf->ImportPage(3);
$pdf->addPage();
$pdf->useTemplate($tplidx,0,0,210);
  }
$pdf->Output("newpdf.pdf","I");
$pdf->closeParsers();

?> 

L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 29 Messages

24 oct. 2006, 12:55

je comprends, j'ai le meme script de connexion mysql sur un autre fichier et cela fonctionne parfaitement... tandis que sur celui-ci, je me demande si y a pas des incompatibilités... pour tester, j'ai cherché la variable qui correspond un ID 3 dans la requete... et il est pas content... deux erreurs :
Use of undefined constant etprenom - assumed 'etprenom'
et FPDF error: Some data has already been output to browser, can't send PDF file
  $cnx = mysql_connect( "localhost", "root", "" ) ;
  mysql_selectdb("mysql") or die;
  
	$sql = "SELECT * FROM bddcs WHERE id = 3 " ;
        
	$requete = mysql_query( $sql, $cnx ) ;
  
  
define('FPDF_FONTPATH','font/');
require('fpdi.php');
require('fpdf.php');

$pdf= new fpdi();

if( $result = mysql_fetch_object( $requete ) )
{
  
$pagecount = $pdf->setSourceFile("pdfdoc.pdf");

$pdf->addPage();
$tplidx = $pdf->ImportPage(1);
$pdf->SetFont('times','B',15);
$pdf->Cell(100,150,$result[etprenom],0,'C');
$pdf->useTemplate($tplidx,0,0,210);

$pdf->addPage();
$tplidx = $pdf->ImportPage(2);

$pdf->useTemplate($tplidx,0,0,210);

$tplidx = $pdf->ImportPage(3);
$pdf->addPage();
$pdf->useTemplate($tplidx,0,0,210);
}
$pdf->Output("newpdf.pdf","I");
$pdf->closeParsers();

?>

Mammouth du PHP | 1029 Messages

25 oct. 2006, 09:11

Tu demandes un objet, donc ton
$result[etprenom]
doit être
$result->etprenom
L'expérience est la somme de toutes nos erreurs.

Eléphanteau du PHP | 29 Messages

25 oct. 2006, 10:11

merci maitre pylos, je vais pouvoir m'y atteler maintenant ! merci pour tout \:D/