Page 1 sur 1

Affichage tableau FPDF en 2 parties

Posté : 17 juin 2011, 09:52
par trifly
Bonjour à tous,

J'ai un tableau que j'affiche en PDF via FPDF que j'alimente via une requête SQL sur une base MySQL.
Tout fonctionne correctement mais ce tableau étant destiné à l'impression, je cherche à otpimiser sa mise en forme et sa taille.

Ce que je cherche à faire c'est déjà d'afficher celui-ci en 2 parties par pages, c'est-à-dire avoir 2 fois plus d'infos du tableau affichées par page.

J'essaie de détecter en vain la fin de la page pour replacer le curseur en haut de la page mais comme la création du tableau se fait simplement avec la fonction DrawTableau je ne vois pas ou placer la détection de fin de page afin de redessiner un nouveau tableau à d'autres coordonnées.

Je ne sais pas si je me suis bien fais comprendre mais n'hésitez pas à me demander plus d'infos !

Je vous mets mon code pour être plus clair :
<?php
try {	
	$bdd = new PDO('mysql:host=localhost;dbname=inventaire', 'inventaire', 'test');
} catch(Exception $e) {
	die('Erreur : '.$e->getMessage());
}
$inventaire = $bdd->query("SELECT * FROM inventaire")or die(print_r($bdd->errorInfo())); 
 
include("phpToPDF.php");
 
$PDF = new phpToPDF('P','mm','A4');
$PDF->AddPage();
$PDF->SetAutoPageBreak(true,5);
 
$PDF->setXY(0,40);
 
 
// Définition des propriétés du tableau.
$proprietesTableau = array(
	'TB_ALIGN' => 'C',
	// 'L_MARGIN' => 0,
	// 'T_MARGIN' => 100,
	'BRD_COLOR' => array(0,92,177),
	'BRD_SIZE' => '0.3',
	);
 
// Définition des propriétés du header du tableau.	
$proprieteHeader = array(
	'T_COLOR' => array(150,10,10),
	'T_SIZE' => 8,
	'T_FONT' => 'Arial',
	'T_ALIGN' => 'C',
	'V_ALIGN' => 'T',
	'T_TYPE' => 'B',
	'LN_SIZE' => 7,
	'BG_COLOR_COL0' => array(170, 240, 230),
	'BG_COLOR' => array(170, 240, 230),
	'BRD_COLOR' => array(0,92,177),
	'BRD_SIZE' => 0.2,
	'BRD_TYPE' => '1',
	'BRD_TYPE_NEW_PAGE' => '',
	);
 
// Contenu du header du tableau.	
$contenuHeader = array(
	30, 30, 30,
	"ARTICLE", "STOCK", "PRIX",
	);
 
// Définition des propriétés du reste du contenu du tableau.	
$proprieteContenu = array(
	'T_COLOR' => array(0,0,0),
	'T_SIZE' => 10,
	'T_FONT' => 'Arial',
	'T_ALIGN' => 'C',
	'V_ALIGN' => 'M',
	'T_TYPE' => '',
	'LN_SIZE' => 6,
	'BG_COLOR_COL0' => array(245, 245, 150),
	'BG_COLOR' => array(255,255,255),
	'BRD_COLOR' => array(0,92,177),
	'BRD_SIZE' => 0.1,
	'BRD_TYPE' => '1',
	'BRD_TYPE_NEW_PAGE' => '',
	);	
 
// Contenu du tableau.
$contenuTableau = array();
while ($tab = $inventaire->fetch()) {
	array_push($contenuTableau, $tab['ARTICLE'], $tab['STOCK'], $tab['PRIX']);
}
 
 
$inventaire->closeCursor();
 
$PDF->drawTableau($PDF, $proprietesTableau, $proprieteHeader, $contenuHeader, $proprieteContenu, $contenuTableau);
 
$PDF->Output();
?>
Quelqu'un connait-il une manière (détourné ou non) de détecter une fin de page et de continuer la fonction "drawTableau" ailleurs ?

Merci d'avance pour votre aide !

Re: Affichage tableau FPDF en 2 parties

Posté : 17 juin 2011, 14:56
par moogli
salut,

la détection de la fin de page automatique se fait avec $PDF->SetAutoPageBreak(true,5);, c'est le cas par défaut lors de l'utilisation de la classe.

J'ai testé ton code avec une base de test (assez immportante que j'ai trouvé ici) et j'ai bien les saut de page qui se font sans soucis.

tu peux voir le résultat la => http://phpjungle.info/phpfrance/testpdf.php?nb=120
tu peux jouer avec le paramètre nb pour voir avec différent nombre de résultat (max 2000 pour pas dépasser la mémoire max :) )) ;)

