Page 1 sur 1

lib FPDF et insertion de variables

Posté : 23 oct. 2006, 13:37
par papipato
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<

Posté : 23 oct. 2006, 14:51
par Maitrepylos
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');

?>


Posté : 23 oct. 2006, 15:19
par papipato
(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...

Posté : 23 oct. 2006, 16:07
par Maitrepylos
met ton code complet

Posté : 23 oct. 2006, 16:12
par papipato
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();


?>


Posté : 23 oct. 2006, 16:32
par Maitrepylos
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

Posté : 23 oct. 2006, 16:54
par papipato
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 !

Posté : 23 oct. 2006, 17:10
par mere-teresa
EssaieFPDIqui te permet de mettre des morceaux de PDF dans ton fPDF !

Posté : 23 oct. 2006, 17:48
par papipato
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.

Posté : 24 oct. 2006, 09:42
par Maitrepylos
Bien sur que c'est possible comme ceci
<?php
$pdf->Cell(10,15,$variable[champsdetatable],0,'C');
?>

Posté : 24 oct. 2006, 10:12
par papipato
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();
}
?> 

Posté : 24 oct. 2006, 10:17
par Maitrepylos
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();

?> 


Posté : 24 oct. 2006, 12:55
par papipato
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();

?>

Posté : 25 oct. 2006, 09:11
par Maitrepylos
Tu demandes un objet, donc ton
$result[etprenom]
doit être
$result->etprenom

Posté : 25 oct. 2006, 10:11
par papipato
merci maitre pylos, je vais pouvoir m'y atteler maintenant ! merci pour tout \:D/