php et pdf

4

Click here to load reader

Upload: dvdstory

Post on 07-Jun-2015

492 views

Category:

Documents


4 download

DESCRIPTION

PHP SOLUTIONS

TRANSCRIPT

Page 1: php et pdf

o PHP et PDF,toufours plus intimes.Première partie r FPDF.

La société de l'information était sensée nous libérerdu règne du papier. A l 'usage, ofl constate qu'i l n'enest rien. Nous allons décortiquer le mariage réussitentre le format PDF et PHP.

Le marché de I ' impress ion seporte toujours très bien. Internetest en partie responsable de cela,tant la masse d' informations dis-

ponib le inc i te les v is i teurs à impr imertou jours p lus de contenus. Et le com-merce en l igne n'est pas en reste, carchaque commande, chaque factureappelle à des impressions mult iples : le

bon de commande du c l ient . lebon de commande à l 'a t ten-

tion du fournisseur. les fac-tures correspondantes,etc. La problématiquen 'est donc p lus de sedemander comment évi-

ter d ' impr imer ces docu-ments, mais comment les

impr imer au mieux. Une fo isencore, PHP propose des so lu-

t ions eff icaces, rapides et peu oné-reuses. Nous al lons en voir deux dans ledétai l dans une série de deux art icles.

Un peu d'histoireLe mar iage de PHP et PDF n 'est pasrécent . l l s 'ag i t même d 'un couple dé jàrodé depuis pas mal de temps. Le pro-blème étant qu'au début de cette union,les outils à mettre en oeuvre se présen-taient sous forme de modules de l'inter-préteur, fast idieux à instal ler, surtoutlorsque l 'on est pas admin is t ra teur duserveur . Qui p lus est , la seu le l ib ra i r iepleinement exploitable était la l ibpdf deThomas Merz, dont le coût de l icencepouvait décourager définit ivement les

Par Gauthier Delamarre

uti l isateurs potentiels, si courageuxsoient-ils face aux problèmes posés parI ' instal lat ion.S i à cet te époque I 'emplo i de modulesexternes, écri ts en C, donc compilés etperformants, s'avérait quasi indispen-sable, la puissance des machinesaujourd 'hu i d isponib les permet derecourir sans danger à des classesécrites directement en PHP. Cela offredeux avantages majeurs : d'une part,I instal lat ion en est inf iniment simpli f iée,d 'aut re par t , les modi f icat ions que l 'onpeut faire sur ces l ibrair ies sont prisesen compte instantanément, sansrecompi la t ion e t ré insta l la t ion dudi tmodule.Voi là pourquoi nous avons chois i devous présenter FPDF (dans le présentart icle) et EzPDF (dans le numéro pro-chain), qui sont toutes deux de simplesclasses PHB distr ibuées l ibrement. Celaautorise à penser que I ' immense majori-té des développeurs aura le loisir depouvoir ut i l iser ces produits, quel le quesoit leur plate-forme de développement.

PrésentationLes deux solut ions que nous al lons voirne sont pas identiques. Les différencesne sont pas tel lement techniques, carles résultats sont similaires en terme depoids de documents comme de quali té,car le format PDF est parmi les plusstandardisés qui soient, grâce en soitrendue à Adobe, son créateur !C'est donc dans la phi losophie d'ut i l isa-

le lecteur PDF le plusrapide sous GNU/Linux

Linux Loader N'20

Page 2: php et pdf

â*stt Qu'esl-c. qqo FPDF ?