le code utilisé c'est le tiens j'ai juste modifié un peu les marge et le nombre de champ pour coller à ce que je voulais ;)
<?php
if (isset($_GET['nb']) && is_numeric($_GET['nb']) && $_GET['nb']<=2000) {
    $nb = (int) $_GET['nb'];
    
}
else $nb = 250;
$pdoconnect = array(
        'local' => array(
        'host' => 'localhost',
        'dbname'=> 'employees',
        'user' => 'root',
        'mdp' => ''
        
    )
);
$emplacement = 'local';
if ($_SERVER["SERVER_NAME"]=='phpjungle.info') $emplacement = 'inthenet';
try {  
    $bdd = new PDO('mysql:host='.$pdoconnect[$emplacement]['host'].';dbname='.$pdoconnect[$emplacement]['dbname'],
        $pdoconnect[$emplacement]['user'], $pdoconnect[$emplacement]['mdp']);
} catch(Exception $e) {
        die('Erreur : '.$e->getMessage().var_dump($bdd)
        );
}
$inventaire = $bdd->prepare('select E.emp_no as id,last_name, first_name,date_format(birth_date,\'%d/%m/%Y\') as birth,gender, date_format(hire_date,\'%d/%m/%Y\') as arrive, title from employees E join titles using(emp_no) limit :limite;')or die(print_r($bdd->errorInfo()));
$inventaire->bindValue(':limite', $nb, PDO::PARAM_INT);
$inventaire->execute();
 
include("phpToPDF/phpToPDF.php");
 
$PDF = new phpToPDF('P','mm','A4');
$PDF->AddPage();
$PDF->SetAutoPageBreak(true,3);
$PDF->setXY(0,10);
//la j'ai juste ajouté un titre pour liste c'est moins laid 
$PDF->SetFont('Arial','B',30);
$PDF->Cell(0,20,'Liste des employes ('.$nb.')',0,1,'C');
 
// Définition des propriétés du tableau.
$proprietesTableau = array(
        'TB_ALIGN' => 'C',
        'L_MARGIN' => 0,
        'T_MARGIN' => 0,
        'BRD_COLOR' => array(0,92,177),
        'BRD_SIZE' => 0.3,
        );
 
// Définition des propriétés du header du tableau.  
$proprieteHeader = array(
        'T_COLOR' => array(150,10,10),
        'T_SIZE' => 12,
        'T_FONT' => 'Arial',
        'T_ALIGN_COLO' => 'C',
        'T_ALIGN' => 'C',
        'V_ALIGN' => 'M',
        'T_TYPE' => 'B',
        'LN_SIZE' => 7,
        'BG_COLOR_COL0' => array(170, 240, 230),
        'BG_COLOR' => array(170, 240, 230),
        'BRD_COLOR' => array(0,92,177),
        'BRD_SIZE' => 0.2,
        'BRD_TYPE' => '1',
        'BRD_TYPE_NEW_PAGE' => '',
        );
 
// Contenu du header du tableau.      
// la j'ai modifié pour coller à ma table mais ça reviens au même 
$contenuHeader = array(
        20,      35    , 35      ,35     ,25                 , 15    , 20,
        "Numero", "Nom", "Prenom",'titre',"Date\nnaissance",'sexe','arrivee'
        );
 
// Définition des propriétés du reste du contenu du tableau.
$proprieteContenu = array(
        'T_COLOR' => array(0,0,0),
        'T_SIZE' => 10,
        'T_FONT' => 'Arial',
        'T_ALIGN' => 'C',
        'V_ALIGN' => 'M',
        'T_TYPE' => '',
        'LN_SIZE' => 6,
        'BG_COLOR_COL0' => array(245, 245, 150),
        'BG_COLOR' => array(255,255,255),
        'BRD_COLOR' => array(0,92,177),
        'BRD_SIZE' => 0.1,
        'BRD_TYPE' => '1',
        'BRD_TYPE_NEW_PAGE' => '',
        );     
 
// Contenu du tableau.
$contenuTableau = array();
// pareil modification pour coller aux tables. 
while ($tab = $inventaire->fetch()) {
        array_push($contenuTableau, 
                $tab['id'], 
                $tab['last_name'],
                $tab['first_name'],
                $tab['title'],
                $tab['birth'],
                $tab['gender'],
                $tab['arrive']);
}
 
$inventaire->closeCursor();
 
$PDF->drawTableau($PDF, $proprietesTableau, $proprieteHeader, $contenuHeader, $proprieteContenu, $contenuTableau);
 
