This commit is contained in:
2026-05-27 11:44:10 -04:00
commit 414f85ad05
31452 changed files with 3580409 additions and 0 deletions

10
fpdf/tutorial/20k_c1.txt Normal file
View File

@ -0,0 +1,10 @@
L'ann<6E>e 1866 fut marqu<71>e par un <20>v<EFBFBD>nement bizarre, un ph<70>nom<6F>ne inexpliqu<71> et inexplicable que personne n'a sans doute oubli<6C>. Sans parler des rumeurs qui agitaient les populations des ports et surexcitaient l'esprit public <20> l'int<6E>rieur des continents les gens de mer furent particuli<6C>rement <20>mus. Les n<>gociants, armateurs, capitaines de navires, skippers et masters de l'Europe et de l'Am<41>rique, officiers des marines militaires de tous pays, et, apr<70>s eux, les gouvernements des divers <20>tats des deux continents, se pr<70>occup<75>rent de ce fait au plus haut point.
En effet, depuis quelque temps, plusieurs navires s'<27>taient rencontr<74>s sur mer avec "une chose <20>norme" un objet long, fusiforme, parfois phosphorescent, infiniment plus vaste et plus rapide qu'une baleine.
Les faits relatifs <20> cette apparition, consign<67>s aux divers livres de bord, s'accordaient assez exactement sur la structure de l'objet ou de l'<27>tre en question, la vitesse inou<6F>e de ses mouvements, la puissance surprenante de sa locomotion, la vie particuli<6C>re dont il semblait dou<6F>. Si c'<27>tait un c<>tac<61>, il surpassait en volume tous ceux que la science avait class<73>s jusqu'alors. Ni Cuvier, ni Lac<61>p<EFBFBD>de, ni M. Dumeril, ni M. de Quatrefages n'eussent admis l'existence d'un tel monstre - <20> moins de l'avoir vu, ce qui s'appelle vu de leurs propres yeux de savants.
A prendre la moyenne des observations faites <20> diverses reprises - en rejetant les <20>valuations timides qui assignaient <20> cet objet une longueur de deux cents pieds et en repoussant les opinions exag<61>r<EFBFBD>es qui le disaient large d'un mille et long de trois - on pouvait affirmer, cependant, que cet <20>tre ph<70>nom<6F>nal d<>passait de beaucoup toutes les dimensions admises jusqu'<27> ce jour par les ichtyologistes - s'il existait toutefois.
Or, il existait, le fait en lui-m<>me n'<27>tait plus niable, et, avec ce penchant qui pousse au merveilleux la cervelle humaine, on comprendra l'<27>motion produite dans le monde entier par cette surnaturelle apparition. Quant <20> la rejeter au rang des fables, il fallait y renoncer.
En effet, le 20 juillet 1866, le steamer Governor-Higginson, de Calcutta and Burnach steam navigation Company, avait rencontr<74> cette masse mouvante <20> cinq milles dans l'est des c<>tes de l'Australie. Le capitaine Baker se crut, tout d'abord, en pr<70>sence d'un <20>cueil inconnu; il se disposait m<>me <20> en d<>terminer la situation exacte, quand deux colonnes d'eau, projet<65>es par l'inexplicable objet, s'<27>lanc<6E>rent en sifflant <20> cent cinquante pieds dans l'air. Donc, <20> moins que cet <20>cueil ne f<>t soumis aux expansions intermittentes d'un geyser, le Governor-Higginson avait affaire bel et bien <20> quelque mammif<69>re aquatique, inconnu jusque-l<>, qui rejetait par ses <20>vents des colonnes d'eau, m<>lang<6E>es d'air et de vapeur.
Pareil fait fut <20>galement observ<72> le 23 juillet de la m<>me ann<6E>e, dans les mers du Pacifique, par le Cristobal-Colon, de West India and Pacific steam navigation Company. Donc, ce c<>tac<61> extraordinaire pouvait se transporter d'un endroit <20> un autre avec une v<>locit<69> surprenante, puisque <20> trois jours d'intervalle, le Governor-Higginson et le Cristobal-Colon l'avaient observ<72> en deux points de la carte s<>par<61>s par une distance de plus de sept cents lieues marines.
Quinze jours plus tard, <20> deux mille lieues de l<> I'Helvetia, de la Compagnie Nationale, et le Shannon, du Royal-Mail, marchant <20> contrebord dans cette portion de l'Atlantique comprise entre les <20>tats-Unis et l'Europe, se signal<61>rent respectivement le monstre par 42<34>15' de latitude nord, et 60<36>35' de longitude <20> l'ouest du m<>ridien de Greenwich. Dans cette observation simultan<61>e, on crut pouvoir <20>valuer la longueur minimum du mammif<69>re <20> plus de trois cent cinquante pieds anglais, puisque le Shannon et l'Helvetia <20>taient de dimension inf<6E>rieure <20> lui, bien qu'ils mesurassent cent m<>tres de l'<27>trave <20> l'<27>tambot. Or, les plus vastes baleines, celles qui fr<66>quentent les parages des <20>les Al<41>outiennes, le Kulammak et l'Umgullick, n'ont jamais d<>pass<73> la longueur de cinquante-six m<>tres, - si m<>me elles l'atteignent.
Ces rapports arriv<69>s coup sur coup, de nouvelles observations faites <20> bord du transatlantique le Pereire, un abordage entre l'Etna, de la ligne Inman, et le monstre, un proc<6F>s-verbal dress<73> par les officiers de la fr<66>gate fran<61>aise la Normandie, un tr<74>s s<>rieux rel<65>vement obtenu par l'<27>tat-major du commodore Fitz-James <20> bord du Lord-Clyde, <20>murent profond<6E>ment l'opinion publique. Dans les pays d'humeur l<>g<EFBFBD>re, on plaisanta le ph<70>nom<6F>ne, mais les pays graves et pratiques, l'Angleterre, l'Am<41>rique, l'Allemagne, s'en pr<70>occup<75>rent vivement.
Partout dans les grands centres, le monstre devint <20> la mode; on le chanta dans les caf<61>s, on le bafoua dans les journaux, on le joua sur les th<74><68>tres. Les canards eurent l<> une belle occasion de pondre des oeufs de toutes couleurs. On vit r<>appara<72>tre dans les journaux - <20> court de copie - tous les <20>tres imaginaires et gigantesques, depuis la baleine blanche, le terrible "Moby Dick" des r<>gions hyperbor<6F>ennes, jusqu'au Kraken d<>mesur<75>, dont les tentacules peuvent enlacer un b<>timent de cinq cents tonneaux et l'entra<72>ner dans les ab<61>mes de l'Oc<4F>an. On reproduisit m<>me les proc<6F>s-verbaux des temps anciens, les opinions d'Aristote et de Pline, qui admettaient l'existence de ces monstres, puis les r<>cits norv<72>giens de l'<27>v<EFBFBD>que Pontoppidan, les relations de Paul Heggede, et enfin les rapports de M. Harrington, dont la bonne foi ne peut <20>tre soup<75>onn<6E>e, quand il affirme avoir vu, <20>tant <20> bord du Castillan, en 1857, cet <20>norme serpent qui n'avait jamais fr<66>quent<6E> jusqu'alors que les mers de l'ancien Constitutionnel.

23
fpdf/tutorial/20k_c2.txt Normal file
View File

@ -0,0 +1,23 @@
A l'<27>poque o<> ces <20>v<EFBFBD>nements se produisirent, je revenais d'une exploration scientifique entreprise dans les mauvaises terres du Nebraska, aux <20>tats-Unis. En ma qualit<69> de professeur-suppl<70>ant au Mus<75>um d'histoire naturelle de Paris, le gouvernement fran<61>ais m'avait joint <20> cette exp<78>dition. Apr<70>s six mois pass<73>s dans le Nebraska, charg<72> de pr<70>cieuses collections, j'arrivai <20> New York vers la fin de mars. Mon d<>part pour la France <20>tait fix<69> aux premiers jours de mai. Je m'occupais donc, en attendant, de classer mes richesses min<69>ralogiques, botaniques et zoologiques, quand arriva l'incident du Scotia.
J'<27>tais parfaitement au courant de la question <20> l'ordre du jour, et comment ne l'aurais-je pas <20>t<EFBFBD> ? J'avais lu et relu tous les journaux am<61>ricains et europ<6F>ens sans <20>tre plus avanc<6E>. Ce myst<73>re m'intriguait. Dans l'impossibilit<69> de me former une opinion, je flottais d'un extr<74>me <20> l'autre. Qu'il y eut quelque chose, cela ne pouvait <20>tre douteux, et les incr<63>dules <20>taient invit<69>s <20> mettre le doigt sur la plaie du Scotia.
A mon arriv<69>e <20> New York, la question br<62>lait. L'hypoth<74>se de l'<27>lot flottant, de l'<27>cueil insaisissable, soutenue par quelques esprits peu comp<6D>tents, <20>tait absolument abandonn<6E>e. Et, en effet, <20> moins que cet <20>cueil n'e<>t une machine dans le ventre, comment pouvait-il se d<>placer avec une rapidit<69> si prodigieuse ?
De m<>me fut repouss<73>e l'existence d'une coque flottante, d'une <20>norme <20>pave, et toujours <20> cause de la rapidit<69> du d<>placement.
Restaient donc deux solutions possibles de la question, qui cr<63>aient deux clans tr<74>s distincts de partisans : d'un c<>t<EFBFBD>, ceux qui tenaient pour un monstre d'une force colossale ; de l'autre, ceux qui tenaient pour un bateau "sous-marin" d'une extr<74>me puissance motrice.
Or, cette derni<6E>re hypoth<74>se, admissible apr<70>s tout, ne put r<>sister aux enqu<71>tes qui furent poursuivies dans les deux mondes. Qu'un simple particulier e<>t <20> sa disposition un tel engin m<>canique, c'<27>tait peu probable. O<> et quand l'eut-il fait construire, et comment aurait-il tenu cette construction secr<63>te ?
Seul, un gouvernement pouvait poss<73>der une pareille machine destructive, et, en ces temps d<>sastreux o<> l'homme s'ing<6E>nie <20> multiplier la puissance des armes de guerre, il <20>tait possible qu'un <20>tat essay<61>t <20> l'insu des autres ce formidable engin. Apr<70>s les chassepots, les torpilles, apr<70>s les torpilles, les b<>liers sous-marins, puis la r<>action. Du moins, je l'esp<73>re.
Mais l'hypoth<74>se d'une machine de guerre tomba encore devant la d<>claration des gouvernements. Comme il s'agissait l<> d'un int<6E>r<EFBFBD>t public, puisque les communications transoc<6F>aniennes en souffraient, la franchise des gouvernements ne pouvait <20>tre mise en doute. D'ailleurs, comment admettre que la construction de ce bateau sous-marin e<>t <20>chapp<70> aux yeux du public ? Garder le secret dans ces circonstances est tr<74>s difficile pour un particulier, et certainement impossible pour un Etat dont tous les actes sont obstin<69>ment surveill<6C>s par les puissances rivales.
Donc, apr<70>s enqu<71>tes faites en Angleterre, en France, en Russie, en Prusse, en Espagne, en Italie, en Am<41>rique, voire m<>me en Turquie, l'hypoth<74>se d'un Monitor sous-marin fut d<>finitivement rejet<65>e.
A mon arriv<69>e <20> New York, plusieurs personnes m'avaient fait l'honneur de me consulter sur le ph<70>nom<6F>ne en question. J'avais publi<6C> en France un ouvrage in-quarto en deux volumes intitul<75> : Les Myst<73>res des grands fonds sous-marins. Ce livre, particuli<6C>rement go<67>t<EFBFBD> du monde savant, faisait de moi un sp<73>cialiste dans cette partie assez obscure de l'histoire naturelle. Mon avis me fut demand<6E>. Tant que je pus nier du fait, je me renfermai dans une absolue n<>gation. Mais bient<6E>t, coll<6C> au mur, je dus m'expliquer cat<61>goriquement. Et m<>me, "l'honorable Pierre Aronnax, professeur au Mus<75>um de Paris", fut mis en demeure par le New York-Herald de formuler une opinion quelconque.
Je m'ex<65>cutai. Je parlai faute de pouvoir me taire. Je discutai la question sous toutes ses faces, politiquement et scientifiquement, et je donne ici un extrait d'un article tr<74>s nourri que je publiai dans le num<75>ro du 30 avril.
" Ainsi donc, disais-je, apr<70>s avoir examin<69> une <20> une les diverses hypoth<74>ses, toute autre supposition <20>tant rejet<65>e, il faut n<>cessairement admettre l'existence d'un animal marin d'une puissance excessive.
" Les grandes profondeurs de l'Oc<4F>an nous sont totalement inconnues. La sonde n'a su les atteindre. Que se passe-t-il dans ces ab<61>mes recul<75>s ? Quels <20>tres habitent et peuvent habiter <20> douze ou quinze milles au-dessous de la surface des eaux ? Quel est l'organisme de ces animaux ? On saurait <20> peine le conjecturer.
" Cependant, la solution du probl<62>me qui m'est soumis peut affecter la forme du dilemme.
" Ou nous connaissons toutes les vari<72>t<EFBFBD>s d'<27>tres qui peuplent notre plan<61>te, ou nous ne les connaissons pas.
" Si nous ne les connaissons pas toutes, si la nature a encore des secrets pour nous en ichtyologie, rien de plus acceptable que d'admettre l'existence de poissons ou de c<>tac<61>s, d'esp<73>ces ou m<>me de genres nouveaux, d'une organisation essentiellement "fondri<72>re", qui habitent les couches inaccessibles <20> la sonde, et qu'un <20>v<EFBFBD>nement quelconque, une fantaisie, un caprice, si l'on veut, ram<61>ne <20> de longs intervalles vers le niveau sup<75>rieur de l'Oc<4F>an.
" Si, au contraire, nous connaissons toutes les esp<73>ces vivantes, il faut n<>cessairement chercher l'animal en question parmi les <20>tres marins d<>j<EFBFBD> catalogu<67>s, et dans ce cas, je serai dispos<6F> <20> admettre l'existence d'un Narwal g<>ant.
" Le narwal vulgaire ou licorne de mer atteint souvent une longueur de soixante pieds. Quintuplez, d<>cuplez m<>me cette dimension, donnez <20> ce c<>tac<61> une force proportionnelle <20> sa taille, accroissez ses armes offensives, et vous obtenez l'animal voulu. Il aura les proportions d<>termin<69>es par les Officiers du Shannon, l'instrument exig<69> par la perforation du Scotia, et la puissance n<>cessaire pour entamer la coque d'un steamer.
" En effet, le narwal est arm<72> d'une sorte d'<27>p<EFBFBD>e d'ivoire, d'une hallebarde, suivant l'expression de certains naturalistes. C'est une dent principale qui a la duret<65> de l'acier. On a trouv<75> quelques-unes de ces dents implant<6E>es dans le corps des baleines que le narwal attaque toujours avec succ<63>s. D'autres ont <20>t<EFBFBD> arrach<63>es, non sans peine, de car<61>nes de vaisseaux qu'elles avaient perc<72>es d'outre en outre, comme un foret perce un tonneau. Le mus<75>e de la Facult<6C> de m<>decine de Paris poss<73>de une de ces d<>fenses longue de deux m<>tres vingt-cinq centim<69>tres, et large de quarante-huit centim<69>tres <20> sa base !
" Eh bien ! supposez l'arme dix fois plus forte, et l'animal dix fois plus puissant, lancez-le avec une rapidit<69> de vingt milles <20> l'heure, multipliez sa masse par sa vitesse, et vous obtenez un choc capable de produire la catastrophe demand<6E>e.
" Donc, jusqu'<27> plus amples informations, j'opinerais pour une licorne de mer, de dimensions colossales, arm<72>e, non plus d'une hallebarde, mais d'un v<>ritable <20>peron comme les fr<66>gates cuirass<73>es ou les "rams" de guerre, dont elle aurait <20> la fois la masse et la puissance motrice.
" Ainsi s'expliquerait ce ph<70>nom<6F>ne inexplicable - <20> moins qu'il n'y ait rien, en d<>pit de ce qu'on a entrevu, vu, senti et ressenti - ce qui est encore possible ! "

