Line 1:
Line 1:
−
Ce document décrit comment créer son propre modele de generation de document PDF afin de personnaliser ces documents (propales, factures, etc...)
+
<!-- BEGIN interlang links -->
+
<!-- Do NOT edit this section
+
Links below are automatically managed by PolyglotBot
+
You can edit links on the English source page : Create_a_PDF_document_template -->
+
[[en:Create_a_PDF_document_template]]
+
[[es:Crear_un_modelo_de_documento_PDF]]
+
[[zh:创建PDF模板]]
+
<!-- END interlang links -->
+
+
{{TemplateDocDev}}
+
Ce document décrit comment créer son propre modèle de génération de document PDF afin de personnaliser ses documents (propales, factures, etc...)
Il se base sur les propositions commerciales comme exemple mais s'applique à tout type de document.
Il se base sur les propositions commerciales comme exemple mais s'applique à tout type de document.
+
Pour savoir comment générer un modèle de document ODT, voir la page [[Créer un modèle de document ODT]].
+
Créer un modèle PDF requiert des connaissances en programmation PHP mais pas la création de modèles ODT.
+
+
=Prérequis=
+
+
*Dolibarr: 3.0+
+
*Connaissance en PHP
+
+
=Trouver le modèle existant le plus proche=
+
Dans Dolibarr, tester les modèles existants en allant dans la configuration du module puis en consultant l'aperçu en cliquant le picto "Aperçu" en fin de ligne du modèle. Consulter chacun des modèles disponibles.
+
+
Parmi ceux existant, noter le modèle le plus proche de vos besoins. Dans cet exemple, c'est le modèle azur (correspondant au fichier pdf_propale_azur.modules.php).
+
+
Pour info, tous les modèles sont dans '''htdocs/core/modules''' puis le sous-répertoire propale pour les propositions commerciales, facture pour les factures, commandes pour les commandes, etc... et enfin '''doc'''.
+
Par exemple, un modèle personnalisé de proposition sera dans '''...core/modules/propale/doc/''' pour un modèle personnalisé de facture ce sera dans '''...core/modules/facture/doc/''' ,etc ...
+
=Créer le nouveau modèle=
+
Par sécurité, on conservera les modèles d'origine. Pour l'exemple, on part du principe qu'on crée un nouveau module de proposition commerciale qu'on nommera 'masocietebleu' et qui s'inspire du module 'azur':
−
= Trouver le modèle existant le plus proche =
+
*Copier le fichier pdf_propale_azur.modules.php
−
Dans Dolibarr tester les modèles existants en activant tous les modèles existants dans la configuration du module puis en générant et visualisant un document brouillon pour chacun d'entre eux.
+
*Renommer la copie en pdf_propale_masocietebleu.modules.php
+
*L'éditer et faire les modifs suivantes dans le code:
−
Parmi ceux existant, noter le modèle le mieux adapté aux besoins. Dans cet exemple, c'est le modèle bleu (correspondant au fichier pdf_propale_bleu.modules.php).
+
#Renommer “''Class pdf_propale_azur {''” en “''Class pdf_propale_masocietebleu {''” (important : le nom de la classe et celui du fichier doivent correspondre)
−
Rem: Pour info, tous les modèles de propales sont dans \includes\modules\propale si vous etes sous Windows et /includes/modules/propale si vous etes sous Unix.
+
#Renommer la variable $this->name pour refléter le nouveau nom. Par exemple pour le modèle 'azur', changer la ligne '$this->name = "azur";' en '$this->name = "masocietebleu";'.
+
#Sauvegarder : le modèle 'masocietebleu' est disponible dans la liste des modèles de propales de Dolibarr
−
= Créer le nouveau modèle =
+
*Tester ce modèle en l'activant dans la page de configuration du module en rapport avec le modèle (donc la page de configuration du module des Propositions commerciales dans notre exemple) et en affichant l'aperçu...
−
Par sécurité, on conservera les modèles d'origine. Pour l'exemple, on part du principe qu'on crée un nouveau module de proposition commercial qu'on nommera 'masocietebleu' et qui s'insprire du module 'bleu':
−
# copier-coller pdf_propale_bleu.modules.php
−
# renommer la copie en pdf_propale_masocietebleu.modules.php
−
# l'éditer et faire les modifs suivantes dans le code:
−
## Renommer 'Class pdf_propale_bleu { ' en 'Class pdf_propale_masocietebleu { ' (ligne 24)
−
## Renommer 'Function pdf_bleu($db=0)' en 'Function pdf_propale_masocietebleu($db=0)' (ligne 26)
−
## Sauvegarder : le modèle 'masocietebleu' est disponible dans la liste des modèles de propales de Dolibarr
−
## Tester ce modèle (Voir A)) avant d'aller plus loin...
−
= Personnaliser =
+
=Personnaliser votre nouveau modèle=
−
Personnaliser le modèle créé.
+
Personnaliser le modèle créé en modifiant le code:
−
Toujours dans pdf_propale_masocietebleu.modules.php, chercher la fonction 'Function _pagehead(&$pdf, $fac)' (vers la ligne 306). C'est elle qui gère l'affichage de l'entête.
+
Toujours dans pdf_propale_masocietebleu.modules.php, chercher la fonction '_pagehead()'. C'est elle qui gère l'affichage de l'entête.
−
== Librairie de création ==
+
Chercher la fonction '_pagefooter()'. C'est elle qui gère l'affichage du pied de page.
−
La librairie utilisée pour la création de documents en PDF se nomme FPDF et peut être trouvée dans htdocs/includes/fpdf/fpdf/fpdf.class.php. C'est également dans cette classe que l'on trouve les nombreuses méthodes utilisées pour générer les différents éléments des documents.
+
Chercher la fonction 'write_file()'. C'est elle qui affiche le corps du PDF.
−
Les modèles eux-même instancient la classe FPDF et utilisent ensuite ses méthodes, combinées avec les données d'une facture, d'une commande ou d'autres types de données.
+
==Librairie de manipulation de PDF==
+
La librairie utilisée pour la création de documents en PDF se nomme TCPDF et peut être trouvée dans htdocs/includes/tcpdf/tcpdf.class.php. C'est également dans cette classe que l'on trouve les nombreuses méthodes utilisées pour générer les différents éléments des documents.
+
+
Les modèles de génération de pdf instancient un objet pdf par appel de pdf_getInstance() et utilisent ensuite ses méthodes, combinées avec les données d'une facture, d'une commande ou d'autres objets.
On retrouve généralement les appels suivants dans les scripts de création de documents:
On retrouve généralement les appels suivants dans les scripts de création de documents:
−
* $pdf->SetFont() - ''Désigne la fonte à utiliser pour le texte qui suivra''
−
* $pdf->SetXY() - ''Désigne le point de départ pour dessiner le prochain texte en coordonnées X,Y qui sont exprimées en millimètres de la page''
−
* $pdf->MultiCell() - ''Dessine une boîte pouvant contenir du texte, et dont on doit d'abord donner la largeur et la hauteur - très utilisée''
−
* $pdf->GetY() - ''Renvoie la position courante en Y''
−
* $pdf->SetDrawColor() - ''Désigne la couleur à utiliser pour le prochain texte à écrire - généralement noir (0,0,0) ou blanc (255,255,255)''
−
* $pdf->Rect() - ''Dessine un rectangle dont le coin supérieur gauche est au point indiqué par les deux premiers paramètres et le coin inférieur droit utilise les deux derniers paramètres en mode relatif aux deux premiers''
+
*$pdf->SetFont() - ''Désigne la fonte à utiliser pour le texte qui suivra''
+
*$pdf->SetXY() - ''Désigne le point de départ pour dessiner le prochain texte en coordonnées X,Y qui sont exprimées en millimètres de la page''
+
*$pdf->MultiCell() - ''Dessine une boîte pouvant contenir du texte, et dont on doit d'abord donner la largeur et la hauteur - très utilisée''
+
*$pdf->GetY() - ''Renvoie la position courante en Y''
+
*$pdf->SetDrawColor() - ''Désigne la couleur à utiliser pour le prochain texte à écrire - généralement noir (0,0,0) ou blanc (255,255,255)''
+
*$pdf->Rect() - ''Dessine un rectangle dont le coin supérieur gauche est au point indiqué par les deux premiers paramètres et le coin inférieur droit utilise les deux derniers paramètres en mode relatif aux deux premiers''
+
+
==Structure des scripts==
+
Les scripts de génération des documents PDF, disposent des méthodes suivantes (prenant pour exemple le modèle "crabe") au sein de la classe du modèle:
+
+
*__construct() - ''Constructeur de l'objet PDF''
+
*write_pdf_file() - ''Méthode générale pour la génération du fichier. Cette méthode appelle toute les suivantes après avoir initialisé quelques variables''
+
*_pagehead() - ''Méthode de dessin de l'en-tête du document, incluant généralement le logo, le titre du document (et la date) ainsi que les cadres de l'émetteur et du destinataire du document''
+
*_tableau() - ''Méthode de dessin du tableau de détails (produits, services, etc)''
+
*_tableau_info() - ''Méthode de dessin du tableau reprenant une liste d'informations sur la facture''
+
*_tableau_tot() - ''Méthode de dessin du tableau des totaux''
+
*_tableau_versement() - ''Méthode de dessin du tableau des règles de versement''
+
*_pagefoot() - ''Méthode de dessin du pied de page''
+
+
==Example de personnalisation==
+
===Insertion d'un logo===
+
+
*Ajouter l'instruction :
−
== Structure des scripts ==
+
<syntaxhighlight lang="php">
+
$pdf->Image(DOL_DOCUMENT_ROOT.'\societe\logo.jpg', 10, 5, 60.00);
+
</syntaxhighlight>
+
Avec dans l'exemple : 10=abscisse, 5=ordonnée, 60=largeur logo
−
Les scripts de génération des documents PDF, au moment du développement de la version 2.2, disposent des méthodes suivantes (prenant pour exemple le modèle "crabe") au sein de la classe du nom du modèle:
+
*Si le logo se trouve par dessous ou dessus du texte existant, supprimer le texte existant en commentant le code qui affiche l'information ou en modifiant sa position.
−
* pdf_crabe() - ''Constructeur de l'objet pdf''
−
* write_pdf_file() - ''Méthode générale pour la génération du fichier. Cette méthode appelle toute les suivantes après avoir initialisé quelques variables''
−
* _pagehead() - ''Méthode de dessin de l'en-tête du document, incluant généralement le logo, le titre du document (et la date) ainsi que les cadres de l'émetteur et du destinataire du document''
−
* _tableau() - ''Méthode de dessin du tableau de détails (produits, services, etc)''
−
* _tableau_info() - ''Méthode de dessin du tableau reprenant une liste d'informations sur la facture''
−
* _tableau_tot() - ''Méthode de dessin du tableau des totaux''
−
* _tableau_versement() - ''Méthode de dessin du tableau des règles de versement''
−
* _pagefoot() - ''Méthode de dessin du pied de page''
−
+
===Insertion d'une signature ou autre en bas de page facture===
−
== Insertion d'un logo ==
−
* Chercher la séquence suivante:
−
$pdf->SetXY(10,5);
−
if (defined("FAC_PDF_INTITULE"))
−
{
−
$pdf->SetTextColor(0,0,200);
−
$pdf->SetFont('Arial','B',14);
−
$pdf->MultiCell(60, 8, FAC_PDF_INTITULE, 0, 'L');
−
* Ajouter l'instruction:
−
$pdf->Image('\www\htdocs\dolibarr\document\societe\logo.jpg', 10, 5,60.00);
−
* Mettre en commentaire l'instruction d'affichage de la variable FAC_PDF_INTITULE
−
== Modification des constantes affichées ==
+
*ouvrir le fichier .php à modifier et insérer
+
+
<syntaxhighlight lang="php">
+
$pdf->Image(DOL_DOCUMENT_ROOT.'/mydir/signature.jpg',120,250,74);
+
</syntaxhighlight>
+
l'image (largeur 74mm) est affichée colonne de droite juste avant le pied de page.
+
+
*copier l'image dans le répertoire. il semble qu'une image png avec transparence pose problème.
+
*générer le PDF, la signature apparaît.
+
+
===Insertion de texte===
Principales fonctions utilisées
Principales fonctions utilisées
−
$pdf->setX(float a); fixe la position x courante
+
<syntaxhighlight lang="php">
−
$pdf->setY(float b); fixe la position y courante
+
$pdf->setX(float a); // fixe la position x courante
−
$pdf->setXY(float a,float b); fixe les positions x et y courantes
+
$pdf->setY(float b); // fixe la position y courante
−
(rappel: l'origine est le coin supérieur gauche)
+
$pdf->setXY(float a,float b); // fixe les positions x et y courantes
−
$pdf->SetTextColor(0,0,200); fixe la couleur du texte
+
$pdf->SetTextColor(0,0,200); // fixe la couleur du texte
−
$pdf->SetFont('Arial','B',14); fixe la police, le type ( 'B' pour gras, 'I' pour italique, '' pour normal,...)
+
$pdf->SetFont('Arial','B',14); // fixe la police, le type ( 'B' pour gras, 'I' pour italique, '' pour normal,...)
−
$pdf->MultiCell(60, 8, FAC_PDF_INTITULE, 0, 'L'); imprime la variable FAC_PDF_INTITULE avec saut de ligne
+
$pdf->MultiCell(60, 8, 'Mon texte", 0, 'L'); // imprime 'Mon texte' avec saut de ligne
−
(info: Il semble que Dolibarr gère un certain nombre de constantes dans Accueil => Configuration => System => Constantes. Mais ça ne fonctionne pas sur ma config ...).
+
</syntaxhighlight>
+
Rappel : l'origine des fonctions setXY est le coin supérieur gauche de la page
+
+
==Pour plus d'infos==
+
+
*Liste des méthodes TCPDF: https://tcpdf.org/docs/srcdoc/
+
+
=Proposer son modèle via un module=
+
Si le modèle fabriqué est destiné à être livré via un module extension de Dolibarr (voir la doc pour faire un module Dolibarr), le fichier modèle ne sera pas dans le même répertoire que les autres, et ne sera donc pas détecté automatiquement. Pour le rendre détectable vous devrez ajouter cette ligne dans la fonction d'initialisation de votre module externe :
+
+
<syntaxhighlight lang="php">
+
sql=array("INSERT INTO ".MAIN_DB_PREFIX."document_model (nom, type, entity) VALUES('".$MODELNAME."','".$MODEL_TARGET_MODULE."',".$conf->entity." )");
+
</syntaxhighlight>
+
+
avant
+
+
<syntaxhighlight lang="php"> return $this->_init($sql,$option);</syntaxhighlight>
−
== Pour plus d'infos ==
+
Puis
−
http://www.fpdf.org/?go=script&id=2 et aller sur 'accueil'
−
== Le résultat ==
+
Dans Accueil => Configuration => Modules => Module sur lequel porte le modèle => Configurer
−
Réalisation ozit: http://www.adytek.com/PR040123.pdf
−
= Choisir un modèle par défaut dans Dolibarr =
+
*activer votre module qui doit apparaître parmi ceux disponible
−
Dans Accueil => Configuration => proposition commerciale:
+
*éventuellement le mettre en modèle proposé par défaut.
−
* on affiche les modèles,
−
* on indique ceux qui doivent etre actifs,
−
* on précise le modèle proposé par défaut.
−
= Merci =
+
=Vidéos sur le sujet=
−
Merci à David, Florent et surtout ozit pour leur aide.
+
<youtube width="200" height="120">dEC8hFcT71U</youtube>
+
<youtube width="200" height="120">LtXPBz9fWQE</youtube>