$PDF->Output();
?>
les tables
CREATE TABLE titles (
    emp_no      INT             NOT NULL,
    title       VARCHAR(50)     NOT NULL,
    from_date   DATE            NOT NULL,
    to_date     DATE,
    KEY         (emp_no),
    FOREIGN KEY (emp_no) REFERENCES employees (emp_no) ON DELETE CASCADE,
    PRIMARY KEY (emp_no,title, from_date)
); 
CREATE TABLE employees (
    emp_no      INT             NOT NULL,
    birth_date  DATE            NOT NULL,
    first_name  VARCHAR(14)     NOT NULL,
    last_name   VARCHAR(16)     NOT NULL,
    gender      ENUM ('M','F')  NOT NULL,    
    hire_date   DATE            NOT NULL,
    PRIMARY KEY (emp_no)
);
Aurait tu un exemple de fichier pdf qui pose soucis ?
le code est bien celui que tu nous amis dans ton message ?
quel version phptopdf ? (perso je l'ai prise la http://jc-cornic.developpez.com/tutorie ... age_1#LI-B il y a sur le même lien de la doc pour phptopdf ;) )

@+

Re: Affichage tableau FPDF en 2 parties

Posté : 20 juin 2011, 09:52
par trifly
Salut moogli, merci pour ton aide mais en fait ce que je cherche à faire c'est en plus de mettre mon tableau sur plusieurs pages, c'est de mettre plusieurs parties de celui-ci sur une seule page.

Exemple :
Image

Vois-tu l'astuce ?

Merci !

Re: Affichage tableau FPDF en 2 parties

Posté : 20 juin 2011, 16:11
par moogli
hum la pour le coup je ne sais pas trop, il y a un sujet qui me semble similaire sur leur forum http://www.fpdf.org/phorum/read.php?f=1&i=55561&t=55561

après sinon sur le principe je dirais qu'il faut tester pour voir combien tu en met dans une page, tu récupère ces x lignes X2, tu créer les deux colonnes avec les données dedans, ensuite tu ajouter une page et tu recommence ;)

il y a p'tet moyen de le faire proprement, par exemple en adaptant le tuto N° 4 ? http://fpdf.org/fr/tutorial/tuto4.htm

@+

Re: Affichage tableau FPDF en 2 parties

Posté : 25 juin 2011, 23:19
par sirakawa
Trouvé et utilisé pour afficher des contenus de bdd de longueur variable et imprévisible; (les valeurs sont le fruit de tatonnements), car les exemples de la doc avec multicell ne me satisfaisaient pas, car je voulais que les cellules restent alignées verticalement quelle que soit la longueur de leur contenu.
1) définir la largeur de page, la hauteur de page et la largeur de colonne (en travaillant en pt comme pour les fontes, multiplier les mm par 0.35)
2) définir une hauteur de ligne (environ 1.1 la taille de la fonte).
3) Calculer un nombre de signes casables dans la largeur de colonne:

Code : Tout sélectionner

function calcule_longueur ($largeur_utile, $pdf, $fonte, $genre, $taille) { $mot = chr(65); $pdf->SetFont ($fonte, $genre, $taille); $longueur_mot = $pdf->GetStringWidth($mot); while ($longueur_mot < $largeur_utile): // comme ce sont des polices à chasse variable, il faut varier la lettre ajoutée $mot.= chr(rand(65,91)); $longueur_mot = $pdf->GetStringWidth($mot); endwhile; $nb_signes = strlen ($mot); return array($nb_signes, $longueur_mot); }
$x = qqch;
$y = qqch;
3) pour chaque élément à afficher, en calculer la longueur, la multiplier par 1.25; si cette longueur est supérieure à la largeur de cellule, ajouter des /n dans le texte à afficher avant la valeur trouvée par calcule_longueur, en comptant les lignes produites.
4)
$pdf->SetXY($x,$y);
$pdf->Cell ($x, $hauteur_de_ligne *$nombre_de_lignes.....);
$x += $hauteur_de_ligne * $nombreè_de_lignes;
etc...
par conséquent tu sais pertinemment où se trouve $x, et quand il faut le ramener en haut et changer $y.

Re: Affichage tableau FPDF en 2 parties

Posté : 26 juin 2011, 11:48
par sirakawa
ceci dit:
http://www.ros.co.nz/pdf/
est baucoup plus puissant et plus souple, mais il faut s'envoyer une doc en anglais, et j'ai eu qqs problèmes que je n'ai pas approfondis
avec le serveur sous Windows