View File

@ -0,0 +1,25 @@
<?php
$type = 'TrueType';
$name = 'CalligrapherRegular';
$desc = array('Ascent'=>899,'Descent'=>-234,'CapHeight'=>899,'Flags'=>32,'FontBBox'=>'[-173 -234 1328 899]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>800);
$up = -200;
$ut = 20;
$cw = array(
chr(0)=>800,chr(1)=>800,chr(2)=>800,chr(3)=>800,chr(4)=>800,chr(5)=>800,chr(6)=>800,chr(7)=>800,chr(8)=>800,chr(9)=>800,chr(10)=>800,chr(11)=>800,chr(12)=>800,chr(13)=>800,chr(14)=>800,chr(15)=>800,chr(16)=>800,chr(17)=>800,chr(18)=>800,chr(19)=>800,chr(20)=>800,chr(21)=>800,
chr(22)=>800,chr(23)=>800,chr(24)=>800,chr(25)=>800,chr(26)=>800,chr(27)=>800,chr(28)=>800,chr(29)=>800,chr(30)=>800,chr(31)=>800,' '=>282,'!'=>324,'"'=>405,'#'=>584,'$'=>632,'%'=>980,'&'=>776,'\''=>259,'('=>299,')'=>299,'*'=>377,'+'=>600,
','=>259,'-'=>432,'.'=>254,'/'=>597,'0'=>529,'1'=>298,'2'=>451,'3'=>359,'4'=>525,'5'=>423,'6'=>464,'7'=>417,'8'=>457,'9'=>479,':'=>275,';'=>282,'<'=>600,'='=>600,'>'=>600,'?'=>501,'@'=>800,'A'=>743,
'B'=>636,'C'=>598,'D'=>712,'E'=>608,'F'=>562,'G'=>680,'H'=>756,'I'=>308,'J'=>314,'K'=>676,'L'=>552,'M'=>1041,'N'=>817,'O'=>729,'P'=>569,'Q'=>698,'R'=>674,'S'=>618,'T'=>673,'U'=>805,'V'=>753,'W'=>1238,
'X'=>716,'Y'=>754,'Z'=>599,'['=>315,'\\'=>463,']'=>315,'^'=>600,'_'=>547,'`'=>278,'a'=>581,'b'=>564,'c'=>440,'d'=>571,'e'=>450,'f'=>347,'g'=>628,'h'=>611,'i'=>283,'j'=>283,'k'=>560,'l'=>252,'m'=>976,
'n'=>595,'o'=>508,'p'=>549,'q'=>540,'r'=>395,'s'=>441,'t'=>307,'u'=>614,'v'=>556,'w'=>915,'x'=>559,'y'=>597,'z'=>452,'{'=>315,'|'=>222,'}'=>315,'~'=>600,chr(127)=>800,chr(128)=>800,chr(129)=>800,chr(130)=>0,chr(131)=>0,
chr(132)=>0,chr(133)=>780,chr(134)=>0,chr(135)=>0,chr(136)=>278,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>1064,chr(141)=>800,chr(142)=>0,chr(143)=>800,chr(144)=>800,chr(145)=>259,chr(146)=>259,chr(147)=>470,chr(148)=>470,chr(149)=>500,chr(150)=>300,chr(151)=>600,chr(152)=>278,chr(153)=>990,
chr(154)=>0,chr(155)=>0,chr(156)=>790,chr(157)=>800,chr(158)=>800,chr(159)=>754,chr(160)=>282,chr(161)=>324,chr(162)=>450,chr(163)=>640,chr(164)=>518,chr(165)=>603,chr(166)=>0,chr(167)=>519,chr(168)=>254,chr(169)=>800,chr(170)=>349,chr(171)=>0,chr(172)=>0,chr(173)=>432,chr(174)=>800,chr(175)=>278,
chr(176)=>0,chr(177)=>0,chr(178)=>0,chr(179)=>0,chr(180)=>278,chr(181)=>614,chr(182)=>0,chr(183)=>254,chr(184)=>278,chr(185)=>0,chr(186)=>305,chr(187)=>0,chr(188)=>0,chr(189)=>0,chr(190)=>0,chr(191)=>501,chr(192)=>743,chr(193)=>743,chr(194)=>743,chr(195)=>743,chr(196)=>743,chr(197)=>743,
chr(198)=>1060,chr(199)=>598,chr(200)=>608,chr(201)=>608,chr(202)=>608,chr(203)=>608,chr(204)=>308,chr(205)=>308,chr(206)=>308,chr(207)=>308,chr(208)=>0,chr(209)=>817,chr(210)=>729,chr(211)=>729,chr(212)=>729,chr(213)=>729,chr(214)=>729,chr(215)=>0,chr(216)=>729,chr(217)=>805,chr(218)=>805,chr(219)=>805,
chr(220)=>805,chr(221)=>0,chr(222)=>0,chr(223)=>688,chr(224)=>581,chr(225)=>581,chr(226)=>581,chr(227)=>581,chr(228)=>581,chr(229)=>581,chr(230)=>792,chr(231)=>440,chr(232)=>450,chr(233)=>450,chr(234)=>450,chr(235)=>450,chr(236)=>283,chr(237)=>283,chr(238)=>283,chr(239)=>283,chr(240)=>0,chr(241)=>595,
chr(242)=>508,chr(243)=>508,chr(244)=>508,chr(245)=>508,chr(246)=>508,chr(247)=>0,chr(248)=>508,chr(249)=>614,chr(250)=>614,chr(251)=>614,chr(252)=>614,chr(253)=>0,chr(254)=>0,chr(255)=>597);
$enc = 'cp1252';
$uv = array(0=>array(0,128),128=>8364,130=>8218,131=>402,132=>8222,133=>8230,134=>array(8224,2),136=>710,137=>8240,138=>352,139=>8249,140=>338,142=>381,145=>array(8216,2),147=>array(8220,2),149=>8226,150=>array(8211,2),152=>732,153=>8482,154=>353,155=>8250,156=>339,158=>382,159=>376,160=>array(160,96));
$file = 'calligra.z';
$originalsize = 33948;
$subsetted = true;
?>

BIN
fpdf/tutorial/calligra.ttf Normal file

Binary file not shown.

BIN
fpdf/tutorial/calligra.z Normal file

Binary file not shown.

20
fpdf/tutorial/index.htm Normal file
View File

@ -0,0 +1,20 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Tutoriels</title>
<link type="text/css" rel="stylesheet" href="../fpdf.css">
</head>
<body>
<h1>Tutoriels</h1>
<ul style="list-style-type:none; margin-left:0; padding-left:0">
<li><a href="tuto1.htm">Tutoriel 1</a> : Exemple minimal</li>
<li><a href="tuto2.htm">Tutoriel 2</a> : En-t<>te, pied de page, saut de page et image</li>
<li><a href="tuto3.htm">Tutoriel 3</a> : Retour du texte <20> la ligne et couleurs</li>
<li><a href="tuto4.htm">Tutoriel 4</a> : Multi-colonnes</li>
<li><a href="tuto5.htm">Tutoriel 5</a> : Tableaux</li>
<li><a href="tuto6.htm">Tutoriel 6</a> : Liens et texte en mode flot</li>
<li><a href="tuto7.htm">Tutoriel 7</a> : Ajout de polices et encodages</li>
</ul>
</body>
</html>

BIN
fpdf/tutorial/logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1,6 @@
<?php
// G<>n<EFBFBD>ration du fichier de d<>finition de police pour le tutoriel 7
require('../makefont/makefont.php');
MakeFont('calligra.ttf','cp1252');
?>

15
fpdf/tutorial/pays.txt Normal file
View File

@ -0,0 +1,15 @@
Allemagne;Berlin;357022;82057
Autriche;Vienne;83859;8075
Belgique;Bruxelles;30518;10192
Danemark;Copenhague;43094;5295
Espagne;Madrid;504790;39348
Finlande;Helsinki;304529;5147
France;Paris;543965;58728
Gr<EFBFBD>ce;Ath<74>nes;131625;10511
Irlande;Dublin;70723;3694
Italie;Rome;301316;57563
Luxembourg;Luxembourg;2586;424
Pays-Bas;Amsterdam;41526;15654
Portugal;Lisbonne;91906;9957
Royaume-Uni;Londres;243820;58862
Su<EFBFBD>de;Stockholm;410934;8839

82
fpdf/tutorial/tuto1.htm Normal file
View File

@ -0,0 +1,82 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Exemple minimal</title>
<link type="text/css" rel="stylesheet" href="../fpdf.css">
</head>
<body>
<h1>Exemple minimal</h1>
Voici pour commencer l'exemple classique :
<div class="source">
<pre><code>&lt;?php
<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
</span>$pdf <span class="kw">= new </span>FPDF<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>16<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Cell<span class="kw">(</span>40<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Hello World !'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
</span>?&gt;</code></pre>
</div>
<p class='demo'><a href='tuto1.php' target='_blank' class='demo'>[D<>mo]</a></p>
Apr<EFBFBD>s avoir inclus la librairie, un objet FPDF est cr<63><72>.
Le <a href='../doc/__construct.htm'>constructeur</a> est utilis<69> ici avec les valeurs par d<>faut : les pages sont en
portrait A4 et l'unit<69> de mesure est le millim<69>tre. On aurait pu l'indiquer explicitement par :
<div class="source">
<pre><code>$pdf <span class="kw">= new </span>FPDF<span class="kw">(</span><span class="str">'P'</span><span class="kw">,</span><span class="str">'mm'</span><span class="kw">,</span><span class="str">'A4'</span><span class="kw">);
</span></code></pre>
</div>
Il est possible de passer en paysage (<code>L</code>), d'utiliser d'autres formats de page (comme
<code>A3</code> et <code>A5</code>) ainsi que d'autres unit<69>s de mesure (<code>pt</code>,
<code>cm</code>, <code>in</code>).
<br>
<br>
Il n'y a pour l'instant encore aucune page, c'est pourquoi il faut en ajouter une avec
<a href='../doc/addpage.htm'>AddPage()</a>. L'origine est en haut <20> gauche et la position courante est plac<61>e par d<>faut
<EFBFBD> 1 cm des bords ; on peut changer ces marges par <a href='../doc/setmargins.htm'>SetMargins()</a>.
<br>
<br>
Avant d'imprimer du texte, il est imp<6D>ratif de d<>finir la police avec <a href='../doc/setfont.htm'>SetFont()</a>.
On choisit de l'Arial gras en taille 16 :
<div class="source">
<pre><code>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>16<span class="kw">);
</span></code></pre>
</div>
On aurait pu sp<73>cifier de l'italique avec <code>I</code>, du soulign<67> avec <code>U</code> ou une
police normale avec une cha<68>ne vide (ou bien encore une combinaison de styles). A noter que la
taille de la police est ici donn<6E>e en points, pas en millim<69>tres (ou autre unit<69> choisie) ; c'est
la seule exception. Les autres polices standards disponibles sont Times, Courier, Symbol et
ZapfDingbats.
<br>
<br>
On imprime ensuite une cellule gr<67>ce <20> <a href='../doc/cell.htm'>Cell()</a>. Une cellule est une zone rectangulaire,
<EFBFBD>ventuellement encadr<64>e, qui contient une ligne de texte. Elle est imprim<69>e <20> la position
courante. On sp<73>cifie ses dimensions, le texte (centr<74> ou align<67>), si des bords doivent <20>tre
trac<EFBFBD>s, et si la position courante doit <20>tre d<>plac<61>e <20> droite, en dessous ou bien doit
retourner au d<>but de la ligne suivante. On aurait par exemple encadr<64> le texte comme ceci :
<div class="source">
<pre><code>$pdf<span class="kw">-&gt;</span>Cell<span class="kw">(</span>40<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Hello World !'</span><span class="kw">,</span>1<span class="kw">);
</span></code></pre>
</div>
Si on veut ajouter une nouvelle cellule <20> droite avec du texte centr<74> et retourner <20> la ligne,
on fait :
<div class="source">
<pre><code>$pdf<span class="kw">-&gt;</span>Cell<span class="kw">(</span>60<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Powered by FPDF.'</span><span class="kw">,</span>0<span class="kw">,</span>1<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
</span></code></pre>
</div>
Remarque : le retour <20> la ligne peut <20>galement s'effectuer gr<67>ce <20> la m<>thode <a href='../doc/ln.htm'>Ln()</a>. Cette
derni<EFBFBD>re permet de pr<70>ciser en plus la hauteur du saut de ligne.
<br>
<br>
Enfin, le document est termin<69> et envoy<6F> au navigateur gr<67>ce <20> <a href='../doc/output.htm'>Output()</a>. Il est <20>galement
possible de le sauvegarder directement dans un fichier en passant les param<61>tres appropri<72>s.
<br>
<br>
<strong>Attention :</strong> dans le cas o<> le PDF est envoy<6F> au navigateur, le script ne doit
rien envoyer d'autre, ni avant ni apr<70>s (pas d'HTML, m<>me pas un espace ni un retour-chariot).
Si vous envoyez quelque chose avant, vous obtiendrez le message : "Some data has already been
output, can't send PDF file". Si vous envoyez quelque chose apr<70>s, il se peut que le document
ne s'affiche pas.
</body>
</html>

9
fpdf/tutorial/tuto1.php Normal file
View File

@ -0,0 +1,9 @@
<?php
require('../fpdf.php');
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$pdf->Cell(40,10,'Hello World !');
$pdf->Output();
?>

82
fpdf/tutorial/tuto2.htm Normal file
View File

@ -0,0 +1,82 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>En-t<>te, pied de page, saut de page et image</title>
<link type="text/css" rel="stylesheet" href="../fpdf.css">
</head>
<body>
<h1>En-t<>te, pied de page, saut de page et image</h1>
Voici un exemple de deux pages avec en-t<>te, pied de page et logo :
<div class="source">
<pre><code>&lt;?php
<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
class </span>PDF <span class="kw">extends </span>FPDF
<span class="kw">{
</span><span class="cmt">// En-t<>te
</span><span class="kw">function </span>Header<span class="kw">()
{
</span><span class="cmt">// Logo
</span>$<span class="kw">this-&gt;</span>Image<span class="kw">(</span><span class="str">'logo.png'</span><span class="kw">,</span>10<span class="kw">,</span>6<span class="kw">,</span>30<span class="kw">);
</span><span class="cmt">// Police Arial gras 15
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>15<span class="kw">);
</span><span class="cmt">// D<>calage <20> droite
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>80<span class="kw">);
</span><span class="cmt">// Titre
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>30<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Titre'</span><span class="kw">,</span>1<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
</span><span class="cmt">// Saut de ligne
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>20<span class="kw">);
}
</span><span class="cmt">// Pied de page
</span><span class="kw">function </span>Footer<span class="kw">()
{
</span><span class="cmt">// Positionnement <20> 1,5 cm du bas
</span>$<span class="kw">this-&gt;</span>SetY<span class="kw">(-</span>15<span class="kw">);
</span><span class="cmt">// Police Arial italique 8
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">,</span>8<span class="kw">);
</span><span class="cmt">// Num<75>ro de page
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Page '</span><span class="kw">.</span>$<span class="kw">this-&gt;</span>PageNo<span class="kw">().</span><span class="str">'/{nb}'</span><span class="kw">,</span>0<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
}
}
</span><span class="cmt">// Instanciation de la classe d<>riv<69>e
</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>AliasNbPages<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Times'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
for(</span>$i<span class="kw">=</span>1<span class="kw">;</span>$i<span class="kw">&lt;=</span>40<span class="kw">;</span>$i<span class="kw">++)
</span>$pdf<span class="kw">-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Impression de la ligne num<75>ro '</span><span class="kw">.</span>$i<span class="kw">,</span>0<span class="kw">,</span>1<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
</span>?&gt;</code></pre>
</div>
<p class='demo'><a href='tuto2.php' target='_blank' class='demo'>[D<>mo]</a></p>
Cet exemple exploite les m<>thodes <a href='../doc/header.htm'>Header()</a> et <a href='../doc/footer.htm'>Footer()</a> pour traiter les en-t<>tes et
pieds de page. Elles sont appel<65>es automatiquement. Leur impl<70>mentation dans la classe FPDF
est vide, aussi doit-on d<>river la classe et les red<65>finir.
<br>
<br>
Le logo est imprim<69> gr<67>ce <20> la m<>thode <a href='../doc/image.htm'>Image()</a> en pr<70>cisant le coin sup<75>rieur gauche et
la largeur. La hauteur est calcul<75>e automatiquement afin de respecter la proportion de l'image.
<br>
<br>
Pour imprimer le num<75>ro de page, une valeur nulle est pass<73>e comme largeur de cellule. Cela
signifie que cette derni<6E>re doit s'<27>tendre jusqu'<27> la marge droite de la page ; c'est pratique
pour centrer du texte. Le num<75>ro de page courant est retourn<72> par la m<>thode <a href='../doc/pageno.htm'>PageNo()</a> ; le
nombre total de pages s'obtient quant <20> lui gr<67>ce <20> la valeur sp<73>ciale <code>{nb}</code> qui sera
substitu<EFBFBD>e lorsque le document sera termin<69> (<28> condition d'avoir au pr<70>alable appel<65>
<a href='../doc/aliasnbpages.htm'>AliasNbPages()</a>).
<br>
A noter l'utilisation de la m<>thode <a href='../doc/sety.htm'>SetY()</a> qui permet de se
positionner de mani<6E>re absolue dans la page, <20> partir du haut ou du bas.
<br>
<br>
Une autre fonctionnalit<69> int<6E>ressante est ici utilis<69>e : le saut de page automatique. Lorsqu'une cellule
descend trop bas (<28> 2 centim<69>tres du bas de la page par d<>faut), un saut de page est effectu<74>
et la police est restaur<75>e. Bien que l'en-t<>te et le pied de page sp<73>cifient leur propre
police (Arial), le corps de la page continue en Times. Ce principe de restauration automatique
s'applique aussi <20> l'<27>paisseur des traits et aux couleurs. Le seuil de d<>clenchement du saut
de page se r<>gle avec <a href='../doc/setautopagebreak.htm'>SetAutoPageBreak()</a>.
</body>
</html>