l a t f r h f f i l I r { r l r i l r l . . q i l t i i { J i l r æ ' i d r e 9 è n c r e . d F l É h e * { . t ë i r À r r r i + ' l c l t t d r c 5 a n - , r û r ' , 3 ' i ô l î ' à J r , : l X . È l r r e a r r a r q , Æ l ) ( ) ' t ô c a F . r v , f 6 1 r ( d t- d L r ' , , { Ë 1 3 : 5 1 c ' c d c : É a F ' t r € i f c t , c c v . r , e r \ t è l j : r r , r , ( € , y & i ( , o d d . ' c o , F ' : r } - . r b € - ! s . _ .

fu'adÈl! f PDF a d.Lte< ulatte-. ic: brcbt- ôc phrr n.rl Nr.ù- I R-- Fe 1ïe ce çe< pntrrpac< tf,r-on-;&tr

Mwtl . afd, a€5 Jifi: :- s,il o.s F4es s oes ma.æi. .r: ,: tr dp\ el rse- i j ?Ci + .,qe. . ;u le rdg€ F js J , j4

sdB . làr lr ;a è'(- ùti ?t rr'' fréuo,

- i4a . 2 ' . i f 2 , ( , ,

Fff i : i ,s : ' ' 'l b ,

. i . , i . r t { o ? } f , r : E _

e - , F q r p c r

. c 4 ' . ) t : ! c r ' . f : * f e :

É P f t Ê 1 r l e . p j . e é r : . i k r - s i I i : ! i l r 7 t l t p ( r q f i { . 1 f l à J c i r j e ! : f _ r i g r r c n i n i l o d ! È : æ f € r . . Ê r : , f , , i r _ . è , f h t 4 5 o n r ê g À t ? , : É r r c t r g s o i c < r l a i æ 3 1

t e 5 ' . / . , r t _ r : . \ e s r r ' h i , r ' & , r e r l t n { ) È , ç r g c 1 e - d 2 û . a \ , s l 6 . r 4 i J r r r À r r o , , e n l g r r â : o , . F ç r € È \ r . : e ê c r æ & , ! Ë c h â , g c , , É i l r J L â n É r r t u r Ë +

c o n s e i { ? J s ( e l a t , ) h i : c c È r ) : r : c u c 5 û o n : e t u d P r ? ' € : i i { : c g L r y r : r ? . o u l c l n r r a i R l e r F â r É s , ? - ' ! '

Et les perfomaocos ?

l l a ù ' . l e r 4 a ' c : : - . è ; ' r o s , c r . L d o c u r E n E : ! { 1 F , R e c ! È , e . F I F i l , : s p e r d u r L l ? : à ^ L r 3 e b i l r s s e i Ë e ! ù ! r d : m o r b t e d c 6 d ? i l 6 3 h p t s d d c iaôi  -.çral

1r4 icr (a:i:Cclrr rè i0 €d pôfiCuibt!â-d af, -{ra1Ê i ô I C!.oa

L€e ivolutlons

le site officielde FPDF

t ion que nous t rouverons des d i f fé-rences notab les. En substance, nouspouvons d i re que FPDF est p lus l imi téedans le nombre de fonct ions commedans le nombre de fonct ionnal i tés , cequi la rend p lus s imple à appréhender e tplus rapide à maîtr iser qu EzPDF. Cettedern ière, en revanche, o f f re p lus defonct ions de " haut -n iveau " , e t permetde réa l iser p lus a isément des docu-ments p lus complexes, mais après untemps d 'apprent issage un peu p lusrong.

FPDF - Premier contactAvant de passer aux exercices pra-t iques, fa isons p lus ample connaissan-ce avec FPDF. Nous devons cette clas-se à Ol iv ier P la they, qu i en a l iv ré lapremière vers ion i l y a un peu p lus dedeux ans. Vous pourrez t rouver la der-n ière vers ion sur le s i te o f f ic ie l :www fpdf .org ( la vers ion présentéedans cet ar t ic le est la 1 .51) . Un mot ausujet de la l icence de FPDF : bien que lal icence mentionnée dans le f ichier sour-ce so i t " f reeware " , l 'auteur oréc isequ ' i l es t poss ib l e d ' u t i l i se r e t de mod i -f ie r à lo is i r sa c lasse, sans l imi ta t ionquelconque. Cela ressemble donc p lusà du domaine publ ic qu 'à du f reeware. l les t donc poss ib le d employer FPDFdans un pro je t commerc ia l de manièreparfaitement légale.L ins ta l la t ion est s impl iss ime : décom-pressez I archive n' impode ou sur votred isque dur , ce la n 'a pas d impor tance.Vous n 'aurez qu une déc larat ion deconstante à faire dans vos scripts pourspéc i f ie r I 'emplacement des po l ices de

caractères :define(tFPDF FOI{TPATH','/opUfpdf/font,);

l l su f f i ra ensui te d inc lure le f ich ierfpdf .php pour charger la l ib ra i r ie com-plète :require'/opUf pdflfpdf.php' ;

Vous êtes prêts maintenant à t rava i l le rsur votre premier document PDF ! Pourcommencer, nous al lons nous baser sur

le premier des sept tu tor ie ls présentssur le s i te (a ins i que dans l 'a rch ive) .Celui-ci montre un exemole minimalistede créat ion de document , agrémenterdu fameux " Hello World ! " :

<?phpdefi ne('FPDF FONTPATH','fonU');require('tpdf.php');

Spdf=new FPDF$;Spdt->0pen0;$pdf->AddPage0;$pdf-> SetFont(tArial',' B', 1 6)1Spdf->Cell(40,1 0,'Helfo World !');Spdf->Output$;?>Vous n 'avez p lus qu 'a po in ter vot renav igateur sur ce scr ip t ( "tutoriel/ tuto'1.php ") pour voir apparaîtreun document pris en charge par votrelecteur PDF habi tue l , e t arborant unmagni f ique " Hel lo Wor ld "dans le co insupérieur gauche.Les instructions employées ici sont rela-t ivement s imples, mais nous a l lonscependant les détai l ler car el les présen-tent à e l les seu les la ouas i to ta l i té du

créateur duformat PDF,Adobe n'apas fini del 'exploiter !

r . ' - i ) . i q .s - , i r . , : r l , ré_! l_ , ; , : r , - i l '___. ._ .I g) UBL /rlnnp/,rmvrvaderber,dproducts/acrobæ/acro-adhml ; fi

- E i t

l.cu_11T_if-T_1ryi9,"_$l.lge_,:_9_t11q_o't''e,,*o"-l-llc'rnûder . ' - i ) . i q .s - , i r . , : r j , ré_! l_ , ; , : r , ! l '___. ._

; f il Y8_' i:!yly:::t::3lt:_'_11'j::gta_y_ _--__-__=| | Frdæe -{ \doÛt ?!o.j!il', \LlrJhir)t slpp,rt Adr{,!.n Àdl}ôc1Fltw

n-r-lIII|IlllII

t I Frdæe -f a \

Llobt ?!o.j!il', \LlrJhir)t slpp,rt A1Iqs.1 Àd1)ôc1F!twn-r-lIII|IlllII

Linux Loader N"20

Page 3: php et pdf

notre exempleen action

ment. l l ne faut en revanche qu'uneseule fois, avant tout appel deAddPage$. Cette dernière ajoute effec-t ivement une nouvelle page. Un argu-ment optionnel permet de forcer I'orien-tation de la page, avec par exempleAddPage(" L ") pour insérer une pageen paysage.La méthode AddPageQ est très impor-tante, car son appel est obligatoire pourgénèrer un document val ide etdéclenche l 'exécution de deux autresméthodes : FooterQ et HeaderQ. La pre-mière n'est appelée qu'à part ir de ladeuxième instruct ion AddPagefl . Pourbien ut i l iser ces méthodes appeléesautomatiquement, qui correspondentrespectivement au pied-de-page et àI'en-tête, il est préférable de dérivé laclasse FPDF plutot que de la modif ierdirectement:<?c-lass PDF exhnds FPDF I

luncûon Header() [

l

funcûon FooterQ t

ll$pdf = new PDF;?>

Pour un exemple montrant commentuti l iser ces méthodes de numérotat iondes pages, consultez le f ichier " tuto-

vacancedsicount.com utilise FPDF pourla création des bons de commande et

autres documents à télécharger

riel/tuto2.php ".

Note : Si vous souhaitez revenir enarrière dans votre document, vous lepouvez en modifiant la propriété$this->page de votre objet. Parcontre, il faut penser à bien enregis-trer la page courante pour pouvoir s'yreplacer après. Cela est très utilepour écrire un sommaire parexemple.<?$pagecounnte = $pdf ->page;

$pdf->page = t;$pûf->Gell(2s,1 0,"lulodiflcation d'une pageanÉrieurc")1$pdf->page = $pageGourante; // pourcuitede la consùuclion du document.?>$pdf->SetFont('Arial',' B', 1 6);

La gestion des policesNous voici arrivés à un autre point trèsimportant : la gestion des polices. Lafonction SetFont$ est assez simpled'emploi. l l suff i t de lui indiquer le nomde la pol ice à ut i l iset la variante (gras,i tal ique, soul igné) et la tai l le. Un appelau moins de cette fonction est obl iga-toire avant de pouvoir imprimer du textedans le document.Les pol ices fournies avec l 'archive deFPDF sont peu nombreuses, mais suffi-sent dans la plupart des cas. De plus, ilest possible d'embarquer des fontesTrueType (Windows) ou Typel (Unix).Voici les fontes fournies : Courier. Arial

t Sq Ælch{. ,{.r ScÉr Ouir F.oat &.I s /e ô -e rL t ' : f rù a , . i l l r l r Ë I rE{n 4 : : T

D (8L|j ahFJtt nvæGld(on.m/ E

YèCèN

I

I

I

I

I

d-.r

*t(lt;.Gtla.

ÊtÇq.

5rq.

trillËI-rË

T( GIT€

frùff imaÉ!Ên.€F.rryts t ù F F € a q G a D | t q f i td-rffiJffirffirFtq

|Fo f f i - r l f r t ;

t PsrçP ffi

f r6Frc

i{.';iil;;;ff;mi--trF: I ffi-**ù in , * rmû; - - - 't t- f f iM&)

. t - û t lO y t r y-Errr0@

t l ù@Eæùæ'

El i Hffi,:Ef&f f i -æâbô

raË;-.;ié;i,,nriÈJ : #''-'*-'I - ^ E 4 & ù t u Ê d

rI-k l !

ErE hFery att lF lwran (l|ÊÉrÉI@ Fahts

1â { ,i (f .91i,} r't ,i '"h mrri.#!9+ t + , I , Iâ { : l : l - 1!i LQt:; ah+rÉffirrDtl5t/trddluolrb t E

l{doWqlrl I

procédé de création de documents PDF !$pdf=new FPDFQ;

Pas de mystère autour de cette instruc-t ion, i l s 'agit simplement d' ini t ial iser unobjet FPDF, en conservant les valeurspar défaut des arguments attendus parle constructeur. Vous pouvez enrevanche avoir besoin de spécifier desoptions particulières pour un document.Les paramètres possibles sont :

FPDF([str ing orientat ion [, str ing unit [ ,mixed formatlll);

L'orientation peut prendre deux valeurs: " P " pour poftrait ou " L " pour paysa-ge. La valeur par défaut est " P ". Notezqu' i l est possible de redéfinir l 'or ienta-t ion de chaque page du document. Lavaleur passée au constructeur servirade valeur par défaut à la méthodeAddPage$, que nous verrons ultérieure-ment.L'unité (unit) qu' i l est possible de f ixerici concernera toutes les fonctions pourlesquelles une distance est attendue enparamètre. Les valeurs possibles sont :" m " pour millimètre, " cm " pour centi-mètre, " pt " pour point, et " in " pourpouce. La valeur par défaut est " mm ".Enfin, le format de la page peut êtreprécisé. Vous pouvez ici soit utiliser unechaîne de caractère pour désigné unformat reconnu par FPDF (parmi ( A3 "D44 ": 'A5 "," Lgttgr " ou " Legal "), soitpasser un tableau de deux valeurs(exprimées dans I 'unité précisée auparamètre précédent), pour définir unformat personnalisé.

E x e m p l e : $ p d f = n e wFPDF(' P',' in',array(10,20));Cette instruction créera un documentorienté en portrait, avec le pouce pourunité, et un format de 10 pouces de lar-geur pour 20 de hauteur.

$pdf->Open0;$pdf->AddPage0;Ces deux instructions permettent decommencer à travailler réellement ledocument. Open$ n'attend aucun para-mètre. Son appel est obligatoire pourpouvoir ajouter des pages au docu-

Page 4: php et pdf

(ou Helvetica, el les sont identiques),Times, Symbol, ZapfDingBats. Cesdeux dernières sont des pol ices desymboles un iquement . Seules lesfontes textuel les ( les trois premièresdonc) peuvent être mises en gras, i ta-l ique, et/ou soul igné. pour ce faire, i lfaut simplement fournir en second para-mètre une chaîne de caractères combi-nant les lettres suivantes ( l 'ordre n, im-porte pas) : " B " pour gras, ,, | ,, pourital ique et " U " poursoul igné.Exemple : " Bl " pour gras et souligné, ,,Ul " pour i tal ique et soul igné, , , U ,, poursoul igné, etc.Enfin, il est possible de spécifier la taillede la fonte avec le troisième paramètre,Celle-ci est toujours exprimée enpoin ts , que l le que so i t I 'un i té cho is iepour le document avec le constructeur.l l est également possible de recourir àSetFontSizeQ pour ne modif ier que lataille de la police courante, sans répéterles deux premiers paramètres. La taillede police ne doit pas forcément être unentier : la valeur 8.5 est parfaitementval ide.

Note : le nom de la police ainsi que tatai l le prennent par défaut la valeurcourante. Un appel à SetFont(FALSE); revient donc à supprimer lesvariantes (gras, i tal ique ou soul igné)de la pol ice courante. Si la tai l le n'ajamais été réglée, la valeur par défautest de 12 points.

Pour intégrer des pol ices personnali-sées, i l faut employer le script , , make-font.php ", du sous-répertoire , .font/makefont ". Le tutoriel ' .tutoriel/ tutoT.htm " vous donne lamarche à suivre pour convert ir vospolices dans un format exploitable parla l ibrair ie, et la page de manuel sur

AddFontQ détaille la façon de tes utiliserdans vos scripts.$pdf->Cell(40,1O," Hello World ! ,,);

La méthode cettl lLa méthode Cell0 est l 'une des dif fé-rentes fonctions permettant d' imprimerdu texte dans le document. Avec CellQ,le texte est placé dans une cel lule,comme son nom le laisse suggérer,Cela permet un posit ionnement plusprécis du texte qu'avec la fonctionWriteQ (que vous pourrez découvrirdans le manuel ) . Mais avant d ,endétai l ler les arguments, i l est importantde considérer la manière dont sontpositionnés les éléments dans un docu-ment PDF.Dans la plupart des cas, les élémentsdoivent être placés selon des coordo-nées précises, ayant pour origine leco in supér ieur gauche du document .Les ordonées croissantes vont vers lebas, les abscisses vers la droite. Unappel à Cell f l placera la cel lule de tei lefaçon que son coin supérieur gauche se

Une des ressources de lasection scripts de fpdf.org(Cell étendue)

trouvera à la posit ion courante du ,,pointeur ". Après un appel à Addpagefl,le pointeur est posit ionné dans le coinsupérieur gauche, en tenant comptedes marges (qui peuvent être spécifiéesà l 'aide de SetMarginQ).Pour spécif ier un emplacement précis,vous pouvez ut i l iser les méthodesSetXYQ, SetXfl ou SetYfl. La premièreattend deux arguments, chacune dessuivantes un seul : d'abord I 'abscissepuis I 'ordonnée dans les deux cas. Lesvaleurs sont exprimées dans l ,unité pardéfaut du document. Ainsi SetXy(2O,50)dans un document ayant le mi l l imèt repour unité placera le pointeur à 2 centi-mètres du bord gauche, et trois du bordsupérieur. Si une valeur négative estpassée, le poiteur sera posit ionné parrapport au bord opposé.

Voyons maintenant les arguments de laméthode CellQ :

Cell(float w [, float h [, string txt [, mixedborder [ , int In [ , str ing al ign [, int f i l l [ ,mixed tint<llllll l)

Pour concture cettepremière partieEn jouant avec ces valeurs, vous trou-verez rapidement comment effectuerles mises en pages qui vous convien-nent . Mais n 'oub l iez pas de su ivre letutoriel fournit avec la classe, qui estassez coud mais très bien fait, ainsi quele manuel, qui vous sera indispensablepour découvrir les autres fonctionsmises à votre disposition par FpDF.

w : largeur de la cellule. Elle influe à la fois sur l'alignement du texte et sur la position cgurante du pointeur aprèsimpression du texte. Elle est exprimée dans I'unité par défaut.h : hauteur de la cellule. lmplications identiques à w, hormis ce qui concerne I'alignement du texte.brt : la chaîne à imprimer.Attention, elle ne peut pas contenir de retour à la ligne (ils sont ignorés), pour placer du textesur plusieurs tignes, il faut utiliser Multi0ellfl (voir manuel).boder : détermine le cadre à dessiner autour de la cellule. Si border = TRUE, les quatres cotés seront dessinés. Sinon, il estpossible de passer une chaîne composée d'une combinaison des lettres " B ,, pour bas, ,,T,, pour haut, ,, 1,, pourgauche et " R " pour droite. Par exemple, " LTR " dessinera un cadre partout sauf au-dessous de la cellule. La valeurpar défaut est FALSE (pas de bodure). L'épaisseur du trait doit être spécifiée par ta métnoOâSettineWiOtnç.In: posit ion du pointeuraprès l ' impression de la cel lule.0 pour" à droit , , ,1 p0ur,,à la l igne,,ou 2 pour,,en-dessous

", La valeur par défaut est 0,al ign: Al ignementdutexte dans lacel lule. " L" poural ignerà gauche, " R " poural igneràdrgite,, ,C,,pourcentrer. Lavaleur par défaut est ,, L ,,.

fill : remplissage de la cellule. TRUE = remplissage,_FAlSE = pâs de remplissage. FALSE est la valeur par défaut. La cou_leur de remplissage est déterminée par SetFillColorQ.link : identifiant de lien créer par Addlinkfl. Cela permet de définir la cible d'un lien interne au document (voir le manuel),

Linux Loader N'20