[RESOLU] Php et pdf

Eléphant du PHP | 94 Messages

27 juin 2013, 19:12

Bonjour,

Je prépare pour ma compagnie de théâtre un petit logiciel pour faire des factures.

En php, je voudrais donc utiliser du pdf.

J'ai regardé fpdf qui correspond presque à ce que j'attends.

Le seul problème; c'est que je voudrais que les utilisateurs puissent créer leur fond de page, avec logo, données obligatoires, etc; le sauvegarder en pdf (par exemple avec libre office); puis, en php, pouvoir ouvrir ce fichier pdf et rajouter au dessus, à une place bien définie, le tableau qui correspond au montant de la facture.

Mais ça, je n'ai pas trouvé avec fpdf, comment ouvrir un fichier pdf pour ajouter des choses dessus. Est-ce seulement possible ?

Sinon, une solution à mon problème ? (ou une idée)

Merci d'avance.


Michel

Eléphant du PHP | 94 Messages

27 juin 2013, 19:56

Je crois avoir trouvé grâce à la FAQ : http://www.fpdf.org/fr/FAQ.php#q17 de fpdf : fpdi : http://www.setasign.de/products/pdf-php-solutions/fpdi/.

Certains on déjà utilisé ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

27 juin 2013, 20:40

salut,

je ne suis pas certain du résultat, perso je te conseillerais plutôt de préparer un template et un interface pour permettre le personnalisation du rendu (image de fond etc).

Je pense que c'est le plus simple.


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 94 Messages

27 juin 2013, 20:53

Euh oui, mais encore ?

Je vais quand même essayer vite fait pour voir si ça fonctionne.

Eléphant du PHP | 94 Messages

27 juin 2013, 21:35

Ça fonctionne... mais pas comme il faut.

C'est à dire :

Je crée mon fichier pdf avec libre office. Je le sauvegarde, ok.
Il contient une image de fond sur toute la page, plus un peu de texte.

Je fais un fichier php où j'utilise le fichier pdf précédent dans lequel je met la première ligne d'un tableau (c'est à dire une ligne avec les titres des colonnes).

J'affiche le tout... tout y est; sauf que :

Le fichier pdf créé par libre office est dans le coin supérieur gauche de la page en petit. (un peu comme un aperçu), et mon début de tableau créé par php est ok.

Code utilisé :

Code : Tout sélectionner

<?php require_once('fpdf.php'); require_once('fpdi.php'); $PDF = new FPDI(); $pagecount = $PDF->setSourceFile('doctest.pdf'); $tplidx = $PDF->importPage(1, '/MediaBox'); $PDF->addPage(); $PDF->useTemplate($tplidx, 10, 10, 90); $PDF->SetFont("Arial","BI",10); $PDF->SetXY(10,50); $PDF->Cell(60, 5, utf8_decode("Récapitulatif"), "LT", 0, "R", false); $PDF->Cell(30, 5, "", "T", 0, "C", false); $PDF->Cell(30, 5, "Cumul annuel", "T", 0, "R", false); $PDF->Cell(70, 5, "Cachet de l'association", "TR", 0, "R", false); $PDF->Output(); ?>
Il y a cette histoire de "/MediaBox" dans l'importpage que je ne comprends pas. J'ai cherché sur le site de fpdi, ils disent qu'il y a comme possibilité :
/MediaBox
/BleedBox
/TrimBox
/CropBox
/ArtBox
Je ne sais pas à quoi ça correspond, et il ne semble pas y avoir d'explication dans le manuel (mais je suis nul en anglais)

Eléphant du PHP | 94 Messages

27 juin 2013, 22:12

Je m'auto répond tout seul, c'est vachement plus pratique.
L'erreur venait de la ligne : useTemplate($tplidx, 10, 10, 90);
qui signifie (si j'ai bien compris) : utiliser le modèle (c'est à dire le fichier que l'on vient d'ouvrir), en le mettant au point de coordonnées 10 et 10, et d'une largeur de 90 mm.

J'ai donc modifié cette ligne en mettant les coordonnées 0,0 et d'une largeur de 210 mm, soit la largeur d'une page A4.

Et ça fonctionne très bien.

Donc, pour info, je récapitule :

Il faut récupérer fpdi ici : http://www.setasign.de/supra/kon2_dl/60 ... -1.4.4.zip.
Puis récupérer fpdf_tpl ici : http://www.setasign.de/supra/kon2_dl/63 ... -1.2.3.zip
Mettre au même endroit que fpdl (ou sinon changer l'adresse dans l'appel à la classe).

On crée notre fichier pdf avec libre office.
On le sauvegarde en le mettant dans le même répertoire que notre fichier php qui va l'utiliser (dans cet exemple).

Dans le fichier php :

On appelle fpdl :

Code : Tout sélectionner

require_once('fpdf.php');
On appelle fpdi :

Code : Tout sélectionner

require_once('fpdi.php');
ATTENTION : fpdl_tpl doit être dans le méme répertoire que fpdi, car il est appelé par celui-ci (ou sinon, changer son adresse dans fpdi.php)

On crée un objet fpdi :

Code : Tout sélectionner

$PDF = new FPDI();
(j'espère que la terminologie est bonne, parce que moi et l'objet...)

On ouvre notre fichier php fabriqué avec libreoffice :

Code : Tout sélectionner

$pagecount = $PDF->setSourceFile('doctest.pdf');
(notre fichier s'appelle ici doctest.pdf et se trouve dans le même répertoire).

On "importe" la page 1

Code : Tout sélectionner

$tplidx = $PDF->importPage(1, '/MediaBox');
Je ne sais pas ce que signifie '/MediaBox'. Dans d'autres exemple sur le site, il n'y a rien. Mais avec ça , je sais que ça marche...

On crée un nouveau document php :

Code : Tout sélectionner

$PDF->addPage();
On utilise la page 1 que l'on a importée avant :

Code : Tout sélectionner

$PDF->useTemplate($tplidx, 0, 0, 210);
Je rappelle donc qu'il s'agit ici de la mettre aux coordonnées 0,0 et qu'elle fait 210 mm de large.

On rajoute sur cette page, tout ce que l'on veut rajouter par des instructions fpdf.

On finit par :

Code : Tout sélectionner

$PDF->Output('newpdf.pdf', 'D');
pour le sauvegarder dans un fichier newpdf.pdf, ou si l'on veut directement l'imprimer, on utilisera simplement à la place :

Code : Tout sélectionner

$PDF->Output();
Pour l'option 'D', je ne sais plus ce que c'est; regardez le manuel (en français) de fpdf pour plus d'informations.

Je résume donc tout ça par

Code : Tout sélectionner

<?php require_once('fpdf.php'); require_once('fpdi.php'); $PDF = new FPDI(); $pagecount = $PDF->setSourceFile('doctest.pdf'); $tplidx = $PDF->importPage(1, '/MediaBox'); $PDF->addPage(); $PDF->useTemplate($tplidx, 0, 0, 210); /* code pour rajouter tout ce qu'on a à rajouter */ $PDF->Output(); ?>
En espérant avoir aidé des prochains intéressés.

Merci à Moogli pour son aide.



Michel