41
fpdf/tutorial/tuto2.php Normal file
View File

@ -0,0 +1,41 @@
<?php
require('../fpdf.php');
class PDF extends FPDF
{
// En-t<>te
function Header()
{
// Logo
$this->Image('logo.png',10,6,30);
// Police Arial gras 15
$this->SetFont('Arial','B',15);
// D<>calage <20> droite
$this->Cell(80);
// Titre
$this->Cell(30,10,'Titre',1,0,'C');
// Saut de ligne
$this->Ln(20);
}
// Pied de page
function Footer()
{
// Positionnement <20> 1,5 cm du bas
$this->SetY(-15);
// Police Arial italique 8
$this->SetFont('Arial','I',8);
// Num<75>ro de page
$this->Cell(0,10,'Page '.$this->PageNo().'/{nb}',0,0,'C');
}
}
// Instanciation de la classe d<>riv<69>e
$pdf = new PDF();
$pdf->AliasNbPages();
$pdf->AddPage();
$pdf->SetFont('Times','',12);
for($i=1;$i<=40;$i++)
$pdf->Cell(0,10,'Impression de la ligne num<75>ro '.$i,0,1);
$pdf->Output();
?>

117
fpdf/tutorial/tuto3.htm Normal file
View File

@ -0,0 +1,117 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Retour du texte <20> la ligne et couleurs</title>
<link type="text/css" rel="stylesheet" href="../fpdf.css">
</head>
<body>
<h1>Retour du texte <20> la ligne et couleurs</h1>
Voici pour continuer un exemple imprimant des paragraphes de texte justifi<66>. Il illustre
<EFBFBD>galement l'utilisation des couleurs.
<div class="source">
<pre><code>&lt;?php
<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
class </span>PDF <span class="kw">extends </span>FPDF
<span class="kw">{
function </span>Header<span class="kw">()
{
global </span>$titre<span class="kw">;
</span><span class="cmt">// Arial gras 15
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>15<span class="kw">);
</span><span class="cmt">// Calcul de la largeur du titre et positionnement
</span>$w <span class="kw">= </span>$<span class="kw">this-&gt;</span>GetStringWidth<span class="kw">(</span>$titre<span class="kw">)+</span>6<span class="kw">;
</span>$<span class="kw">this-&gt;</span>SetX<span class="kw">((</span>210<span class="kw">-</span>$w<span class="kw">)/</span>2<span class="kw">);
</span><span class="cmt">// Couleurs du cadre, du fond et du texte
</span>$<span class="kw">this-&gt;</span>SetDrawColor<span class="kw">(</span>0<span class="kw">,</span>80<span class="kw">,</span>180<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>230<span class="kw">,</span>230<span class="kw">,</span>0<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>220<span class="kw">,</span>50<span class="kw">,</span>50<span class="kw">);
</span><span class="cmt">// Epaisseur du cadre (1 mm)
</span>$<span class="kw">this-&gt;</span>SetLineWidth<span class="kw">(</span>1<span class="kw">);
</span><span class="cmt">// Titre
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">,</span>9<span class="kw">,</span>$titre<span class="kw">,</span>1<span class="kw">,</span>1<span class="kw">,</span><span class="str">'C'</span><span class="kw">,</span>true<span class="kw">);
</span><span class="cmt">// Saut de ligne
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>10<span class="kw">);
}
function </span>Footer<span class="kw">()
{
</span><span class="cmt">// Positionnement <20> 1,5 cm du bas
</span>$<span class="kw">this-&gt;</span>SetY<span class="kw">(-</span>15<span class="kw">);
</span><span class="cmt">// Arial italique 8
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">,</span>8<span class="kw">);
</span><span class="cmt">// Couleur du texte en gris
</span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>128<span class="kw">);
</span><span class="cmt">// Num<75>ro de page
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Page '</span><span class="kw">.</span>$<span class="kw">this-&gt;</span>PageNo<span class="kw">(),</span>0<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
}
function </span>TitreChapitre<span class="kw">(</span>$num<span class="kw">, </span>$libelle<span class="kw">)
{
</span><span class="cmt">// Arial 12
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
</span><span class="cmt">// Couleur de fond
</span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>200<span class="kw">,</span>220<span class="kw">,</span>255<span class="kw">);
</span><span class="cmt">// Titre
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>6<span class="kw">,</span><span class="str">"Chapitre </span>$num<span class="str"> : </span>$libelle<span class="str">"</span><span class="kw">,</span>0<span class="kw">,</span>1<span class="kw">,</span><span class="str">'L'</span><span class="kw">,</span>true<span class="kw">);
</span><span class="cmt">// Saut de ligne
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>4<span class="kw">);
}
function </span>CorpsChapitre<span class="kw">(</span>$fichier<span class="kw">)
{
</span><span class="cmt">// Lecture du fichier texte
</span>$txt <span class="kw">= </span>file_get_contents<span class="kw">(</span>$fichier<span class="kw">);
</span><span class="cmt">// Times 12
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Times'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
</span><span class="cmt">// Sortie du texte justifi<66>
</span>$<span class="kw">this-&gt;</span>MultiCell<span class="kw">(</span>0<span class="kw">,</span>5<span class="kw">,</span>$txt<span class="kw">);
</span><span class="cmt">// Saut de ligne
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
</span><span class="cmt">// Mention en italique
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>5<span class="kw">,</span><span class="str">"(fin de l'extrait)"</span><span class="kw">);
}
function </span>AjouterChapitre<span class="kw">(</span>$num<span class="kw">, </span>$titre<span class="kw">, </span>$fichier<span class="kw">)
{
</span>$<span class="kw">this-&gt;</span>AddPage<span class="kw">();
</span>$<span class="kw">this-&gt;</span>TitreChapitre<span class="kw">(</span>$num<span class="kw">,</span>$titre<span class="kw">);
</span>$<span class="kw">this-&gt;</span>CorpsChapitre<span class="kw">(</span>$fichier<span class="kw">);
}
}
</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
</span>$titre <span class="kw">= </span><span class="str">'Vingt mille lieues sous les mers'</span><span class="kw">;
</span>$pdf<span class="kw">-&gt;</span>SetTitle<span class="kw">(</span>$titre<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>SetAuthor<span class="kw">(</span><span class="str">'Jules Verne'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>AjouterChapitre<span class="kw">(</span>1<span class="kw">,</span><span class="str">'UN <20>CUEIL FUYANT'</span><span class="kw">,</span><span class="str">'20k_c1.txt'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>AjouterChapitre<span class="kw">(</span>2<span class="kw">,</span><span class="str">'LE POUR ET LE CONTRE'</span><span class="kw">,</span><span class="str">'20k_c2.txt'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
</span>?&gt;</code></pre>
</div>
<p class='demo'><a href='tuto3.php' target='_blank' class='demo'>[D<>mo]</a></p>
La m<>thode <a href='../doc/getstringwidth.htm'>GetStringWidth()</a> permet de d<>terminer la longueur d'une cha<68>ne dans la police
courante, ce qui est utilis<69> ici pour calculer la largeur du cadre entourant le titre. Puis
les couleurs sont d<>finies (via <a href='../doc/setdrawcolor.htm'>SetDrawColor()</a>, <a href='../doc/setfillcolor.htm'>SetFillColor()</a> et <a href='../doc/settextcolor.htm'>SetTextColor()</a>)
et l'<27>paisseur du trait positionn<6E>e <20> 1 mm (contre 0,2 par d<>faut) gr<67>ce <20> <a href='../doc/setlinewidth.htm'>SetLineWidth()</a>.
Il ne reste alors plus qu'<27> imprimer la cellule pour le titre (le dernier param<61>tre <20> 1 indique
que le fond doit <20>tre color<6F>).
<br>
<br>
La m<>thode permettant d'imprimer les paragraphes est <a href='../doc/multicell.htm'>MultiCell()</a>. A chaque fois qu'une
ligne arrive <20> l'extr<74>mit<69> droite de la cellule ou qu'un caract<63>re de retour-chariot est
rencontr<EFBFBD>, un saut est effectu<74> et une nouvelle cellule automatiquement cr<63><72>e sous la
pr<EFBFBD>c<EFBFBD>dente. Le texte est justifi<66> par d<>faut.
<br>
<br>
Deux propri<72>t<EFBFBD>s du document sont renseign<67>es : le titre (<a href='../doc/settitle.htm'>SetTitle()</a>) et l'auteur
(<a href='../doc/setauthor.htm'>SetAuthor()</a>). Il y a plusieurs man<61>res d'acc<63>der aux propri<72>t<EFBFBD>s dans Adobe Reader. La premi<6D>re
consiste <20> ouvrir le document directement avec le lecteur, <20> aller dans le menu Fichier et <20>
choisir l'option Propri<72>t<EFBFBD>s. La seconde, disponible <20>galement <20> partir du plug-in, consiste <20>
faire un clic droit et <20> choisir Propri<72>t<EFBFBD>s du document. Enfin, on peut effectuer la combinaison
de touches Ctrl+D.
</body>
</html>

81
fpdf/tutorial/tuto3.php Normal file
View File

@ -0,0 +1,81 @@
<?php
require('../fpdf.php');
class PDF extends FPDF
{
function Header()
{
global $titre;
// Arial gras 15
$this->SetFont('Arial','B',15);
// Calcul de la largeur du titre et positionnement
$w = $this->GetStringWidth($titre)+6;
$this->SetX((210-$w)/2);
// Couleurs du cadre, du fond et du texte
$this->SetDrawColor(0,80,180);
$this->SetFillColor(230,230,0);
$this->SetTextColor(220,50,50);
// Epaisseur du cadre (1 mm)
$this->SetLineWidth(1);
// Titre
$this->Cell($w,9,$titre,1,1,'C',true);
// Saut de ligne
$this->Ln(10);
}
function Footer()
{
// Positionnement <20> 1,5 cm du bas
$this->SetY(-15);
// Arial italique 8
$this->SetFont('Arial','I',8);
// Couleur du texte en gris
$this->SetTextColor(128);
// Num<75>ro de page
$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
}
function TitreChapitre($num, $libelle)
{
// Arial 12
$this->SetFont('Arial','',12);
// Couleur de fond
$this->SetFillColor(200,220,255);
// Titre
$this->Cell(0,6,"Chapitre $num : $libelle",0,1,'L',true);
// Saut de ligne
$this->Ln(4);
}
function CorpsChapitre($fichier)
{
// Lecture du fichier texte
$txt = file_get_contents($fichier);
// Times 12
$this->SetFont('Times','',12);
// Sortie du texte justifi<66>
$this->MultiCell(0,5,$txt);
// Saut de ligne
$this->Ln();
// Mention en italique
$this->SetFont('','I');
$this->Cell(0,5,"(fin de l'extrait)");
}
function AjouterChapitre($num, $titre, $fichier)
{
$this->AddPage();
$this->TitreChapitre($num,$titre);
$this->CorpsChapitre($fichier);
}
}
$pdf = new PDF();
$titre = 'Vingt mille lieues sous les mers';
$pdf->SetTitle($titre);
$pdf->SetAuthor('Jules Verne');
$pdf->AjouterChapitre(1,'UN <20>CUEIL FUYANT','20k_c1.txt');
$pdf->AjouterChapitre(2,'LE POUR ET LE CONTRE','20k_c2.txt');
$pdf->Output();
?>

132
fpdf/tutorial/tuto4.htm Normal file
View File

@ -0,0 +1,132 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Multi-colonnes</title>
<link type="text/css" rel="stylesheet" href="../fpdf.css">
</head>
<body>
<h1>Multi-colonnes</h1>
Cet exemple est une variation du pr<70>c<EFBFBD>dent montrant comment formater le texte sur plusieurs
colonnes.
<div class="source">
<pre><code>&lt;?php
<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
class </span>PDF <span class="kw">extends </span>FPDF
<span class="kw">{
protected </span>$col <span class="kw">= </span>0<span class="kw">; </span><span class="cmt">// Colonne courante
</span><span class="kw">protected </span>$y0<span class="kw">; </span><span class="cmt">// Ordonn<6E>e du d<>but des colonnes
</span><span class="kw">function </span>Header<span class="kw">()
{
</span><span class="cmt">// En-t<>te
</span><span class="kw">global </span>$titre<span class="kw">;
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span>15<span class="kw">);
</span>$w <span class="kw">= </span>$<span class="kw">this-&gt;</span>GetStringWidth<span class="kw">(</span>$titre<span class="kw">)+</span>6<span class="kw">;
</span>$<span class="kw">this-&gt;</span>SetX<span class="kw">((</span>210<span class="kw">-</span>$w<span class="kw">)/</span>2<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetDrawColor<span class="kw">(</span>0<span class="kw">,</span>80<span class="kw">,</span>180<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>230<span class="kw">,</span>230<span class="kw">,</span>0<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>220<span class="kw">,</span>50<span class="kw">,</span>50<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetLineWidth<span class="kw">(</span>1<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">,</span>9<span class="kw">,</span>$titre<span class="kw">,</span>1<span class="kw">,</span>1<span class="kw">,</span><span class="str">'C'</span><span class="kw">,</span>true<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>10<span class="kw">);
</span><span class="cmt">// Sauvegarde de l'ordonn<6E>e
</span>$<span class="kw">this-&gt;</span>y0 <span class="kw">= </span>$<span class="kw">this-&gt;</span>GetY<span class="kw">();
}
function </span>Footer<span class="kw">()
{
</span><span class="cmt">// Pied de page
</span>$<span class="kw">this-&gt;</span>SetY<span class="kw">(-</span>15<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">,</span>8<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>128<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>10<span class="kw">,</span><span class="str">'Page '</span><span class="kw">.</span>$<span class="kw">this-&gt;</span>PageNo<span class="kw">(),</span>0<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
}
function </span>SetCol<span class="kw">(</span>$col<span class="kw">)
{
</span><span class="cmt">// Positionnement sur une colonne
</span>$<span class="kw">this-&gt;</span>col <span class="kw">= </span>$col<span class="kw">;
</span>$x <span class="kw">= </span>10<span class="kw">+</span>$col<span class="kw">*</span>65<span class="kw">;
</span>$<span class="kw">this-&gt;</span>SetLeftMargin<span class="kw">(</span>$x<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetX<span class="kw">(</span>$x<span class="kw">);
}
function </span>AcceptPageBreak<span class="kw">()
{
</span><span class="cmt">// M<>thode autorisant ou non le saut de page automatique
</span><span class="kw">if(</span>$<span class="kw">this-&gt;</span>col<span class="kw">&lt;</span>2<span class="kw">)
{
</span><span class="cmt">// Passage <20> la colonne suivante
</span>$<span class="kw">this-&gt;</span>SetCol<span class="kw">(</span>$<span class="kw">this-&gt;</span>col<span class="kw">+</span>1<span class="kw">);
</span><span class="cmt">// Ordonn<6E>e en haut
</span>$<span class="kw">this-&gt;</span>SetY<span class="kw">(</span>$<span class="kw">this-&gt;</span>y0<span class="kw">);
</span><span class="cmt">// On reste sur la page
</span><span class="kw">return </span>false<span class="kw">;
}
else
{
</span><span class="cmt">// Retour en premi<6D>re colonne
</span>$<span class="kw">this-&gt;</span>SetCol<span class="kw">(</span>0<span class="kw">);
</span><span class="cmt">// Saut de page
</span><span class="kw">return </span>true<span class="kw">;
}
}
function </span>TitreChapitre<span class="kw">(</span>$num<span class="kw">, </span>$libelle<span class="kw">)
{
</span><span class="cmt">// Titre
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>200<span class="kw">,</span>220<span class="kw">,</span>255<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>6<span class="kw">,</span><span class="str">"Chapitre </span>$num<span class="str"> : </span>$libelle<span class="str">"</span><span class="kw">,</span>0<span class="kw">,</span>1<span class="kw">,</span><span class="str">'L'</span><span class="kw">,</span>true<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>4<span class="kw">);
</span><span class="cmt">// Sauvegarde de l'ordonn<6E>e
</span>$<span class="kw">this-&gt;</span>y0 <span class="kw">= </span>$<span class="kw">this-&gt;</span>GetY<span class="kw">();
}
function </span>CorpsChapitre<span class="kw">(</span>$fichier<span class="kw">)
{
</span><span class="cmt">// Lecture du fichier texte
</span>$txt <span class="kw">= </span>file_get_contents<span class="kw">(</span>$fichier<span class="kw">);
</span><span class="cmt">// Police
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Times'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>12<span class="kw">);
</span><span class="cmt">// Sortie du texte sur 6 cm de largeur
</span>$<span class="kw">this-&gt;</span>MultiCell<span class="kw">(</span>60<span class="kw">,</span>5<span class="kw">,</span>$txt<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
</span><span class="cmt">// Mention
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span><span class="str">'I'</span><span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>0<span class="kw">,</span>5<span class="kw">,</span><span class="str">"(fin de l'extrait)"</span><span class="kw">);
</span><span class="cmt">// Retour en premi<6D>re colonne
</span>$<span class="kw">this-&gt;</span>SetCol<span class="kw">(</span>0<span class="kw">);
}
function </span>AjouterChapitre<span class="kw">(</span>$num<span class="kw">, </span>$titre<span class="kw">, </span>$fichier<span class="kw">)
{
</span><span class="cmt">// Ajout du chapitre
</span>$<span class="kw">this-&gt;</span>AddPage<span class="kw">();
</span>$<span class="kw">this-&gt;</span>TitreChapitre<span class="kw">(</span>$num<span class="kw">,</span>$titre<span class="kw">);
</span>$<span class="kw">this-&gt;</span>CorpsChapitre<span class="kw">(</span>$fichier<span class="kw">);
}
}
</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
</span>$titre <span class="kw">= </span><span class="str">'Vingt mille lieues sous les mers'</span><span class="kw">;
</span>$pdf<span class="kw">-&gt;</span>SetTitle<span class="kw">(</span>$titre<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>SetAuthor<span class="kw">(</span><span class="str">'Jules Verne'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>AjouterChapitre<span class="kw">(</span>1<span class="kw">,</span><span class="str">'UN <20>CUEIL FUYANT'</span><span class="kw">,</span><span class="str">'20k_c1.txt'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>AjouterChapitre<span class="kw">(</span>2<span class="kw">,</span><span class="str">'LE POUR ET LE CONTRE'</span><span class="kw">,</span><span class="str">'20k_c2.txt'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
</span>?&gt;</code></pre>
</div>
<p class='demo'><a href='tuto4.php' target='_blank' class='demo'>[D<>mo]</a></p>
La m<>thode-cl<63> utilis<69>e est <a href='../doc/acceptpagebreak.htm'>AcceptPageBreak()</a>. Elle permet d'accepter ou non un saut de
page automatique. En refusant le saut et en modifiant la marge gauche (par <a href='../doc/setleftmargin.htm'>SetLeftMargin()</a>),
on obtient le formatage en colonnes.
<br>
Pour le reste, peu de changements ; deux propri<72>t<EFBFBD>s ont <20>t<EFBFBD> ajout<75>es <20> la classe pour m<>moriser
le num<75>ro de colonne courant ainsi que l'ordonn<6E>e du d<>but des colonnes, et l'appel <20> MultiCell()
sp<EFBFBD>cifie que le texte a 6 cm de largeur.
</body>
</html>

109
fpdf/tutorial/tuto4.php Normal file
View File

@ -0,0 +1,109 @@
<?php
require('../fpdf.php');
class PDF extends FPDF
{
protected $col = 0; // Colonne courante
protected $y0; // Ordonn<6E>e du d<>but des colonnes
function Header()
{
// En-t<>te
global $titre;
$this->SetFont('Arial','B',15);
$w = $this->GetStringWidth($titre)+6;
$this->SetX((210-$w)/2);
$this->SetDrawColor(0,80,180);
$this->SetFillColor(230,230,0);
$this->SetTextColor(220,50,50);
$this->SetLineWidth(1);
$this->Cell($w,9,$titre,1,1,'C',true);
$this->Ln(10);
// Sauvegarde de l'ordonn<6E>e
$this->y0 = $this->GetY();
}
function Footer()
{
// Pied de page
$this->SetY(-15);
$this->SetFont('Arial','I',8);
$this->SetTextColor(128);
$this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
}
function SetCol($col)
{
// Positionnement sur une colonne
$this->col = $col;
$x = 10+$col*65;
$this->SetLeftMargin($x);
$this->SetX($x);
}
function AcceptPageBreak()
{
// M<>thode autorisant ou non le saut de page automatique
if($this->col<2)
{
// Passage <20> la colonne suivante
$this->SetCol($this->col+1);
// Ordonn<6E>e en haut
$this->SetY($this->y0);
// On reste sur la page
return false;
}
else
{
// Retour en premi<6D>re colonne
$this->SetCol(0);
// Saut de page
return true;
}
}
function TitreChapitre($num, $libelle)
{
// Titre
$this->SetFont('Arial','',12);
$this->SetFillColor(200,220,255);
$this->Cell(0,6,"Chapitre $num : $libelle",0,1,'L',true);
$this->Ln(4);
// Sauvegarde de l'ordonn<6E>e
$this->y0 = $this->GetY();
}
function CorpsChapitre($fichier)
{
// Lecture du fichier texte
$txt = file_get_contents($fichier);
// Police
$this->SetFont('Times','',12);
// Sortie du texte sur 6 cm de largeur
$this->MultiCell(60,5,$txt);
$this->Ln();
// Mention
$this->SetFont('','I');
$this->Cell(0,5,"(fin de l'extrait)");
// Retour en premi<6D>re colonne
$this->SetCol(0);
}
function AjouterChapitre($num, $titre, $fichier)
{
// Ajout du chapitre
$this->AddPage();
$this->TitreChapitre($num,$titre);
$this->CorpsChapitre($fichier);
}
}
$pdf = new PDF();
$titre = 'Vingt mille lieues sous les mers';
$pdf->SetTitle($titre);
$pdf->SetAuthor('Jules Verne');
$pdf->AjouterChapitre(1,'UN <20>CUEIL FUYANT','20k_c1.txt');
$pdf->AjouterChapitre(2,'LE POUR ET LE CONTRE','20k_c2.txt');
$pdf->Output();
?>

138
fpdf/tutorial/tuto5.htm Normal file
View File

@ -0,0 +1,138 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Tableaux</title>
<link type="text/css" rel="stylesheet" href="../fpdf.css">
</head>
<body>
<h1>Tableaux</h1>
Ce tutoriel montre diff<66>rentes mani<6E>res de r<>aliser des tableaux.
<div class="source">
<pre><code>&lt;?php
<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
class </span>PDF <span class="kw">extends </span>FPDF
<span class="kw">{
</span><span class="cmt">// Chargement des donn<6E>es
</span><span class="kw">function </span>LoadData<span class="kw">(</span>$file<span class="kw">)
{
</span><span class="cmt">// Lecture des lignes du fichier
</span>$lines <span class="kw">= </span>file<span class="kw">(</span>$file<span class="kw">);
</span>$data <span class="kw">= array();
foreach(</span>$lines <span class="kw">as </span>$line<span class="kw">)
</span>$data<span class="kw">[] = </span>explode<span class="kw">(</span><span class="str">';'</span><span class="kw">,</span>trim<span class="kw">(</span>$line<span class="kw">));
return </span>$data<span class="kw">;
}
</span><span class="cmt">// Tableau simple
</span><span class="kw">function </span>BasicTable<span class="kw">(</span>$header<span class="kw">, </span>$data<span class="kw">)
{
</span><span class="cmt">// En-t<>te
</span><span class="kw">foreach(</span>$header <span class="kw">as </span>$col<span class="kw">)
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>40<span class="kw">,</span>7<span class="kw">,</span>$col<span class="kw">,</span>1<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
</span><span class="cmt">// Donn<6E>es
</span><span class="kw">foreach(</span>$data <span class="kw">as </span>$row<span class="kw">)
{
foreach(</span>$row <span class="kw">as </span>$col<span class="kw">)
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>40<span class="kw">,</span>6<span class="kw">,</span>$col<span class="kw">,</span>1<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
}
}
</span><span class="cmt">// Tableau am<61>lior<6F>
</span><span class="kw">function </span>ImprovedTable<span class="kw">(</span>$header<span class="kw">, </span>$data<span class="kw">)
{
</span><span class="cmt">// Largeurs des colonnes
</span>$w <span class="kw">= array(</span>40<span class="kw">, </span>35<span class="kw">, </span>45<span class="kw">, </span>40<span class="kw">);
</span><span class="cmt">// En-t<>te
</span><span class="kw">for(</span>$i<span class="kw">=</span>0<span class="kw">;</span>$i<span class="kw">&lt;</span>count<span class="kw">(</span>$header<span class="kw">);</span>$i<span class="kw">++)
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>$i<span class="kw">],</span>7<span class="kw">,</span>$header<span class="kw">[</span>$i<span class="kw">],</span>1<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">);
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
</span><span class="cmt">// Donn<6E>es
</span><span class="kw">foreach(</span>$data <span class="kw">as </span>$row<span class="kw">)
{
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>0<span class="kw">],</span>6<span class="kw">,</span>$row<span class="kw">[</span>0<span class="kw">],</span><span class="str">'LR'</span><span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>1<span class="kw">],</span>6<span class="kw">,</span>$row<span class="kw">[</span>1<span class="kw">],</span><span class="str">'LR'</span><span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>2<span class="kw">],</span>6<span class="kw">,</span>number_format<span class="kw">(</span>$row<span class="kw">[</span>2<span class="kw">],</span>0<span class="kw">,</span><span class="str">','</span><span class="kw">,</span><span class="str">' '</span><span class="kw">),</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'R'</span><span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>3<span class="kw">],</span>6<span class="kw">,</span>number_format<span class="kw">(</span>$row<span class="kw">[</span>3<span class="kw">],</span>0<span class="kw">,</span><span class="str">','</span><span class="kw">,</span><span class="str">' '</span><span class="kw">),</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'R'</span><span class="kw">);
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
}
</span><span class="cmt">// Trait de terminaison
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>array_sum<span class="kw">(</span>$w<span class="kw">),</span>0<span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'T'</span><span class="kw">);
}
</span><span class="cmt">// Tableau color<6F>
</span><span class="kw">function </span>FancyTable<span class="kw">(</span>$header<span class="kw">, </span>$data<span class="kw">)
{
</span><span class="cmt">// Couleurs, <20>paisseur du trait et police grasse
</span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>255<span class="kw">,</span>0<span class="kw">,</span>0<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>255<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetDrawColor<span class="kw">(</span>128<span class="kw">,</span>0<span class="kw">,</span>0<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetLineWidth<span class="kw">(</span>.3<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">);
</span><span class="cmt">// En-t<>te
</span>$w <span class="kw">= array(</span>40<span class="kw">, </span>35<span class="kw">, </span>45<span class="kw">, </span>40<span class="kw">);
for(</span>$i<span class="kw">=</span>0<span class="kw">;</span>$i<span class="kw">&lt;</span>count<span class="kw">(</span>$header<span class="kw">);</span>$i<span class="kw">++)
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>$i<span class="kw">],</span>7<span class="kw">,</span>$header<span class="kw">[</span>$i<span class="kw">],</span>1<span class="kw">,</span>0<span class="kw">,</span><span class="str">'C'</span><span class="kw">,</span>true<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
</span><span class="cmt">// Restauration des couleurs et de la police
</span>$<span class="kw">this-&gt;</span>SetFillColor<span class="kw">(</span>224<span class="kw">,</span>235<span class="kw">,</span>255<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>0<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">);
</span><span class="cmt">// Donn<6E>es
</span>$fill <span class="kw">= </span>false<span class="kw">;
foreach(</span>$data <span class="kw">as </span>$row<span class="kw">)
{
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>0<span class="kw">],</span>6<span class="kw">,</span>$row<span class="kw">[</span>0<span class="kw">],</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'L'</span><span class="kw">,</span>$fill<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>1<span class="kw">],</span>6<span class="kw">,</span>$row<span class="kw">[</span>1<span class="kw">],</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'L'</span><span class="kw">,</span>$fill<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>2<span class="kw">],</span>6<span class="kw">,</span>number_format<span class="kw">(</span>$row<span class="kw">[</span>2<span class="kw">],</span>0<span class="kw">,</span><span class="str">','</span><span class="kw">,</span><span class="str">' '</span><span class="kw">),</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'R'</span><span class="kw">,</span>$fill<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>$w<span class="kw">[</span>3<span class="kw">],</span>6<span class="kw">,</span>number_format<span class="kw">(</span>$row<span class="kw">[</span>3<span class="kw">],</span>0<span class="kw">,</span><span class="str">','</span><span class="kw">,</span><span class="str">' '</span><span class="kw">),</span><span class="str">'LR'</span><span class="kw">,</span>0<span class="kw">,</span><span class="str">'R'</span><span class="kw">,</span>$fill<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">();
</span>$fill <span class="kw">= !</span>$fill<span class="kw">;
}
</span><span class="cmt">// Trait de terminaison
</span>$<span class="kw">this-&gt;</span>Cell<span class="kw">(</span>array_sum<span class="kw">(</span>$w<span class="kw">),</span>0<span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'T'</span><span class="kw">);
}
}
</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
</span><span class="cmt">// Titres des colonnes
</span>$header <span class="kw">= array(</span><span class="str">'Pays'</span><span class="kw">, </span><span class="str">'Capitale'</span><span class="kw">, </span><span class="str">'Superficie (km<6B>)'</span><span class="kw">, </span><span class="str">'Pop. (milliers)'</span><span class="kw">);
</span><span class="cmt">// Chargement des donn<6E>es
</span>$data <span class="kw">= </span>$pdf<span class="kw">-&gt;</span>LoadData<span class="kw">(</span><span class="str">'pays.txt'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>14<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>BasicTable<span class="kw">(</span>$header<span class="kw">,</span>$data<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>ImprovedTable<span class="kw">(</span>$header<span class="kw">,</span>$data<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>FancyTable<span class="kw">(</span>$header<span class="kw">,</span>$data<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
</span>?&gt;</code></pre>
</div>
<p class='demo'><a href='tuto5.php' target='_blank' class='demo'>[D<>mo]</a></p>
Un tableau n'<27>tant qu'un ensemble de cellules, il est naturel de les construire <20> partir de
ces derni<6E>res. Le premier est r<>alis<69> de la mani<6E>re la plus <20>l<EFBFBD>mentaire qui soit : de simples
cellules encadr<64>es, toutes de la m<>me taille et align<67>es <20> gauche. Le r<>sultat est
rudimentaire mais tr<74>s rapide <20> obtenir.
<br>
<br>
Le deuxi<78>me tableau apporte quelques am<61>liorations : chaque colonne a sa propre largeur, les
titres sont centr<74>s et les nombres cadr<64>s <20> droite. De plus, les traits horizontaux ont <20>t<EFBFBD>
enlev<EFBFBD>s. Ceci est r<>alis<69> gr<67>ce au param<61>tre <code>border</code> de la m<>thode <a href='../doc/cell.htm'>Cell()</a>, qui
permet de sp<73>cifier quels bords de la cellule doivent <20>tre trac<61>s. Dans le cas pr<70>sent, on
d<EFBFBD>sire les bords gauches (<code>L</code>) et droits (<code>R</code>). Reste le probl<62>me du trait
horizontal final pour refermer le tableau. Il y a deux possibilit<69>s : soit tester dans la
boucle si on se trouve sur la derni<6E>re ligne, auquel cas on utilise <code>LRB</code> pour le
param<EFBFBD>tre <code>border</code> ; soit, comme c'est fait ici, ajouter le trait une fois la boucle
termin<EFBFBD>e.
<br>
<br>
Le troisi<73>me tableau est semblable au deuxi<78>me mais utilise des couleurs. Il suffit pour cela
de pr<70>ciser les couleurs de fond, de texte et de trait souhait<69>es. L'alternance de couleur
pour les lignes est obtenue en utilisant des cellules <20> fond alternativement color<6F> et
transparent.
</body>
</html>

102
fpdf/tutorial/tuto5.php Normal file
View File

@ -0,0 +1,102 @@
<?php
require('../fpdf.php');
class PDF extends FPDF
{
// Chargement des donn<6E>es
function LoadData($file)
{
// Lecture des lignes du fichier
$lines = file($file);
$data = array();
foreach($lines as $line)
$data[] = explode(';',trim($line));
return $data;
}
// Tableau simple
function BasicTable($header, $data)
{
// En-t<>te
foreach($header as $col)
$this->Cell(40,7,$col,1);
$this->Ln();
// Donn<6E>es
foreach($data as $row)
{
foreach($row as $col)
$this->Cell(40,6,$col,1);
$this->Ln();
}
}
// Tableau am<61>lior<6F>
function ImprovedTable($header, $data)
{
// Largeurs des colonnes
$w = array(40, 35, 45, 40);
// En-t<>te
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C');
$this->Ln();
// Donn<6E>es
foreach($data as $row)
{
$this->Cell($w[0],6,$row[0],'LR');
$this->Cell($w[1],6,$row[1],'LR');
$this->Cell($w[2],6,number_format($row[2],0,',',' '),'LR',0,'R');
$this->Cell($w[3],6,number_format($row[3],0,',',' '),'LR',0,'R');
$this->Ln();
}
// Trait de terminaison
$this->Cell(array_sum($w),0,'','T');
}
// Tableau color<6F>
function FancyTable($header, $data)
{
// Couleurs, <20>paisseur du trait et police grasse
$this->SetFillColor(255,0,0);
$this->SetTextColor(255);
$this->SetDrawColor(128,0,0);
$this->SetLineWidth(.3);
$this->SetFont('','B');
// En-t<>te
$w = array(40, 35, 45, 40);
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C',true);
$this->Ln();
// Restauration des couleurs et de la police
$this->SetFillColor(224,235,255);
$this->SetTextColor(0);
$this->SetFont('');
// Donn<6E>es
$fill = false;
foreach($data as $row)
{
$this->Cell($w[0],6,$row[0],'LR',0,'L',$fill);
$this->Cell($w[1],6,$row[1],'LR',0,'L',$fill);
$this->Cell($w[2],6,number_format($row[2],0,',',' '),'LR',0,'R',$fill);
$this->Cell($w[3],6,number_format($row[3],0,',',' '),'LR',0,'R',$fill);
$this->Ln();
$fill = !$fill;
}
// Trait de terminaison
$this->Cell(array_sum($w),0,'','T');
}
}
$pdf = new PDF();
// Titres des colonnes
$header = array('Pays', 'Capitale', 'Superficie (km<6B>)', 'Pop. (milliers)');
// Chargement des donn<6E>es
$data = $pdf->LoadData('pays.txt');
$pdf->SetFont('Arial','',14);
$pdf->AddPage();
$pdf->BasicTable($header,$data);
$pdf->AddPage();
$pdf->ImprovedTable($header,$data);
$pdf->AddPage();
$pdf->FancyTable($header,$data);
$pdf->Output();
?>

158
fpdf/tutorial/tuto6.htm Normal file
View File

@ -0,0 +1,158 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Liens et texte en mode flot</title>
<link type="text/css" rel="stylesheet" href="../fpdf.css">
</head>
<body>
<h1>Liens et texte en mode flot</h1>
Ce tutoriel explique comment ins<6E>rer des liens (internes et externes) et montre un nouveau mode
d'<27>criture du texte. Il contient <20>galement un interpr<70>teur HTML rudimentaire.
<div class="source">
<pre><code>&lt;?php
<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
class </span>PDF <span class="kw">extends </span>FPDF
<span class="kw">{
protected </span>$B <span class="kw">= </span>0<span class="kw">;
protected </span>$I <span class="kw">= </span>0<span class="kw">;
protected </span>$U <span class="kw">= </span>0<span class="kw">;
protected </span>$HREF <span class="kw">= </span><span class="str">''</span><span class="kw">;
function </span>WriteHTML<span class="kw">(</span>$html<span class="kw">)
{
</span><span class="cmt">// Parseur HTML
</span>$html <span class="kw">= </span>str_replace<span class="kw">(</span><span class="str">"\n"</span><span class="kw">,</span><span class="str">' '</span><span class="kw">,</span>$html<span class="kw">);
</span>$a <span class="kw">= </span>preg_split<span class="kw">(</span><span class="str">'/&lt;(.*)&gt;/U'</span><span class="kw">,</span>$html<span class="kw">,-</span>1<span class="kw">,</span>PREG_SPLIT_DELIM_CAPTURE<span class="kw">);
foreach(</span>$a <span class="kw">as </span>$i<span class="kw">=&gt;</span>$e<span class="kw">)
{
if(</span>$i<span class="kw">%</span>2<span class="kw">==</span>0<span class="kw">)
{
</span><span class="cmt">// Texte
</span><span class="kw">if(</span>$<span class="kw">this-&gt;</span>HREF<span class="kw">)
</span>$<span class="kw">this-&gt;</span>PutLink<span class="kw">(</span>$<span class="kw">this-&gt;</span>HREF<span class="kw">,</span>$e<span class="kw">);
else
</span>$<span class="kw">this-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span>$e<span class="kw">);
}
else
{
</span><span class="cmt">// Balise
</span><span class="kw">if(</span>$e<span class="kw">[</span>0<span class="kw">]==</span><span class="str">'/'</span><span class="kw">)
</span>$<span class="kw">this-&gt;</span>CloseTag<span class="kw">(</span>strtoupper<span class="kw">(</span>substr<span class="kw">(</span>$e<span class="kw">,</span>1<span class="kw">)));
else
{
</span><span class="cmt">// Extraction des attributs
</span>$a2 <span class="kw">= </span>explode<span class="kw">(</span><span class="str">' '</span><span class="kw">,</span>$e<span class="kw">);
</span>$tag <span class="kw">= </span>strtoupper<span class="kw">(</span>array_shift<span class="kw">(</span>$a2<span class="kw">));
</span>$attr <span class="kw">= array();
foreach(</span>$a2 <span class="kw">as </span>$v<span class="kw">)
{
if(</span>preg_match<span class="kw">(</span><span class="str">'/([^=]*)=["\']?([^"\']*)/'</span><span class="kw">,</span>$v<span class="kw">,</span>$a3<span class="kw">))
</span>$attr<span class="kw">[</span>strtoupper<span class="kw">(</span>$a3<span class="kw">[</span>1<span class="kw">])] = </span>$a3<span class="kw">[</span>2<span class="kw">];
}
</span>$<span class="kw">this-&gt;</span>OpenTag<span class="kw">(</span>$tag<span class="kw">,</span>$attr<span class="kw">);
}
}
}
}
function </span>OpenTag<span class="kw">(</span>$tag<span class="kw">, </span>$attr<span class="kw">)
{
</span><span class="cmt">// Balise ouvrante
</span><span class="kw">if(</span>$tag<span class="kw">==</span><span class="str">'B' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'I' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'U'</span><span class="kw">)
</span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span>$tag<span class="kw">,</span>true<span class="kw">);
if(</span>$tag<span class="kw">==</span><span class="str">'A'</span><span class="kw">)
</span>$<span class="kw">this-&gt;</span>HREF <span class="kw">= </span>$attr<span class="kw">[</span><span class="str">'HREF'</span><span class="kw">];
if(</span>$tag<span class="kw">==</span><span class="str">'BR'</span><span class="kw">)
</span>$<span class="kw">this-&gt;</span>Ln<span class="kw">(</span>5<span class="kw">);
}
function </span>CloseTag<span class="kw">(</span>$tag<span class="kw">)
{
</span><span class="cmt">// Balise fermante
</span><span class="kw">if(</span>$tag<span class="kw">==</span><span class="str">'B' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'I' </span><span class="kw">|| </span>$tag<span class="kw">==</span><span class="str">'U'</span><span class="kw">)
</span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span>$tag<span class="kw">,</span>false<span class="kw">);
if(</span>$tag<span class="kw">==</span><span class="str">'A'</span><span class="kw">)
</span>$<span class="kw">this-&gt;</span>HREF <span class="kw">= </span><span class="str">''</span><span class="kw">;
}
function </span>SetStyle<span class="kw">(</span>$tag<span class="kw">, </span>$enable<span class="kw">)
{
</span><span class="cmt">// Modifie le style et s<>lectionne la police correspondante
</span>$<span class="kw">this-&gt;</span>$tag <span class="kw">+= (</span>$enable <span class="kw">? </span>1 <span class="kw">: -</span>1<span class="kw">);
</span>$style <span class="kw">= </span><span class="str">''</span><span class="kw">;
foreach(array(</span><span class="str">'B'</span><span class="kw">, </span><span class="str">'I'</span><span class="kw">, </span><span class="str">'U'</span><span class="kw">) as </span>$s<span class="kw">)
{
if(</span>$<span class="kw">this-&gt;</span>$s<span class="kw">&gt;</span>0<span class="kw">)
</span>$style <span class="kw">.= </span>$s<span class="kw">;
}
</span>$<span class="kw">this-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span>$style<span class="kw">);
}
function </span>PutLink<span class="kw">(</span>$URL<span class="kw">, </span>$txt<span class="kw">)
{
</span><span class="cmt">// Place un hyperlien
</span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>0<span class="kw">,</span>0<span class="kw">,</span>255<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span><span class="str">'U'</span><span class="kw">,</span>true<span class="kw">);
</span>$<span class="kw">this-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span>$txt<span class="kw">,</span>$URL<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetStyle<span class="kw">(</span><span class="str">'U'</span><span class="kw">,</span>false<span class="kw">);
</span>$<span class="kw">this-&gt;</span>SetTextColor<span class="kw">(</span>0<span class="kw">);
}
}
</span>$html <span class="kw">= </span><span class="str">'Vous pouvez maintenant imprimer facilement du texte m<>langeant diff<66>rents styles : &lt;b&gt;gras&lt;/b&gt;,
&lt;i&gt;italique&lt;/i&gt;, &lt;u&gt;soulign<EFBFBD>&lt;/u&gt;, ou &lt;b&gt;&lt;i&gt;&lt;u&gt;tous <20> la fois&lt;/u&gt;&lt;/i&gt;&lt;/b&gt; !&lt;br&gt;&lt;br&gt;Vous pouvez aussi
ins<EFBFBD>rer des liens sous forme textuelle, comme &lt;a href="http://www.fpdf.org"&gt;www.fpdf.org&lt;/a&gt;, ou bien
sous forme d\'image : cliquez sur le logo.'</span><span class="kw">;
</span>$pdf <span class="kw">= new </span>PDF<span class="kw">();
</span><span class="cmt">// Premi<6D>re page
</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Arial'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>20<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span><span class="str">'Pour d<>couvrir les nouveaut<75>s de ce tutoriel, cliquez '</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">,</span><span class="str">'U'</span><span class="kw">);
</span>$link <span class="kw">= </span>$pdf<span class="kw">-&gt;</span>AddLink<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>Write<span class="kw">(</span>5<span class="kw">,</span><span class="str">'ici'</span><span class="kw">,</span>$link<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">''</span><span class="kw">);
</span><span class="cmt">// Seconde page
</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>SetLink<span class="kw">(</span>$link<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Image<span class="kw">(</span><span class="str">'logo.png'</span><span class="kw">,</span>10<span class="kw">,</span>12<span class="kw">,</span>30<span class="kw">,</span>0<span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'http://www.fpdf.org'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>SetLeftMargin<span class="kw">(</span>45<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>SetFontSize<span class="kw">(</span>14<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>WriteHTML<span class="kw">(</span>$html<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
</span>?&gt;</code></pre>
</div>
<p class='demo'><a href='tuto6.php' target='_blank' class='demo'>[D<>mo]</a></p>
La nouvelle m<>thode pour imprimer du texte est <a href='../doc/write.htm'>Write()</a>. Elle est tr<74>s proche de <a href='../doc/multicell.htm'>MultiCell()</a> ;
les diff<66>rences sont les suivantes :
<ul>
<li>La fin de ligne est au niveau de la marge droite et la ligne suivante commence <20> la marge gauche</li>
<li>La position courante se d<>place juste <20> la fin du texte</li>
</ul>
Elle permet donc d'<27>crire une portion de texte, de modifier la police, puis de reprendre <20> partir
de l'endroit o<> on <20>tait rest<73>. Par contre on ne peut plus justifier.
<br>
<br>
La m<>thode est utilis<69>e sur la premi<6D>re page pour mettre un lien pointant sur la seconde. Le
d<EFBFBD>but de la phrase est <20>crit en style normal, puis on passe en soulign<67> pour terminer. Le lien
est cr<63><72> gr<67>ce <20> la m<>thode <a href='../doc/addlink.htm'>AddLink()</a>, qui renvoie l'identifiant du lien. Cet identifiant
est pass<73> en troisi<73>me param<61>tre <20> <span style="white-space:nowrap">Write()</span>. Apr<70>s avoir
cr<EFBFBD><EFBFBD> la seconde page, on utilise <a href='../doc/setlink.htm'>SetLink()</a> pour faire pointer le lien sur le d<>but de la
page courante.
<br>
<br>
On place ensuite une image avec un lien externe dessus. Un lien externe est simplement une URL.
Elle est transmise en dernier param<61>tre de <a href='../doc/image.htm'>Image()</a>.
<br>
<br>
Enfin, la marge gauche est d<>plac<61>e apr<70>s l'image gr<67>ce <20> <a href='../doc/setleftmargin.htm'>SetLeftMargin()</a> et du texte au
format HTML est imprim<69>. Un parseur HTML tr<74>s simple est utilis<69> pour cela, bas<61> sur les
expressions r<>guli<6C>res. Les balises reconnues sont &lt;b&gt;, &lt;i&gt;, &lt;u&gt;, &lt;a&gt;
et &lt;br&gt; ; les autres sont ignor<6F>es. Le parseur utilise lui aussi la m<>thode Write(). Le lien externe se pose de la
m<EFBFBD>me fa<66>on que l'interne (troisi<73>me param<61>tre de Write()). A noter que <a href='../doc/cell.htm'>Cell()</a> permet
<EFBFBD>galement de poser des liens.
</body>
</html>

114
fpdf/tutorial/tuto6.php Normal file
View File

@ -0,0 +1,114 @@
<?php
require('../fpdf.php');
class PDF extends FPDF
{
protected $B = 0;
protected $I = 0;
protected $U = 0;
protected $HREF = '';
function WriteHTML($html)
{
// Parseur HTML
$html = str_replace("\n",' ',$html);
$a = preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
foreach($a as $i=>$e)
{
if($i%2==0)
{
// Texte
if($this->HREF)
$this->PutLink($this->HREF,$e);
else
$this->Write(5,$e);
}
else
{
// Balise
if($e[0]=='/')
$this->CloseTag(strtoupper(substr($e,1)));
else
{
// Extraction des attributs
$a2 = explode(' ',$e);
$tag = strtoupper(array_shift($a2));
$attr = array();
foreach($a2 as $v)
{
if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
$attr[strtoupper($a3[1])] = $a3[2];
}
$this->OpenTag($tag,$attr);
}
}
}
}
function OpenTag($tag, $attr)
{
// Balise ouvrante
if($tag=='B' || $tag=='I' || $tag=='U')
$this->SetStyle($tag,true);
if($tag=='A')
$this->HREF = $attr['HREF'];
if($tag=='BR')
$this->Ln(5);
}
function CloseTag($tag)
{
// Balise fermante
if($tag=='B' || $tag=='I' || $tag=='U')
$this->SetStyle($tag,false);
if($tag=='A')
$this->HREF = '';
}
function SetStyle($tag, $enable)
{
// Modifie le style et s<>lectionne la police correspondante
$this->$tag += ($enable ? 1 : -1);
$style = '';
foreach(array('B', 'I', 'U') as $s)
{
if($this->$s>0)
$style .= $s;
}
$this->SetFont('',$style);
}
function PutLink($URL, $txt)
{
// Place un hyperlien
$this->SetTextColor(0,0,255);
$this->SetStyle('U',true);
$this->Write(5,$txt,$URL);
$this->SetStyle('U',false);
$this->SetTextColor(0);
}
}
$html = 'Vous pouvez maintenant imprimer facilement du texte m<>langeant diff<66>rents styles : <b>gras</b>,
<i>italique</i>, <u>soulign<67></u>, ou <b><i><u>tous <20> la fois</u></i></b> !<br><br>Vous pouvez aussi
ins<EFBFBD>rer des liens sous forme textuelle, comme <a href="http://www.fpdf.org">www.fpdf.org</a>, ou bien
sous forme d\'image : cliquez sur le logo.';
$pdf = new PDF();
// Premi<6D>re page
$pdf->AddPage();
$pdf->SetFont('Arial','',20);
$pdf->Write(5,'Pour d<>couvrir les nouveaut<75>s de ce tutoriel, cliquez ');
$pdf->SetFont('','U');
$link = $pdf->AddLink();
$pdf->Write(5,'ici',$link);
$pdf->SetFont('');
// Seconde page
$pdf->AddPage();
$pdf->SetLink($link);
$pdf->Image('logo.png',10,12,30,0,'','http://www.fpdf.org');
$pdf->SetLeftMargin(45);
$pdf->SetFontSize(14);
$pdf->WriteHTML($html);
$pdf->Output();
?>

190
fpdf/tutorial/tuto7.htm Normal file
View File

@ -0,0 +1,190 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Ajout de polices et encodages</title>
<link type="text/css" rel="stylesheet" href="../fpdf.css">
</head>
<body>
<h1>Ajout de polices et encodages</h1>
Ce tutoriel explique comment ajouter des polices TrueType, OpenType et Type1 afin de ne plus se
limiter aux polices standards. L'autre int<6E>r<EFBFBD>t est que l'on peut <20>galement choisir l'encodage des
caract<EFBFBD>res afin d'utiliser d'autres langues (les polices standards ne supportant que l'encodage cp1252).
<br>
<br>
Pour l'OpenType, seul le format bas<61> sur le TrueType est support<72> (pas celui bas<61> sur le Type1).<br>
Pour les Type1, vous devez poss<73>der le fichier AFM correspondant (il est g<>n<EFBFBD>ralement fourni avec la police).
<br>
<br>
L'ajout d'une police se fait en deux <20>tapes :
<ul>
<li>G<EFBFBD>n<EFBFBD>ration du fichier de d<>finition de police</li>
<li>D<EFBFBD>claration de la police dans le script</li>
</ul>
<h2>G<EFBFBD>n<EFBFBD>ration du fichier de d<>finition de police</h2>
La premi<6D>re <20>tape consiste <20> g<>n<EFBFBD>rer un fichier PHP contenant toutes les informations dont FPDF a
besoin ; on en profite <20>galement pour compresser le fichier de police. Pour cela, un script est
fourni dans le r<>pertoire makefont de l'archive : makefont.php. Il contient la fonction suivante :
<br>
<br>
<code>MakeFont(<b>string</b> fontfile [, <b>string</b> enc [, <b>boolean</b> embed [, <b>boolean</b> subset]]])</code>
<dl class="param" style="margin-bottom:2em">
<dt><code>fontfile</code></dt>
<dd>
<p>Chemin du fichier .ttf, .otf ou .pfb.</p>
</dd>
<dt><code>enc</code></dt>
<dd>
<p>Nom de l'encodage <20> utiliser. Valeur par d<>faut : <code>cp1252</code>.</p>
</dd>
<dt><code>embed</code></dt>
<dd>
<p>Indique si la police doit <20>tre incorpor<6F>e ou non. Valeur par d<>faut : <code>true</code>.</p>
</dd>
<dt><code>subset</code></dt>
<dd>
<p>Indique si le subsetting doit <20>tre utilis<69>. Valeur par d<>faut : <code>true</code>.</p>
</dd>
</dl>
Le premier param<61>tre est le nom du fichier de police. L'extension doit <20>tre .ttf, .otf ou .pfb et d<>termine
le type de la police. Si votre police Type1 est au format ASCII (.pfa), vous pouvez la convertir en binaire
(.pfb) gr<67>ce <20> <a href="http://www.lcdf.org/~eddietwo/type/#t1utils" target="_blank">t1utils</a>.
<br>
<br>
Pour les polices Type1, le fichier .afm correspondant doit se trouver dans le m<>me r<>pertoire.
<br>
<br>
L'encodage d<>finit l'association entre un code (compris entre 0 et 255) et un caract<63>re. Les 128
premi<EFBFBD>res sont fixes et correspondent <20> l'ASCII ; les suivantes sont variables. Les encodages sont
stock<EFBFBD>s dans des fichiers .map. Ceux disponibles sont les suivants :
<ul>
<li>cp1250 (Europe Centrale)</li>
<li>cp1251 (cyrillique)</li>
<li>cp1252 (Europe de l'Ouest)</li>
<li>cp1253 (grec)</li>
<li>cp1254 (turc)</li>
<li>cp1255 (h<>breu)</li>
<li>cp1257 (pays baltes)</li>
<li>cp1258 (vietnamien)</li>
<li>cp874 (tha<68>landais)</li>
<li>ISO-8859-1 (Europe de l'Ouest)</li>
<li>ISO-8859-2 (Europe Centrale)</li>
<li>ISO-8859-4 (pays Baltes)</li>
<li>ISO-8859-5 (cyrillique)</li>
<li>ISO-8859-7 (grec)</li>
<li>ISO-8859-9 (turc)</li>
<li>ISO-8859-11 (tha<68>landais)</li>
<li>ISO-8859-15 (Europe de l'Ouest)</li>
<li>ISO-8859-16 (Europe Centrale)</li>
<li>KOI8-R (russe)</li>
<li>KOI8-U (ukrainien)</li>
</ul>
Il faut bien s<>r que la police contienne les caract<63>res correspondant <20> l'encodage choisi.
<br>
<br>
Le troisi<73>me param<61>tre indique si la police doit <20>tre incorpor<6F>e ou non. Lorsqu'une police
n'est pas incorpor<6F>e, elle est recherch<63>e dans le syst<73>me. L'avantage est que le fichier PDF est
plus l<>ger ; par contre, si elle n'est pas trouv<75>e, une police de substitution est utilis<69>e. Il
vaut donc mieux s'assurer que le syst<73>me qui lit le PDF a bien la police install<6C>e. Pour assurer
un rendu correct dans tous les cas, il est fortement recommand<6E> d'incorporer.
<br>
<br>
Le dernier param<61>tre indique si le subsetting doit <20>tre utilis<69>, c'est-<2D>-dire si seuls les
caract<EFBFBD>res de l'encodage sp<73>cifi<66> doivent <20>tre conserv<72>s dans la police incorpor<6F>e. Cela
permet de r<>duire de mani<6E>re importante la taille du fichier PDF, surtout si la police
d'origine <20>tait volumineuse.
<br>
<br>
Apr<EFBFBD>s avoir appel<65> la fonction (cr<63>ez pour cela un nouveau fichier et incluez makefont.php), un
fichier .php est cr<63><72>, avec le m<>me nom que celui du fichier de police. Vous pouvez le renommer si
vous le souhaitez. Dans le cas de l'incorporation, le fichier de police est compress<73> et donne un
second fichier avec comme extension .z (sauf si la fonction de compression n'est pas disponible,
elle n<>cessite Zlib). Vous pouvez <20>galement le renommer, mais dans ce cas vous devez modifier la
variable <code>$file</code> en cons<6E>quence dans le fichier .php.
<br>
<br>
Exemple :
<div class="source">
<pre><code>&lt;?php
<span class="kw">require(</span><span class="str">'makefont/makefont.php'</span><span class="kw">);
</span>MakeFont<span class="kw">(</span><span class="str">'C:\\Windows\\Fonts\\comic.ttf'</span><span class="kw">,</span><span class="str">'cp1252'</span><span class="kw">);
</span>?&gt;</code></pre>
</div>
Ce qui donne les fichiers comic.php et comic.z.
<br>
<br>
Vous devez ensuite copier les fichiers g<>n<EFBFBD>r<EFBFBD>s dans le r<>pertoire des polices. Si la police n'a
pas pu <20>tre compress<73>e, il faut la copier directement <20> la place de la version compress<73>e.
<br>
<br>
Il est <20>galement possible d'appeler MakeFont() via la ligne de commande :
<br>
<br>
<kbd>php makefont\makefont.php C:\Windows\Fonts\comic.ttf cp1252</kbd>
<br>
<br>
Enfin, pour les polices TrueType et OpenType, il est possible de g<>n<EFBFBD>rer les fichiers
<a href="http://www.fpdf.org/makefont/">en ligne</a> au lieu de le faire manuellement.
<h2>D<EFBFBD>claration de la police dans le script</h2>
La seconde <20>tape est la plus simple. Il suffit d'appeler la m<>thode <a href='../doc/addfont.htm'>AddFont()</a> :
<div class="source">
<pre><code>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Comic'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'comic.php'</span><span class="kw">);
</span></code></pre>
</div>
Et la police est maintenant disponible (dans le style normal et soulign<67>), utilisable comme les
autres. Si on avait trait<69> le Comic Sans MS Gras (comicbd.ttf), on aurait mis :
<div class="source">
<pre><code>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Comic'</span><span class="kw">,</span><span class="str">'B'</span><span class="kw">,</span><span class="str">'comicbd.php'</span><span class="kw">);
</span></code></pre>
</div>
<h2>Exemple</h2>
Voyons maintenant un exemple complet. La police utilis<69>e est <a href="http://www.abstractfonts.com/font/52" target="_blank">Calligrapher</a>.
La premi<6D>re <20>tape consiste <20> g<>n<EFBFBD>rer les fichiers :
<div class="source">
<pre><code>&lt;?php
<span class="kw">require(</span><span class="str">'makefont/makefont.php'</span><span class="kw">);
</span>MakeFont<span class="kw">(</span><span class="str">'calligra.ttf'</span><span class="kw">,</span><span class="str">'cp1252'</span><span class="kw">);
</span>?&gt;</code></pre>
</div>
L'ex<65>cution du script donne le compte-rendu suivant :
<br>
<br>
<b>Warning:</b> character Euro is missing<br>
<b>Warning:</b> character zcaron is missing<br>
Font file compressed: calligra.z<br>
Font definition file generated: calligra.php<br>
<br>
Le caract<63>re euro n'est pas pr<70>sent dans la police (elle est trop ancienne). Un autre caract<63>re manque <20>galement.
<br>
<br>
Nous aurions <20>galement pu utiliser la ligne de commande :
<br>
<br>
<kbd>php makefont\makefont.php calligra.ttf cp1252</kbd>
<br>
<br>
ou bien le g<>n<EFBFBD>rateur en ligne.
<br>
<br>
Nous pouvons maintenant copier les deux fichiers g<>n<EFBFBD>r<EFBFBD>s dans le r<>pertoire des polices (font) et <20>crire
le script :
<div class="source">
<pre><code>&lt;?php
<span class="kw">require(</span><span class="str">'fpdf.php'</span><span class="kw">);
</span>$pdf <span class="kw">= new </span>FPDF<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>AddFont<span class="kw">(</span><span class="str">'Calligrapher'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span><span class="str">'calligra.php'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>AddPage<span class="kw">();
</span>$pdf<span class="kw">-&gt;</span>SetFont<span class="kw">(</span><span class="str">'Calligrapher'</span><span class="kw">,</span><span class="str">''</span><span class="kw">,</span>35<span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Write<span class="kw">(</span>10<span class="kw">,</span><span class="str">'Changez de police avec FPDF !'</span><span class="kw">);
</span>$pdf<span class="kw">-&gt;</span>Output<span class="kw">();
</span>?&gt;</code></pre>
</div>
<p class='demo'><a href='tuto7.php' target='_blank' class='demo'>[D<>mo]</a></p>
</body>
</html>

11
fpdf/tutorial/tuto7.php Normal file
View File

@ -0,0 +1,11 @@
<?php
define('FPDF_FONTPATH','.');
require('../fpdf.php');
$pdf = new FPDF();
$pdf->AddFont('Calligrapher','','calligra.php');
$pdf->AddPage();
$pdf->SetFont('Calligrapher','',35);
$pdf->Cell(0,10,'Changez de police avec FPDF !');
$pdf->Output();
?>