Changeset 99921 in spip-zone for _plugins_/fpdf


Ignore:
Timestamp:
Oct 13, 2016, 8:42:49 AM (3 years ago)
Author:
pierrekuhn82@…
Message:

[fpdf] version 1.1.0 : Mise àjour de la librairie en 1.8.1 et des tutos.

Location:
_plugins_/fpdf
Files:
3 added
1 deleted
75 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/fpdf/FAQ.htm

    r55911 r99921  
    1414<h1>FAQ</h1>
    1515<ul>
    16 <li><b>1.</b> <a href='#q1'>Quelle est exactement la licence de FPDF ? Y a-t-il des restrictions d'utilisation ?</a></li>
    17 <li><b>2.</b> <a href='#q2'>Lorsque j'essaie de créer un PDF, plein de caractères bizarres s'affichent à l'écran.</a></li>
    18 <li><b>3.</b> <a href='#q3'>J'essaie de générer un PDF et IE m'affiche une page blanche. Que se passe-t-il ?</a></li>
    19 <li><b>4.</b> <a href='#q4'>Je n'arrive pas à faire de retour à la ligne. J'ai bien mis \n dans la chaîne imprimée par MultiCell mais ça ne marche pas.</a></li>
    20 <li><b>5.</b> <a href='#q5'>J'essaie d'afficher une variable dans la méthode Header mais rien ne s'imprime.</a></li>
    21 <li><b>6.</b> <a href='#q6'>J'ai défini les méthodes Header et Footer dans ma classe PDF mais rien ne s'affiche.</a></li>
    22 <li><b>7.</b> <a href='#q7'>Les caractères accentués sont remplacés par des caractères bizarres, par exemple é.</a></li>
    23 <li><b>8.</b> <a href='#q8'>J'essaie de mettre le caractère euro mais je n'y arrive pas.</a></li>
    24 <li><b>9.</b> <a href='#q9'>J'ai l'erreur suivante quand j'essaie de générer un PDF : Some data has already been output, can't send PDF file</a></li>
    25 <li><b>10.</b> <a href='#q10'>Je dessine un cadre avec des dimensions très précises, mais à l'impression je constate des écarts.</a></li>
    26 <li><b>11.</b> <a href='#q11'>Je voudrais utiliser toute la surface de la page mais à l'impression j'ai toujours des marges. Comment les enlever ?</a></li>
    27 <li><b>12.</b> <a href='#q12'>Comment mettre un fond à mon PDF ?</a></li>
    28 <li><b>13.</b> <a href='#q13'>Comment mettre un en-tête ou un pied spécifique à la première page ?</a></li>
    29 <li><b>14.</b> <a href='#q14'>J'aimerais utiliser des extensions fournies par différents scripts. Comment les combiner ?</a></li>
    30 <li><b>15.</b> <a href='#q15'>Comment envoyer le PDF par mail ?</a></li>
    31 <li><b>16.</b> <a href='#q16'>Quelle est la taille limite des fichiers que je peux générer avec FPDF ?</a></li>
    32 <li><b>17.</b> <a href='#q17'>Est-ce que je peux modifier un PDF avec FPDF ?</a></li>
    33 <li><b>18.</b> <a href='#q18'>Je voudrais faire un moteur de recherche en PHP et indexer des PDF. Est-ce que je peux le faire avec FPDF ?</a></li>
    34 <li><b>19.</b> <a href='#q19'>Est-ce que je peux transformer une page HTML en PDF avec FPDF ?</a></li>
    35 <li><b>20.</b> <a href='#q20'>Est-ce que je peux concaténer des PDF avec FPDF ?</a></li>
     16<li><b>1.</b> <a href='#q1'>What's exactly the license of FPDF? Are there any usage restrictions?</a></li>
     17<li><b>2.</b> <a href='#q2'>I get the following error when I try to generate a PDF: Some data has already been output, can't send PDF file</a></li>
     18<li><b>3.</b> <a href='#q3'>Accented letters are replaced with some strange characters like é.</a></li>
     19<li><b>4.</b> <a href='#q4'>I try to display the Euro symbol but it doesn't work.</a></li>
     20<li><b>5.</b> <a href='#q5'>I try to display a variable in the Header method but nothing prints.</a></li>
     21<li><b>6.</b> <a href='#q6'>I have defined the Header and Footer methods in my PDF class but nothing shows.</a></li>
     22<li><b>7.</b> <a href='#q7'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</a></li>
     23<li><b>8.</b> <a href='#q8'>I use jQuery to generate the PDF but it doesn't show.</a></li>
     24<li><b>9.</b> <a href='#q9'>I draw a frame with very precise dimensions, but when printed I notice some differences.</a></li>
     25<li><b>10.</b> <a href='#q10'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</a></li>
     26<li><b>11.</b> <a href='#q11'>How can I put a background in my PDF?</a></li>
     27<li><b>12.</b> <a href='#q12'>How can I set a specific header or footer on the first page?</a></li>
     28<li><b>13.</b> <a href='#q13'>I'd like to use extensions provided by different scripts. How can I combine them?</a></li>
     29<li><b>14.</b> <a href='#q14'>How can I open the PDF in a new tab?</a></li>
     30<li><b>15.</b> <a href='#q15'>How can I send the PDF by email?</a></li>
     31<li><b>16.</b> <a href='#q16'>What's the limit of the file sizes I can generate with FPDF?</a></li>
     32<li><b>17.</b> <a href='#q17'>Can I modify a PDF with FPDF?</a></li>
     33<li><b>18.</b> <a href='#q18'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</a></li>
     34<li><b>19.</b> <a href='#q19'>Can I convert an HTML page to PDF with FPDF?</a></li>
     35<li><b>20.</b> <a href='#q20'>Can I concatenate PDF files with FPDF?</a></li>
    3636</ul>
    3737
    3838<ul id='answers'>
    3939<li id='q1'>
    40 <p><b>1.</b> <span class='question'>Quelle est exactement la licence de FPDF ? Y a-t-il des restrictions d'utilisation ?</span></p>
    41 La licence de FPDF est permissive : il n'y a pas de restriction d'usage. Vous pouvez l'incorporer
    42 librement dans votre application (commerciale ou non), avec ou sans modification.
     40<p><b>1.</b> <span class='question'>What's exactly the license of FPDF? Are there any usage restrictions?</span></p>
     41FPDF is released under a permissive license: there is no usage restriction. You may embed it
     42freely in your application (commercial or not), with or without modifications.
    4343</li>
    4444
    4545<li id='q2'>
    46 <p><b>2.</b> <span class='question'>Lorsque j'essaie de créer un PDF, plein de caractères bizarres s'affichent à l'écran.</span></p>
    47 Ces caractères "bizarres" sont en fait le contenu réel du PDF. Ce comportement est un bug d'IE6.
    48 Lorsqu'il reçoit d'abord une page HTML, puis un PDF à partir de la même URL, il l'affiche
    49 directement sans lancer le plug-in Acrobat. Cela arrive fréquemment en cours de développement :
    50 à la moindre erreur de script, une page HTML est envoyée, et après correction, le PDF arrive.
    51 <br>
    52 Pour résoudre le problème, il suffit de fermer IE et de le relancer. On peut aussi aller sur
    53 une autre URL et revenir.
    54 <br>
    55 Pour éviter ce genre de désagrément durant le développement, on peut générer le PDF directement
    56 dans un fichier et l'ouvrir via l'explorateur.
     46<p><b>2.</b> <span class='question'>I get the following error when I try to generate a PDF: Some data has already been output, can't send PDF file</span></p>
     47You must send nothing to the browser except the PDF itself: no HTML, no space, no carriage return. A common
     48case is having extra blank at the end of an included script file.<br>
     49If you can't figure out where the problem comes from, this other message appearing just before can help you:<br>
     50<br>
     51<b>Warning:</b> Cannot modify header information - headers already sent by (output started at script.php:X)<br>
     52<br>
     53It means that script.php outputs something at line X. Go to this line and fix it.
     54In case the message doesn't show, first check that you didn't disable warnings, then add this at the very
     55beginning of your script:
     56<div class="doc-source">
     57<pre><code>ob_end_clean();</code></pre>
     58</div>
     59If you still don't see it, disable zlib.output_compression in your php.ini and it should appear.
    5760</li>
    5861
    5962<li id='q3'>
    60 <p><b>3.</b> <span class='question'>J'essaie de générer un PDF et IE m'affiche une page blanche. Que se passe-t-il ?</span></p>
    61 Tout d'abord, vérifiez que vous n'envoyez rien au navigateur après le PDF (même pas un espace
    62 ou un retour-chariot). Vous pouvez mettre un exit juste après l'appel à la méthode Output()
    63 pour en être sûr. Si ce n'est pas ça, c'est que vous êtes victime du syndrome de la "page blanche".
    64 IE utilisé en conjonction avec le plug-in Acrobat souffre de nombreux bugs. Pour éviter ces problèmes
    65 de manière fiable, il existe deux principales techniques :
    66 <br>
    67 <br>
    68 - Désactiver le plug-in et utiliser Acrobat comme application externe. Pour cela, lancez Acrobat, allez
    69 dans le menu Edition, Préférences, Internet, puis désactivez l'option "Afficher dans le navigateur".
    70 Puis, lorsque vous récupérez un PDF dans IE, ce dernier affiche la boîte "Ouvrir ce fichier" ou
    71 "Enregistrer ce fichier". Décochez la case "Toujours demander avant d'ouvrir ce type de fichier"
    72 et choisissez Ouvrir. Dorénavant les PDF s'ouvriront automatiquement dans une fenêtre Acrobat
    73 indépendante.
    74 <br>
    75 L'inconvénient de la méthode est qu'il faut toucher à la configuration du poste client, ce
    76 qu'on peut faire en intranet mais pas pour Internet.
    77 <br>
    78 <br>
    79 - Utiliser une technique de redirection. Le principe consiste à générer le PDF dans un fichier
    80 temporaire sur le serveur et à rediriger le client dessus. Par exemple, à la fin du script, on
    81 peut mettre :
    82 <div class="doc-source">
    83 <pre><code>//Détermination d'un nom de fichier temporaire dans le répertoire courant
    84 $file = basename(tempnam('.', 'tmp'));
    85 rename($file, $file.'.pdf');
    86 $file .= '.pdf';
    87 //Sauvegarde du PDF dans le fichier
    88 $pdf-&gt;Output($file, 'F');
    89 //Redirection
    90 header('Location: '.$file);</code></pre>
    91 </div>
    92 Cette méthode transforme un PDF dynamique en PDF statique et évite ainsi les ennuis.
    93 Par contre il faut prévoir une procédure de nettoyage pour effacer les fichiers temporaires.
    94 Par exemple :
    95 <div class="doc-source">
    96 <pre><code>function CleanFiles($dir)
    97 {
    98     //Efface les fichiers temporaires
    99     $t = time();
    100     $h = opendir($dir);
    101     while($file=readdir($h))
    102     {
    103         if(substr($file,0,3)=='tmp' &amp;&amp; substr($file,-4)=='.pdf')
    104         {
    105             $path = $dir.'/'.$file;
    106             if($t-filemtime($path)&gt;3600)
    107                 @unlink($path);
    108         }
    109     }
    110     closedir($h);
    111 }</code></pre>
    112 </div>
    113 Cette fonction efface tous les fichiers de la forme tmp*.pdf dans le répertoire spécifié qui
    114 datent de plus d'une heure. Vous pouvez l'appeler où vous voulez, par exemple dans le script
    115 qui génère le PDF.
     63<p><b>3.</b> <span class='question'>Accented letters are replaced with some strange characters like é.</span></p>
     64Don't use UTF-8 with the standard fonts; they expect text encoded in ISO-8859-1 or windows-1252.
     65You can use utf8_decode() to perform a conversion to ISO-8859-1:
     66<div class="doc-source">
     67<pre><code>$str = utf8_decode($str);</code></pre>
     68</div>
     69But some characters such as Euro won't be translated correctly. If the iconv extension is available, the
     70right way to do it is the following:
     71<div class="doc-source">
     72<pre><code>$str = iconv('UTF-8', 'windows-1252', $str);</code></pre>
     73</div>
     74In case you need characters outside windows-1252, take a look at tutorial #7 or
     75<a href="http://www.fpdf.org/?go=script&amp;id=92" target="_blank">tFPDF</a>.
    11676</li>
    11777
    11878<li id='q4'>
    119 <p><b>4.</b> <span class='question'>Je n'arrive pas à faire de retour à la ligne. J'ai bien mis \n dans la chaîne imprimée par MultiCell mais ça ne marche pas.</span></p>
    120 Il faut mettre la chaîne entre guillemets et non pas entre apostrophes.
     79<p><b>4.</b> <span class='question'>I try to display the Euro symbol but it doesn't work.</span></p>
     80The standard fonts have the Euro character at position 128. You can define a constant like this
     81for convenience:
     82<div class="doc-source">
     83<pre><code>define('EURO', chr(128));</code></pre>
     84</div>
    12185</li>
    12286
    12387<li id='q5'>
    124 <p><b>5.</b> <span class='question'>J'essaie d'afficher une variable dans la méthode Header mais rien ne s'imprime.</span></p>
    125 Il faut utiliser le mot-clé <code>global</code> pour accéder aux variables globales, par exemple :
     88<p><b>5.</b> <span class='question'>I try to display a variable in the Header method but nothing prints.</span></p>
     89You have to use the <code>global</code> keyword to access global variables, for example:
    12690<div class="doc-source">
    12791<pre><code>function Header()
    12892{
    129     global $titre;
     93    global $title;
    13094
    13195    $this-&gt;SetFont('Arial', 'B', 15);
    132     $this-&gt;Cell(0, 10, $titre, 1, 1, 'C');
     96    $this-&gt;Cell(0, 10, $title, 1, 1, 'C');
    13397}
    13498
    135 $titre = 'Mon titre';</code></pre>
    136 </div>
    137 Il est également possible de passer par une propriété de l'objet :
     99$title = 'My title';</code></pre>
     100</div>
     101Alternatively, you can use an object property:
    138102<div class="doc-source">
    139103<pre><code>function Header()
    140104{
    141105    $this-&gt;SetFont('Arial', 'B', 15);
    142     $this-&gt;Cell(0, 10, $this-&gt;titre, 1, 1, 'C');
     106    $this-&gt;Cell(0, 10, $this-&gt;title, 1, 1, 'C');
    143107}
    144108
    145 $pdf-&gt;titre = 'Mon titre';</code></pre>
     109$pdf-&gt;title = 'My title';</code></pre>
    146110</div>
    147111</li>
    148112
    149113<li id='q6'>
    150 <p><b>6.</b> <span class='question'>J'ai défini les méthodes Header et Footer dans ma classe PDF mais rien ne s'affiche.</span></p>
    151 Il faut créer un objet de la classe PDF et non pas FPDF :
     114<p><b>6.</b> <span class='question'>I have defined the Header and Footer methods in my PDF class but nothing shows.</span></p>
     115You have to create an object from the PDF class, not FPDF:
    152116<div class="doc-source">
    153117<pre><code>$pdf = new PDF();</code></pre>
     
    156120
    157121<li id='q7'>
    158 <p><b>7.</b> <span class='question'>Les caractères accentués sont remplacés par des caractères bizarres, par exemple é.</span></p>
    159 Il ne faut pas utiliser l'encodage UTF-8. Les polices standard de FPDF utilisent l'ISO-8859-1 ou Windows-1252.
    160 On peut effectuer une conversion en ISO-8859-1 grâce à utf8_decode() :
    161 <div class="doc-source">
    162 <pre><code>$str = utf8_decode($str);</code></pre>
    163 </div>
    164 Mais certains caractères comme l'euro ne seront pas correctement traduits. Si vous disposez de l'extension
    165 iconv, la bonne manière de faire est la suivante :
    166 <div class="doc-source">
    167 <pre><code>$str = iconv('UTF-8', 'windows-1252', $str);</code></pre>
    168 </div>
     122<p><b>7.</b> <span class='question'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</span></p>
     123You have to enclose your string with double quotes, not single ones.
    169124</li>
    170125
    171126<li id='q8'>
    172 <p><b>8.</b> <span class='question'>J'essaie de mettre le caractère euro mais je n'y arrive pas.</span></p>
    173 Pour les polices standard, le caractère euro a pour code 128. Vous pouvez par commodité définir
    174 une constante comme suit :
    175 <div class="doc-source">
    176 <pre><code>define('EURO', chr(128));</code></pre>
    177 </div>
     127<p><b>8.</b> <span class='question'>I use jQuery to generate the PDF but it doesn't show.</span></p>
     128Don't use an AJAX request to retrieve the PDF.
    178129</li>
    179130
    180131<li id='q9'>
    181 <p><b>9.</b> <span class='question'>J'ai l'erreur suivante quand j'essaie de générer un PDF : Some data has already been output, can't send PDF file</span></p>
    182 Il ne faut rien envoyer d'autre au navigateur que le PDF lui-même : pas d'HTML, pas d'espace, pas de
    183 retour-chariot. Un cas fréquent est d'avoir des lignes vides à la fin d'un fichier inclus.<br>
    184 Si vous ne trouvez pas l'origine du problème, cet autre message apparaissant juste avant peut vous aider :<br>
    185 <br>
    186 <b>Warning:</b> Cannot modify header information - headers already sent by (output started at script.php:X)<br>
    187 <br>
    188 Cela signifie que script.php envoie quelque chose à la ligne X. Allez à cette ligne et corrigez-là.
    189 Si le message n'apparaît pas, vérifiez d'abord que vous n'avez pas désactivé l'affichage des erreurs,
    190 puis ajoutez cette ligne au tout début du script :
    191 <div class="doc-source">
    192 <pre><code>ob_end_clean();</code></pre>
    193 </div>
    194 S'il n'apparaît toujours pas, désactivez l'option zlib.output_compression dans votre php.ini.
     132<p><b>9.</b> <span class='question'>I draw a frame with very precise dimensions, but when printed I notice some differences.</span></p>
     133To respect dimensions, select "None" for the Page Scaling setting instead of "Shrink to Printable Area" in the print dialog box.
    195134</li>
    196135
    197136<li id='q10'>
    198 <p><b>10.</b> <span class='question'>Je dessine un cadre avec des dimensions très précises, mais à l'impression je constate des écarts.</span></p>
    199 Pour respecter les dimensions, il faut sélectionner "Aucune" au lieu de "Réduire à la zone d'impression"
    200 dans la boîte de dialogue d'impression.
     137<p><b>10.</b> <span class='question'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</span></p>
     138Printers have physical margins (different depending on the models); it is therefore impossible to remove
     139them and print on the whole surface of the paper.
    201140</li>
    202141
    203142<li id='q11'>
    204 <p><b>11.</b> <span class='question'>Je voudrais utiliser toute la surface de la page mais à l'impression j'ai toujours des marges. Comment les enlever ?</span></p>
    205 Les imprimantes ont des marges physiques (variables en fonction du modèle), il est donc impossible de les
    206 supprimer et d'imprimer sur la totalité de la page.
     143<p><b>11.</b> <span class='question'>How can I put a background in my PDF?</span></p>
     144For a picture, call Image() in the Header() method, before any other output. To set a background color, use Rect().
    207145</li>
    208146
    209147<li id='q12'>
    210 <p><b>12.</b> <span class='question'>Comment mettre un fond à mon PDF ?</span></p>
    211 Pour une image, appelez Image() dans la méthode Header(), avant toute autre écriture. Pour mettre simplement
    212 une couleur, utilisez Rect().
    213 </li>
    214 
    215 <li id='q13'>
    216 <p><b>13.</b> <span class='question'>Comment mettre un en-tête ou un pied spécifique à la première page ?</span></p>
    217 Il suffit de tester le numéro de page :
     148<p><b>12.</b> <span class='question'>How can I set a specific header or footer on the first page?</span></p>
     149Just test the page number:
    218150<div class="doc-source">
    219151<pre><code>function Header()
     
    221153    if($this-&gt;PageNo()==1)
    222154    {
    223         //Première page
     155        //First page
    224156        ...
    225157    }
    226158    else
    227159    {
    228         //Pages suivantes
     160        //Other pages
    229161        ...
    230162    }
     
    233165</li>
    234166
     167<li id='q13'>
     168<p><b>13.</b> <span class='question'>I'd like to use extensions provided by different scripts. How can I combine them?</span></p>
     169Use an inheritance chain. If you have two classes, say A in a.php:
     170<div class="doc-source">
     171<pre><code>require('fpdf.php');
     172
     173class A extends FPDF
     174{
     175...
     176}</code></pre>
     177</div>
     178and B in b.php:
     179<div class="doc-source">
     180<pre><code>require('fpdf.php');
     181
     182class B extends FPDF
     183{
     184...
     185}</code></pre>
     186</div>
     187then make B extend A:
     188<div class="doc-source">
     189<pre><code>require('a.php');
     190
     191class B extends A
     192{
     193...
     194}</code></pre>
     195</div>
     196and make your own class extend B:
     197<div class="doc-source">
     198<pre><code>require('b.php');
     199
     200class PDF extends B
     201{
     202...
     203}
     204
     205$pdf = new PDF();</code></pre>
     206</div>
     207</li>
     208
    235209<li id='q14'>
    236 <p><b>14.</b> <span class='question'>J'aimerais utiliser des extensions fournies par différents scripts. Comment les combiner ?</span></p>
    237 Utilisez une chaîne d'héritage. Si vous avez deux classes, par exemple A dans a.php :
    238 <div class="doc-source">
    239 <pre><code>require('fpdf.php');
    240 
    241 class A extends FPDF
    242 {
    243 ...
    244 }</code></pre>
    245 </div>
    246 et B dans b.php :
    247 <div class="doc-source">
    248 <pre><code>require('fpdf.php');
    249 
    250 class B extends FPDF
    251 {
    252 ...
    253 }</code></pre>
    254 </div>
    255 alors faites hériter B de A :
    256 <div class="doc-source">
    257 <pre><code>require('a.php');
    258 
    259 class B extends A
    260 {
    261 ...
    262 }</code></pre>
    263 </div>
    264 et faites hériter votre propre classe de B :
    265 <div class="doc-source">
    266 <pre><code>require('b.php');
    267 
    268 class PDF extends B
    269 {
    270 ...
    271 }
    272 
    273 $pdf = new PDF();</code></pre>
    274 </div>
     210<p><b>14.</b> <span class='question'>How can I open the PDF in a new tab?</span></p>
     211Just do the same as you would for an HTML page or anything else: add a target="_blank" to your link or form.
    275212</li>
    276213
    277214<li id='q15'>
    278 <p><b>15.</b> <span class='question'>Comment envoyer le PDF par mail ?</span></p>
    279 Comme n'importe quel autre fichier, mais une manière simple de faire est d'utiliser
    280 <a href="http://phpmailer.codeworxtech.com">PHPMailer</a> et sa fonction d'attachement en mémoire :
     215<p><b>15.</b> <span class='question'>How can I send the PDF by email?</span></p>
     216As for any other file, but an easy way is to use <a href="http://phpmailer.codeworxtech.com" target="_blank">PHPMailer</a> and
     217its in-memory attachment:
    281218<div class="doc-source">
    282219<pre><code>$mail = new PHPMailer();
    283220...
    284 $doc = $pdf-&gt;Output('', 'S');
     221$doc = $pdf-&gt;Output('S');
    285222$mail-&gt;AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
    286223$mail-&gt;Send();</code></pre>
     
    289226
    290227<li id='q16'>
    291 <p><b>16.</b> <span class='question'>Quelle est la taille limite des fichiers que je peux générer avec FPDF ?</span></p>
    292 Il n'y a pas de limite particulière. Il existe cependant certaines contraintes :
    293 <br>
    294 <br>
    295 - La taille mémoire allouée aux scripts PHP est généralement de 8 Mo. Pour de très gros
    296 documents, en particulier avec des images, cette limite peut être atteinte (le fichier étant
    297 construit en mémoire). Elle est paramétrée dans php.ini.
    298 <br>
    299 <br>
    300 - Le temps d'exécution alloué par défaut est de 30 secondes. Cette limite peut bien entendu
    301 être facilement dépassée. Elle est paramétrée dans php.ini et peut être éventuellement modifiée
    302 à l'exécution par set_time_limit().
    303 <br>
    304 <br>
    305 - Les navigateurs ont généralement un time-out de 5 minutes. Si vous envoyez le PDF directement
    306 au navigateur et que vous dépassez cette limite, il sera perdu. Il est donc conseillé pour les
    307 très gros documents de les générer dans un fichier, et d'envoyer des données de temps en temps
    308 au navigateur (avec un appel à flush() pour forcer l'envoi). Lorsque le document est terminé,
    309 vous pouvez effectuer une redirection dessus ou bien créer un lien.<br>
    310 Remarque : même lorsque le navigateur part en time-out, il est possible que le script continue
    311 de s'exécuter sur le serveur.
     228<p><b>16.</b> <span class='question'>What's the limit of the file sizes I can generate with FPDF?</span></p>
     229There is no particular limit. There are some constraints, however:
     230<br>
     231<br>
     232- There is usually a maximum memory size allocated to PHP scripts. For very big documents,
     233especially with images, the limit may be reached (the file being built in memory). The
     234parameter is configured in the php.ini file.
     235<br>
     236<br>
     237- The maximum execution time allocated to scripts defaults to 30 seconds. This limit can of course
     238be easily reached. It is configured in php.ini and may be altered dynamically with set_time_limit().
     239<br>
     240<br>
     241You can work around the memory limit with <a href="http://www.fpdf.org/?go=script&amp;id=76" target="_blank">this script</a>.
    312242</li>
    313243
    314244<li id='q17'>
    315 <p><b>17.</b> <span class='question'>Est-ce que je peux modifier un PDF avec FPDF ?</span></p>
    316 Il est possible d'importer des pages d'un PDF existant grâce à l'extension FPDI :<br>
    317 <br>
    318 <a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/" target="_blank">http://www.setasign.de/products/pdf-php-solutions/fpdi/</a><br>
    319 <br>
    320 On peut ensuite leur ajouter du contenu.
     245<p><b>17.</b> <span class='question'>Can I modify a PDF with FPDF?</span></p>
     246It's possible to import pages from an existing PDF document thanks to the
     247<a href="https://www.setasign.com/products/fpdi/about/" target="_blank">FPDI</a> extension.
     248Then you can add some content to them.
    321249</li>
    322250
    323251<li id='q18'>
    324 <p><b>18.</b> <span class='question'>Je voudrais faire un moteur de recherche en PHP et indexer des PDF. Est-ce que je peux le faire avec FPDF ?</span></p>
    325 Non. Par contre il existe un utilitaire gratuit, pdftotext, capable d'extraire le contenu
    326 textuel d'un PDF. Il est fourni avec l'archive de Xpdf :<br>
    327 <br>
    328 <a href="http://www.foolabs.com/xpdf/" target="_blank">http://www.foolabs.com/xpdf/</a>
     252<p><b>18.</b> <span class='question'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</span></p>
     253No. But a GPL C utility does exist, pdftotext, which is able to extract the textual content from a PDF.
     254It's provided with the <a href="http://www.foolabs.com/xpdf/" target="_blank">Xpdf</a> package.
    329255</li>
    330256
    331257<li id='q19'>
    332 <p><b>19.</b> <span class='question'>Est-ce que je peux transformer une page HTML en PDF avec FPDF ?</span></p>
    333 On ne peut convertir que de l'HTML très simple, pas des pages réelles. Par contre il
    334 existe un utilitaire gratuit, htmldoc, qui permet de le faire et donne de bons résultats :<br>
    335 <br>
    336 <a href="http://www.htmldoc.org" target="_blank">http://www.htmldoc.org</a>
     258<p><b>19.</b> <span class='question'>Can I convert an HTML page to PDF with FPDF?</span></p>
     259Not real-world pages. But a GPL C utility does exist, <a href="https://www.msweet.org/projects.php?Z1" target="_blank">HTMLDOC</a>,
     260which allows to do it and gives good results.
    337261</li>
    338262
    339263<li id='q20'>
    340 <p><b>20.</b> <span class='question'>Est-ce que je peux concaténer des PDF avec FPDF ?</span></p>
    341 Pas directement, mais il est possible d'utiliser <a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/demos/concatenate-fake/" target="_blank">FPDI</a>
    342 pour cela. Des utilitaires gratuits existent également :<br>
    343 <br>
    344 <a href="http://thierry.schmit.free.fr/spip/spip.php?rubrique7" target="_blank">mbtPdfAsm</a><br>
    345 <a href="http://www.accesspdf.com/pdftk/" target="_blank">pdftk</a>
     264<p><b>20.</b> <span class='question'>Can I concatenate PDF files with FPDF?</span></p>
     265Not directly, but it's possible to use <a href="https://www.setasign.com/products/fpdi/demos/concatenate-fake/" target="_blank">FPDI</a>
     266to perform that task. Some free command-line tools also exist:
     267<a href="https://www.pdflabs.com/tools/pdftk-the-pdf-toolkit/" target="_blank">pdftk</a> and
     268<a href="http://thierry.schmit.free.fr/spip/spip.php?article15" target="_blank">mbtPdfAsm</a>.
    346269</li>
    347270</ul>
  • _plugins_/fpdf/changelog.htm

    r55911 r99921  
    1212<h1>Changelog</h1>
    1313<dl>
     14<dt><strong>v1.81</strong> (20/12/2015)</dt>
     15<dd>
     16- Ajout des méthodes GetPageWidth() et GetPageHeight().<br>
     17- Correction d'un bug dans SetXY().<br>
     18</dd>
     19<dt><strong>v1.8</strong> (29/11/2015)</dt>
     20<dd>
     21- PHP 5.1.0 ou supérieur est maintenant requis.<br>
     22- L'utilitaire MakeFont gère maintenant le subsetting, ce qui peut fortement réduire la taille des polices.<br>
     23- Les ToUnicode CMaps ont été ajoutés afin d'améliorer l'extraction du texte.<br>
     24- Un paramètre a été ajouté à AddPage() pour faire tourner la page.<br>
     25- Un paramètre a été ajouté à SetY() pour indiquer si la position x doit être réinitialisée ou non.<br>
     26- Un paramètre a été ajouté à Output() pour spécifier l'encodage du nom, et les caractères spéciaux sont maintenant correctement encodés. De plus, l'ordre des deux premiers paramètres a été inversé pour être plus logique (cependant l'ancien ordre est toujours supporté).<br>
     27- La méthode Error() lance maintenant une exception.<br>
     28- L'ajout de contenu avant le premier appel à AddPage() ou après Close() produit maintenant une erreur.<br>
     29- L'ajout de texte sans police sélectionnée produit maintenant une erreur.<br>
     30</dd>
    1431<dt><strong>v1.7</strong> (18/06/2011)</dt>
    1532<dd>
  • _plugins_/fpdf/demo/doc/acceptpagebreak.htm

    r55913 r99921  
    5454$pdf-&gt;SetFont('Arial','',12);
    5555for($i=1;$i&lt;=300;$i++)
    56     $pdf-&gt;Cell(0,5,&quot;Ligne $i&quot;,0,1);
     56    $pdf-&gt;Cell(0,5,"Ligne $i",0,1);
    5757$pdf-&gt;Output();</code></pre>
    5858</div>
    5959<h2>Voir</h2>
    60 <a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
     60<a href="setautopagebreak.htm">SetAutoPageBreak</a>
    6161<hr style="margin-top:1.5em">
    6262<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/addfont.htm

    r55913 r99921  
    5151</div>
    5252<h2>Voir</h2>
    53 <a href="setfont.htm">SetFont()</a>.
     53<a href="setfont.htm">SetFont</a>
    5454<hr style="margin-top:1.5em">
    5555<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/addlink.htm

    r55913 r99921  
    1616destination est définie à l'aide de SetLink().
    1717<h2>Voir</h2>
    18 <a href="cell.htm">Cell()</a>,
    19 <a href="write.htm">Write()</a>,
    20 <a href="image.htm">Image()</a>,
    21 <a href="link.htm">Link()</a>,
    22 <a href="setlink.htm">SetLink()</a>.
     18<a href="cell.htm">Cell</a>,
     19<a href="write.htm">Write</a>,
     20<a href="image.htm">Image</a>,
     21<a href="link.htm">Link</a>,
     22<a href="setlink.htm">SetLink</a>
    2323<hr style="margin-top:1.5em">
    2424<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/addpage.htm

    r55913 r99921  
    88<body>
    99<h1>AddPage</h1>
    10 <code>AddPage([<b>string</b> orientation [, <b>mixed</b> size]])</code>
     10<code>AddPage([<b>string</b> orientation [, <b>mixed</b> size [, <b>int</b> rotation]]])</code>
    1111<h2>Description</h2>
    1212Ajoute une nouvelle page au document. Si une page était en cours, la méthode Footer() est
     
    4646La valeur par défaut est celle indiquée dans le constructeur.
    4747</dd>
     48<dt><code>rotation</code></dt>
     49<dd>
     50Angle de rotation de la page. La valeur doit être un multiple de 90 ; la rotation se fait
     51dans le sens horaire. La valeur par défaut est <code>0</code>.
     52</dd>
    4853</dl>
    4954<h2>Voir</h2>
    50 <a href="fpdf.htm">FPDF()</a>,
    51 <a href="header.htm">Header()</a>,
    52 <a href="footer.htm">Footer()</a>,
    53 <a href="setmargins.htm">SetMargins()</a>.
     55<a href="__construct.htm">__construct</a>,
     56<a href="header.htm">Header</a>,
     57<a href="footer.htm">Footer</a>,
     58<a href="setmargins.htm">SetMargins</a>
    5459<hr style="margin-top:1.5em">
    5560<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/aliasnbpages.htm

    r55913 r99921  
    3838</div>
    3939<h2>Voir</h2>
    40 <a href="pageno.htm">PageNo()</a>,
    41 <a href="footer.htm">Footer()</a>.
     40<a href="pageno.htm">PageNo</a>,
     41<a href="footer.htm">Footer</a>
    4242<hr style="margin-top:1.5em">
    4343<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/cell.htm

    r55913 r99921  
    9292</div>
    9393<h2>Voir</h2>
    94 <a href="setfont.htm">SetFont()</a>,
    95 <a href="setdrawcolor.htm">SetDrawColor()</a>,
    96 <a href="setfillcolor.htm">SetFillColor()</a>,
    97 <a href="settextcolor.htm">SetTextColor()</a>,
    98 <a href="setlinewidth.htm">SetLineWidth()</a>,
    99 <a href="addlink.htm">AddLink()</a>,
    100 <a href="ln.htm">Ln()</a>,
    101 <a href="multicell.htm">MultiCell()</a>,
    102 <a href="write.htm">Write()</a>,
    103 <a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
     94<a href="setfont.htm">SetFont</a>,
     95<a href="setdrawcolor.htm">SetDrawColor</a>,
     96<a href="setfillcolor.htm">SetFillColor</a>,
     97<a href="settextcolor.htm">SetTextColor</a>,
     98<a href="setlinewidth.htm">SetLineWidth</a>,
     99<a href="addlink.htm">AddLink</a>,
     100<a href="ln.htm">Ln</a>,
     101<a href="multicell.htm">MultiCell</a>,
     102<a href="write.htm">Write</a>,
     103<a href="setautopagebreak.htm">SetAutoPageBreak</a>
    104104<hr style="margin-top:1.5em">
    105105<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/close.htm

    r55913 r99921  
    1616invalide.
    1717<h2>Voir</h2>
    18 <a href="output.htm">Output()</a>.
     18<a href="output.htm">Output</a>
    1919<hr style="margin-top:1.5em">
    2020<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/error.htm

    r55913 r99921  
    1010<code>Error(<b>string</b> msg)</code>
    1111<h2>Description</h2>
    12 Cette méthode est appelée automatiquement en cas d'erreur fatale; elle se contente d'afficher
    13 le message et de mettre fin à l'exécution du script. Une classe dérivée peut la redéfinir afin
    14 de personnaliser le traitement des erreurs, mais doit impérativement arrêter l'exécution du
    15 script, sinon le fichier PDF résultant serait probablement invalide.
     12Cette méthode est appelée automatiquement en cas d'erreur fatale ; elle se contente de lancer
     13une exception avec le message fourni.<br>
     14Une classe dérivée peut redéfinir la méthode afin de personnaliser le traitement des erreurs,
     15mais elle doit impérativement interrompre le traitement, sinon le fichier PDF résultant serait
     16probablement invalide.
    1617<h2>Paramètres</h2>
    1718<dl class="param">
  • _plugins_/fpdf/demo/doc/footer.htm

    r55913 r99921  
    3030</div>
    3131<h2>Voir</h2>
    32 <a href="header.htm">Header()</a>.
     32<a href="header.htm">Header</a>
    3333<hr style="margin-top:1.5em">
    3434<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/getx.htm

    r55913 r99921  
    1212Renvoie l'abscisse de la position courante.
    1313<h2>Voir</h2>
    14 <a href="setx.htm">SetX()</a>,
    15 <a href="gety.htm">GetY()</a>,
    16 <a href="sety.htm">SetY()</a>.
     14<a href="setx.htm">SetX</a>,
     15<a href="gety.htm">GetY</a>,
     16<a href="sety.htm">SetY</a>
    1717<hr style="margin-top:1.5em">
    1818<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/gety.htm

    r55913 r99921  
    1212Renvoie l'ordonnée de la position courante.
    1313<h2>Voir</h2>
    14 <a href="sety.htm">SetY()</a>,
    15 <a href="getx.htm">GetX()</a>,
    16 <a href="setx.htm">SetX()</a>.
     14<a href="sety.htm">SetY</a>,
     15<a href="getx.htm">GetX</a>,
     16<a href="setx.htm">SetX</a>
    1717<hr style="margin-top:1.5em">
    1818<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/header.htm

    r55913 r99921  
    3232</div>
    3333<h2>Voir</h2>
    34 <a href="footer.htm">Footer()</a>.
     34<a href="footer.htm">Footer</a>
    3535<hr style="margin-top:1.5em">
    3636<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/image.htm

    r55913 r99921  
    9595</div>
    9696<h2>Voir</h2>
    97 <a href="addlink.htm">AddLink()</a>.
     97<a href="addlink.htm">AddLink</a>
    9898<hr style="margin-top:1.5em">
    9999<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/index.htm

    r55913 r99921  
    33<head>
    44<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    5 <title>Manuel de référence de FPDF 1.7</title>
     5<title>Manuel de référence de FPDF 1.81</title>
    66<link type="text/css" rel="stylesheet" href="../fpdf.css">
    77</head>
    88<body>
    9 <h1>Manuel de référence de FPDF 1.7</h1>
     9<h1>Manuel de référence de FPDF 1.81</h1>
     10<a href="__construct.htm">__construct</a> - constructeur<br>
    1011<a href="acceptpagebreak.htm">AcceptPageBreak</a> - accepte ou non un saut de page automatique<br>
    1112<a href="addfont.htm">AddFont</a> - ajoute une nouvelle police<br>
     
    1718<a href="error.htm">Error</a> - erreur fatale<br>
    1819<a href="footer.htm">Footer</a> - pied de page<br>
    19 <a href="fpdf.htm">FPDF</a> - constructeur<br>
     20<a href="getpageheight.htm">GetPageHeight</a> - renvoie la hauteur de la page courante<br>
     21<a href="getpagewidth.htm">GetPageWidth</a> - renvoie la largeur de la page courante<br>
    2022<a href="getstringwidth.htm">GetStringWidth</a> - calcule la longueur d'une chaîne<br>
    2123<a href="getx.htm">GetX</a> - renvoie la position x courante<br>
     
    5153<a href="setx.htm">SetX</a> - fixe la position x courante<br>
    5254<a href="setxy.htm">SetXY</a> - fixe les positions x et y courantes<br>
    53 <a href="sety.htm">SetY</a> - fixe la position y courante<br>
     55<a href="sety.htm">SetY</a> - fixe la position y courante et restaure éventuellement x<br>
    5456<a href="text.htm">Text</a> - imprime une chaîne<br>
    5557<a href="write.htm">Write</a> - imprime du texte en mode flot<br>
  • _plugins_/fpdf/demo/doc/line.htm

    r55913 r99921  
    3131</dl>
    3232<h2>Voir</h2>
    33 <a href="setlinewidth.htm">SetLineWidth()</a>,
    34 <a href="setdrawcolor.htm">SetDrawColor()</a>.
     33<a href="setlinewidth.htm">SetLineWidth</a>,
     34<a href="setdrawcolor.htm">SetDrawColor</a>
    3535<hr style="margin-top:1.5em">
    3636<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/link.htm

    r55913 r99921  
    3737</dl>
    3838<h2>Voir</h2>
    39 <a href="addlink.htm">AddLink()</a>,
    40 <a href="cell.htm">Cell()</a>,
    41 <a href="write.htm">Write()</a>,
    42 <a href="image.htm">Image()</a>.
     39<a href="addlink.htm">AddLink</a>,
     40<a href="cell.htm">Cell</a>,
     41<a href="write.htm">Write</a>,
     42<a href="image.htm">Image</a>
    4343<hr style="margin-top:1.5em">
    4444<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/ln.htm

    r55913 r99921  
    2222</dl>
    2323<h2>Voir</h2>
    24 <a href="cell.htm">Cell()</a>.
     24<a href="cell.htm">Cell</a>
    2525<hr style="margin-top:1.5em">
    2626<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/multicell.htm

    r55913 r99921  
    6666</dl>
    6767<h2>Voir</h2>
    68 <a href="setfont.htm">SetFont()</a>,
    69 <a href="setdrawcolor.htm">SetDrawColor()</a>,
    70 <a href="setfillcolor.htm">SetFillColor()</a>,
    71 <a href="settextcolor.htm">SetTextColor()</a>,
    72 <a href="setlinewidth.htm">SetLineWidth()</a>,
    73 <a href="cell.htm">Cell()</a>,
    74 <a href="write.htm">Write()</a>,
    75 <a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
     68<a href="setfont.htm">SetFont</a>,
     69<a href="setdrawcolor.htm">SetDrawColor</a>,
     70<a href="setfillcolor.htm">SetFillColor</a>,
     71<a href="settextcolor.htm">SetTextColor</a>,
     72<a href="setlinewidth.htm">SetLineWidth</a>,
     73<a href="cell.htm">Cell</a>,
     74<a href="write.htm">Write</a>,
     75<a href="setautopagebreak.htm">SetAutoPageBreak</a>
    7676<hr style="margin-top:1.5em">
    7777<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/output.htm

    r55913 r99921  
    88<body>
    99<h1>Output</h1>
    10 <code><b>string</b> Output([<b>string</b> name, <b>string</b> dest])</code>
     10<code><b>string</b> Output([<b>string</b> dest [, <b>string</b> name [, <b>boolean</b> isUTF8]]])</code>
    1111<h2>Description</h2>
    1212Envoie le document vers une destination donnée : navigateur, fichier ou chaîne de caractères.
    13 Dans le cas du navigateur, on peut utiliser le plug-in (s'il est présent) ou bien forcer la
    14 boîte de téléchargement.
     13Dans le cas du navigateur, on peut utiliser le visualiseur PDF ou bien forcer le téléchargement.
    1514<br>
    1615La méthode commence par appeler Close() si nécessaire pour terminer le document.
    1716<h2>Paramètres</h2>
    1817<dl class="param">
    19 <dt><code>name</code></dt>
    20 <dd>
    21 Le nom du fichier. S'il n'est pas renseigné, le document est envoyé au navigateur
    22 (destination <code>I</code>) avec le nom <code>doc.pdf</code>.
    23 </dd>
    2418<dt><code>dest</code></dt>
    2519<dd>
    2620Destination où envoyer le document. Le paramètre peut prendre les valeurs suivantes :
    2721<ul>
    28 <li><code>I</code> : envoyer en inline au navigateur. Le plug-in est utilisé s'il est installé.
    29 Le nom indiqué dans <code>name</code> est utilisé lorsque l'on sélectionne "Enregistrer sous"
    30 sur le lien générant le PDF.</li>
    31 <li><code>D</code> : envoyer au navigateur en forçant le téléchargement, avec le nom indiqué
    32 dans <code>name</code>.</li>
     22<li><code>I</code> : envoyer en inline au navigateur. Le visualiseur PDF est utilisé.</li>
     23<li><code>D</code> : envoyer au navigateur en forçant le téléchargement, avec le nom indiqué dans <code>name</code>.</li>
    3324<li><code>F</code> : sauver dans un fichier local, avec le nom indiqué dans <code>name</code>
    34  (peut inclure un répertoire).</li>
    35 <li><code>S</code> : renvoyer le document sous forme de chaîne. <code>name</code> est ignoré.</li>
     25(peut inclure un répertoire).</li>
     26<li><code>S</code> : renvoyer le document sous forme de chaîne.</li>
    3627</ul>
     28La valeur par défaut est <code>I</code>.
     29</dd>
     30<dt><code>name</code></dt>
     31<dd>
     32Le nom du fichier. Il est ignoré dans le cas de la destination <code>S</code>.<br>
     33La valeur par défaut est <code>doc.pdf</code>.
     34</dd>
     35<dt><code>isUTF8</code></dt>
     36<dd>
     37Indique si <code>name</code> est encodé en ISO-8859-1 (<code>false</code>) ou en UTF-8 (<code>true</code>).<br>
     38Ce paramètre est utilisé uniquement pour les destinations <code>I</code> et <code>D</code>.<br>
     39La valeur par défaut est <code>false</code>.
    3740</dd>
    3841</dl>
    3942<h2>Voir</h2>
    40 <a href="close.htm">Close()</a>.
     43<a href="close.htm">Close</a>
    4144<hr style="margin-top:1.5em">
    4245<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/pageno.htm

    r55913 r99921  
    1212Renvoie le numéro de page courant.
    1313<h2>Voir</h2>
    14 <a href="aliasnbpages.htm">AliasNbPages()</a>.
     14<a href="aliasnbpages.htm">AliasNbPages</a>
    1515<hr style="margin-top:1.5em">
    1616<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/rect.htm

    r55913 r99921  
    4141</dl>
    4242<h2>Voir</h2>
    43 <a href="setlinewidth.htm">SetLineWidth()</a>,
    44 <a href="setdrawcolor.htm">SetDrawColor()</a>,
    45 <a href="setfillcolor.htm">SetFillColor()</a>.
     43<a href="setlinewidth.htm">SetLineWidth</a>,
     44<a href="setdrawcolor.htm">SetDrawColor</a>,
     45<a href="setfillcolor.htm">SetFillColor</a>
    4646<hr style="margin-top:1.5em">
    4747<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setauthor.htm

    r55913 r99921  
    2424</dl>
    2525<h2>Voir</h2>
    26 <a href="setcreator.htm">SetCreator()</a>,
    27 <a href="setkeywords.htm">SetKeywords()</a>,
    28 <a href="setsubject.htm">SetSubject()</a>,
    29 <a href="settitle.htm">SetTitle()</a>.
     26<a href="setcreator.htm">SetCreator</a>,
     27<a href="setkeywords.htm">SetKeywords</a>,
     28<a href="setsubject.htm">SetSubject</a>,
     29<a href="settitle.htm">SetTitle</a>
    3030<hr style="margin-top:1.5em">
    3131<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setautopagebreak.htm

    r55913 r99921  
    2525</dl>
    2626<h2>Voir</h2>
    27 <a href="cell.htm">Cell()</a>,
    28 <a href="multicell.htm">MultiCell()</a>,
    29 <a href="acceptpagebreak.htm">AcceptPageBreak()</a>.
     27<a href="cell.htm">Cell</a>,
     28<a href="multicell.htm">MultiCell</a>,
     29<a href="acceptpagebreak.htm">AcceptPageBreak</a>
    3030<hr style="margin-top:1.5em">
    3131<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setcreator.htm

    r55913 r99921  
    2424</dl>
    2525<h2>Voir</h2>
    26 <a href="setauthor.htm">SetAuthor()</a>,
    27 <a href="setkeywords.htm">SetKeywords()</a>,
    28 <a href="setsubject.htm">SetSubject()</a>,
    29 <a href="settitle.htm">SetTitle()</a>.
     26<a href="setauthor.htm">SetAuthor</a>,
     27<a href="setkeywords.htm">SetKeywords</a>,
     28<a href="setsubject.htm">SetSubject</a>,
     29<a href="settitle.htm">SetTitle</a>
    3030<hr style="margin-top:1.5em">
    3131<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setdrawcolor.htm

    r55913 r99921  
    3131</dl>
    3232<h2>Voir</h2>
    33 <a href="setfillcolor.htm">SetFillColor()</a>,
    34 <a href="settextcolor.htm">SetTextColor()</a>,
    35 <a href="line.htm">Line()</a>,
    36 <a href="rect.htm">Rect()</a>,
    37 <a href="cell.htm">Cell()</a>,
    38 <a href="multicell.htm">MultiCell()</a>.
     33<a href="setfillcolor.htm">SetFillColor</a>,
     34<a href="settextcolor.htm">SetTextColor</a>,
     35<a href="line.htm">Line</a>,
     36<a href="rect.htm">Rect</a>,
     37<a href="cell.htm">Cell</a>,
     38<a href="multicell.htm">MultiCell</a>
    3939<hr style="margin-top:1.5em">
    4040<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setfillcolor.htm

    r55913 r99921  
    3131</dl>
    3232<h2>Voir</h2>
    33 <a href="setdrawcolor.htm">SetDrawColor()</a>,
    34 <a href="settextcolor.htm">SetTextColor()</a>,
    35 <a href="rect.htm">Rect()</a>,
    36 <a href="cell.htm">Cell()</a>,
    37 <a href="multicell.htm">MultiCell()</a>.
     33<a href="setdrawcolor.htm">SetDrawColor</a>,
     34<a href="settextcolor.htm">SetTextColor</a>,
     35<a href="rect.htm">Rect</a>,
     36<a href="cell.htm">Cell</a>,
     37<a href="multicell.htm">MultiCell</a>
    3838<hr style="margin-top:1.5em">
    3939<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setfont.htm

    r55913 r99921  
    8787</div>
    8888<h2>Voir</h2>
    89 <a href="addfont.htm">AddFont()</a>,
    90 <a href="setfontsize.htm">SetFontSize()</a>,
    91 <a href="cell.htm">Cell()</a>,
    92 <a href="multicell.htm">MultiCell()</a>,
    93 <a href="write.htm">Write()</a>.
     89<a href="addfont.htm">AddFont</a>,
     90<a href="setfontsize.htm">SetFontSize</a>,
     91<a href="cell.htm">Cell</a>,
     92<a href="multicell.htm">MultiCell</a>,
     93<a href="write.htm">Write</a>
    9494<hr style="margin-top:1.5em">
    9595<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setfontsize.htm

    r55913 r99921  
    1919</dl>
    2020<h2>Voir</h2>
    21 <a href="setfont.htm">SetFont()</a>.
     21<a href="setfont.htm">SetFont</a>
    2222<hr style="margin-top:1.5em">
    2323<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setkeywords.htm

    r55913 r99921  
    2424</dl>
    2525<h2>Voir</h2>
    26 <a href="setauthor.htm">SetAuthor()</a>,
    27 <a href="setcreator.htm">SetCreator()</a>,
    28 <a href="setsubject.htm">SetSubject()</a>,
    29 <a href="settitle.htm">SetTitle()</a>.
     26<a href="setauthor.htm">SetAuthor</a>,
     27<a href="setcreator.htm">SetCreator</a>,
     28<a href="setsubject.htm">SetSubject</a>,
     29<a href="settitle.htm">SetTitle</a>
    3030<hr style="margin-top:1.5em">
    3131<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setleftmargin.htm

    r55913 r99921  
    2121</dl>
    2222<h2>Voir</h2>
    23 <a href="settopmargin.htm">SetTopMargin()</a>,
    24 <a href="setrightmargin.htm">SetRightMargin()</a>,
    25 <a href="setautopagebreak.htm">SetAutoPageBreak()</a>,
    26 <a href="setmargins.htm">SetMargins()</a>.
     23<a href="settopmargin.htm">SetTopMargin</a>,
     24<a href="setrightmargin.htm">SetRightMargin</a>,
     25<a href="setautopagebreak.htm">SetAutoPageBreak</a>,
     26<a href="setmargins.htm">SetMargins</a>
    2727<hr style="margin-top:1.5em">
    2828<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setlinewidth.htm

    r55913 r99921  
    2121</dl>
    2222<h2>Voir</h2>
    23 <a href="line.htm">Line()</a>,
    24 <a href="rect.htm">Rect()</a>,
    25 <a href="cell.htm">Cell()</a>,
    26 <a href="multicell.htm">MultiCell()</a>.
     23<a href="line.htm">Line</a>,
     24<a href="rect.htm">Rect</a>,
     25<a href="cell.htm">Cell</a>,
     26<a href="multicell.htm">MultiCell</a>
    2727<hr style="margin-top:1.5em">
    2828<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setlink.htm

    r55913 r99921  
    2828</dl>
    2929<h2>Voir</h2>
    30 <a href="addlink.htm">AddLink()</a>.
     30<a href="addlink.htm">AddLink</a>
    3131<hr style="margin-top:1.5em">
    3232<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setmargins.htm

    r55913 r99921  
    2828</dl>
    2929<h2>Voir</h2>
    30 <a href="setleftmargin.htm">SetLeftMargin()</a>,
    31 <a href="settopmargin.htm">SetTopMargin()</a>,
    32 <a href="setrightmargin.htm">SetRightMargin()</a>,
    33 <a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
     30<a href="setleftmargin.htm">SetLeftMargin</a>,
     31<a href="settopmargin.htm">SetTopMargin</a>,
     32<a href="setrightmargin.htm">SetRightMargin</a>,
     33<a href="setautopagebreak.htm">SetAutoPageBreak</a>
    3434<hr style="margin-top:1.5em">
    3535<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setrightmargin.htm

    r55913 r99921  
    1919</dl>
    2020<h2>Voir</h2>
    21 <a href="setleftmargin.htm">SetLeftMargin()</a>,
    22 <a href="settopmargin.htm">SetTopMargin()</a>,
    23 <a href="setautopagebreak.htm">SetAutoPageBreak()</a>,
    24 <a href="setmargins.htm">SetMargins()</a>.
     21<a href="setleftmargin.htm">SetLeftMargin</a>,
     22<a href="settopmargin.htm">SetTopMargin</a>,
     23<a href="setautopagebreak.htm">SetAutoPageBreak</a>,
     24<a href="setmargins.htm">SetMargins</a>
    2525<hr style="margin-top:1.5em">
    2626<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setsubject.htm

    r55913 r99921  
    2424</dl>
    2525<h2>Voir</h2>
    26 <a href="setauthor.htm">SetAuthor()</a>,
    27 <a href="setcreator.htm">SetCreator()</a>,
    28 <a href="setkeywords.htm">SetKeywords()</a>,
    29 <a href="settitle.htm">SetTitle()</a>.
     26<a href="setauthor.htm">SetAuthor</a>,
     27<a href="setcreator.htm">SetCreator</a>,
     28<a href="setkeywords.htm">SetKeywords</a>,
     29<a href="settitle.htm">SetTitle</a>
    3030<hr style="margin-top:1.5em">
    3131<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/settextcolor.htm

    r55913 r99921  
    3030</dl>
    3131<h2>Voir</h2>
    32 <a href="setdrawcolor.htm">SetDrawColor()</a>,
    33 <a href="setfillcolor.htm">SetFillColor()</a>,
    34 <a href="text.htm">Text()</a>,
    35 <a href="cell.htm">Cell()</a>,
    36 <a href="multicell.htm">MultiCell()</a>.
     32<a href="setdrawcolor.htm">SetDrawColor</a>,
     33<a href="setfillcolor.htm">SetFillColor</a>,
     34<a href="text.htm">Text</a>,
     35<a href="cell.htm">Cell</a>,
     36<a href="multicell.htm">MultiCell</a>
    3737<hr style="margin-top:1.5em">
    3838<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/settitle.htm

    r55913 r99921  
    2424</dl>
    2525<h2>Voir</h2>
    26 <a href="setauthor.htm">SetAuthor()</a>,
    27 <a href="setcreator.htm">SetCreator()</a>,
    28 <a href="setkeywords.htm">SetKeywords()</a>,
    29 <a href="setsubject.htm">SetSubject()</a>.
     26<a href="setauthor.htm">SetAuthor</a>,
     27<a href="setcreator.htm">SetCreator</a>,
     28<a href="setkeywords.htm">SetKeywords</a>,
     29<a href="setsubject.htm">SetSubject</a>
    3030<hr style="margin-top:1.5em">
    3131<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/settopmargin.htm

    r55913 r99921  
    1919</dl>
    2020<h2>Voir</h2>
    21 <a href="setleftmargin.htm">SetLeftMargin()</a>,
    22 <a href="setrightmargin.htm">SetRightMargin()</a>,
    23 <a href="setautopagebreak.htm">SetAutoPageBreak()</a>,
    24 <a href="setmargins.htm">SetMargins()</a>.
     21<a href="setleftmargin.htm">SetLeftMargin</a>,
     22<a href="setrightmargin.htm">SetRightMargin</a>,
     23<a href="setautopagebreak.htm">SetAutoPageBreak</a>,
     24<a href="setmargins.htm">SetMargins</a>
    2525<hr style="margin-top:1.5em">
    2626<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setx.htm

    r55913 r99921  
    2020</dl>
    2121<h2>Voir</h2>
    22 <a href="getx.htm">GetX()</a>,
    23 <a href="gety.htm">GetY()</a>,
    24 <a href="sety.htm">SetY()</a>,
    25 <a href="setxy.htm">SetXY()</a>.
     22<a href="getx.htm">GetX</a>,
     23<a href="gety.htm">GetY</a>,
     24<a href="sety.htm">SetY</a>,
     25<a href="setxy.htm">SetXY</a>
    2626<hr style="margin-top:1.5em">
    2727<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/setxy.htm

    r55913 r99921  
    2424</dl>
    2525<h2>Voir</h2>
    26 <a href="setx.htm">SetX()</a>,
    27 <a href="sety.htm">SetY()</a>.
     26<a href="setx.htm">SetX</a>,
     27<a href="sety.htm">SetY</a>
    2828<hr style="margin-top:1.5em">
    2929<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/sety.htm

    r55913 r99921  
    88<body>
    99<h1>SetY</h1>
    10 <code>SetY(<b>float</b> y)</code>
     10<code>SetY(<b>float</b> y [, <b>boolean</b> resetX])</code>
    1111<h2>Description</h2>
    12 Ramène l'abscisse courante à la marge gauche et fixe l'ordonnée. Si la valeur transmise est
     12Fixe l'ordonnée et ramène éventuellement l'abscisse courante à la marge gauche. Si la valeur est
    1313négative, elle est relative au bas de la page.
    1414<h2>Paramètres</h2>
     
    1818La valeur de l'ordonnée.
    1919</dd>
     20<dt><code>resetX</code></dt>
     21<dd>
     22Indique si l'abscisse doit être réinitialisée. Valeur par défaut : <code>true</code>.
     23</dd>
    2024</dl>
    2125<h2>Voir</h2>
    22 <a href="getx.htm">GetX()</a>,
    23 <a href="gety.htm">GetY()</a>,
    24 <a href="setx.htm">SetX()</a>,
    25 <a href="setxy.htm">SetXY()</a>.
     26<a href="getx.htm">GetX</a>,
     27<a href="gety.htm">GetY</a>,
     28<a href="setx.htm">SetX</a>,
     29<a href="setxy.htm">SetXY</a>
    2630<hr style="margin-top:1.5em">
    2731<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/text.htm

    r55913 r99921  
    3131</dl>
    3232<h2>Voir</h2>
    33 <a href="setfont.htm">SetFont()</a>,
    34 <a href="settextcolor.htm">SetTextColor()</a>,
    35 <a href="cell.htm">Cell()</a>,
    36 <a href="multicell.htm">MultiCell()</a>,
    37 <a href="write.htm">Write()</a>.
     33<a href="setfont.htm">SetFont</a>,
     34<a href="settextcolor.htm">SetTextColor</a>,
     35<a href="cell.htm">Cell</a>,
     36<a href="multicell.htm">MultiCell</a>,
     37<a href="write.htm">Write</a>
    3838<hr style="margin-top:1.5em">
    3939<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/doc/write.htm

    r55913 r99921  
    4242</div>
    4343<h2>Voir</h2>
    44 <a href="setfont.htm">SetFont()</a>,
    45 <a href="settextcolor.htm">SetTextColor()</a>,
    46 <a href="addlink.htm">AddLink()</a>,
    47 <a href="multicell.htm">MultiCell()</a>,
    48 <a href="setautopagebreak.htm">SetAutoPageBreak()</a>.
     44<a href="setfont.htm">SetFont</a>,
     45<a href="settextcolor.htm">SetTextColor</a>,
     46<a href="addlink.htm">AddLink</a>,
     47<a href="multicell.htm">MultiCell</a>,
     48<a href="setautopagebreak.htm">SetAutoPageBreak</a>
    4949<hr style="margin-top:1.5em">
    5050<div style="text-align:center"><a href="index.htm">Index</a></div>
  • _plugins_/fpdf/demo/tutorial/calligra.php

    r55912 r99921  
    1919        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);
    2020$enc = 'cp1252';
     21$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));
    2122$file = 'calligra.z';
    22 $originalsize = 40120;
     23$originalsize = 33948;
     24$subsetted = true;
    2325?>
  • _plugins_/fpdf/demo/tutorial/index.htm

    r55912 r99921  
    1616<li><a href="tuto6.htm">Tutoriel 6</a> : Liens et texte en mode flot</li>
    1717<li><a href="tuto7.htm">Tutoriel 7</a> : Ajout de polices et encodages</li>
    18 </UL>
     18</ul>
    1919</body>
    2020</html>
  • _plugins_/fpdf/demo/tutorial/tuto1.htm

    r55912 r99921  
    2121</div>
    2222<p class='demo'><a href='tuto1.php' target='_blank' class='demo'>[Démo]</a></p>
    23 Après avoir inclus la librairie, un object FPDF est créé.
    24 Le constructeur <a href='../doc/fpdf.htm'>FPDF()</a> est utilisé ici avec les valeurs par défaut : les pages sont en
     23Après avoir inclus la librairie, un objet FPDF est créé.
     24Le <a href='../doc/__construct.htm'>constructeur</a> est utilisé ici avec les valeurs par défaut : les pages sont en
    2525portrait A4 et l'unité de mesure est le millimètre. On aurait pu l'indiquer explicitement par :
    2626<div class="source">
     
    3838<br>
    3939<br>
    40 Avant d'imprimer du texte, il est impératif de définir la police avec <a href='../doc/setfont.htm'>SetFont()</a>, sinon
    41 le document serait invalide. On choisit de l'Arial gras en taille 16 :
     40Avant d'imprimer du texte, il est impératif de définir la police avec <a href='../doc/setfont.htm'>SetFont()</a>.
     41On choisit de l'Arial gras en taille 16 :
    4242<div class="source">
    4343<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">);
     
    4747police normale avec une chaîne vide (ou bien encore une combinaison de styles). A noter que la
    4848taille de la police est ici donnée en points, pas en millimètres (ou autre unité choisie) ; c'est
    49 la seule exception. Les autres polices standard disponibles sont Times, Courier, Symbol et
     49la seule exception. Les autres polices standards disponibles sont Times, Courier, Symbol et
    5050ZapfDingbats.
    5151<br>
     
    7070<br>
    7171<br>
    72 Enfin, le document est terminé et envoyé au navigateur grâce à <a href='../doc/output.htm'>Output()</a>. On aurait pu
    73 le sauvegarder directement dans un fichier en passant le nom souhaité.
     72Enfin, le document est terminé et envoyé au navigateur grâce à <a href='../doc/output.htm'>Output()</a>. Il est également
     73possible de le sauvegarder directement dans un fichier en passant les paramètres appropriés.
    7474<br>
    7575<br>
  • _plugins_/fpdf/demo/tutorial/tuto3.htm

    r55912 r99921  
    109109<br>
    110110Deux propriétés du document sont renseignées : le titre (<a href='../doc/settitle.htm'>SetTitle()</a>) et l'auteur
    111 (<a href='../doc/setauthor.htm'>SetAuthor()</a>). Il y a plusieurs manères d'accéder aux propriété dans Adobe Reader. La première
     111(<a href='../doc/setauthor.htm'>SetAuthor()</a>). Il y a plusieurs manères d'accéder aux propriétés dans Adobe Reader. La première
    112112consiste à ouvrir le document directement avec le lecteur, à aller dans le menu Fichier et à
    113113choisir l'option Propriétés. La seconde, disponible également à partir du plug-in, consiste à
  • _plugins_/fpdf/demo/tutorial/tuto4.htm

    r55912 r99921  
    1616class </span>PDF <span class="kw">extends </span>FPDF
    1717<span class="kw">{
    18 </span><span class="cmt">// Colonne courante
    19 </span><span class="kw">var </span>$col <span class="kw">= </span>0<span class="kw">;
    20 </span><span class="cmt">// Ordonnée du début des colonnes
    21 </span><span class="kw">var </span>$y0<span class="kw">;
     18protected </span>$col <span class="kw">= </span>0<span class="kw">; </span><span class="cmt">// Colonne courante
     19</span><span class="kw">protected </span>$y0<span class="kw">;      </span><span class="cmt">// Ordonnée du début des colonnes
    2220
    23 function </span>Header<span class="kw">()
     21</span><span class="kw">function </span>Header<span class="kw">()
    2422{
    2523    </span><span class="cmt">// En-tête
  • _plugins_/fpdf/demo/tutorial/tuto4.php

    r55912 r99921  
    44class PDF extends FPDF
    55{
    6 // Colonne courante
    7 var $col = 0;
    8 // Ordonnée du début des colonnes
    9 var $y0;
     6protected $col = 0; // Colonne courante
     7protected $y0;      // Ordonnée du début des colonnes
    108
    119function Header()
  • _plugins_/fpdf/demo/tutorial/tuto6.htm

    r55912 r99921  
    1616class </span>PDF <span class="kw">extends </span>FPDF
    1717<span class="kw">{
    18 var </span>$B<span class="kw">;
    19 var </span>$I<span class="kw">;
    20 var </span>$U<span class="kw">;
    21 var </span>$HREF<span class="kw">;
    22 
    23 function </span>PDF<span class="kw">(</span>$orientation<span class="kw">=</span><span class="str">'P'</span><span class="kw">, </span>$unit<span class="kw">=</span><span class="str">'mm'</span><span class="kw">, </span>$size<span class="kw">=</span><span class="str">'A4'</span><span class="kw">)
    24 {
    25     </span><span class="cmt">// Appel au constructeur parent
    26     </span>$<span class="kw">this-&gt;</span>FPDF<span class="kw">(</span>$orientation<span class="kw">,</span>$unit<span class="kw">,</span>$size<span class="kw">);
    27     </span><span class="cmt">// Initialisation
    28     </span>$<span class="kw">this-&gt;</span>B <span class="kw">= </span>0<span class="kw">;
    29     </span>$<span class="kw">this-&gt;</span>I <span class="kw">= </span>0<span class="kw">;
    30     </span>$<span class="kw">this-&gt;</span>U <span class="kw">= </span>0<span class="kw">;
    31     </span>$<span class="kw">this-&gt;</span>HREF <span class="kw">= </span><span class="str">''</span><span class="kw">;
    32 }
     18protected </span>$B <span class="kw">= </span>0<span class="kw">;
     19protected </span>$I <span class="kw">= </span>0<span class="kw">;
     20protected </span>$U <span class="kw">= </span>0<span class="kw">;
     21protected </span>$HREF <span class="kw">= </span><span class="str">''</span><span class="kw">;
    3322
    3423function </span>WriteHTML<span class="kw">(</span>$html<span class="kw">)
  • _plugins_/fpdf/demo/tutorial/tuto6.php

    r55912 r99921  
    44class PDF extends FPDF
    55{
    6 var $B;
    7 var $I;
    8 var $U;
    9 var $HREF;
    10 
    11 function PDF($orientation='P', $unit='mm', $size='A4')
    12 {
    13         // Appel au constructeur parent
    14         $this->FPDF($orientation,$unit,$size);
    15         // Initialisation
    16         $this->B = 0;
    17         $this->I = 0;
    18         $this->U = 0;
    19         $this->HREF = '';
    20 }
     6protected $B = 0;
     7protected $I = 0;
     8protected $U = 0;
     9protected $HREF = '';
    2110
    2211function WriteHTML($html)
  • _plugins_/fpdf/demo/tutorial/tuto7.htm

    r55912 r99921  
    55<title>Ajout de polices et encodages</title>
    66<link type="text/css" rel="stylesheet" href="../fpdf.css">
    7 <style type="text/css">
    8 table {border-collapse:collapse; border-style:solid; border-width:2px; border-color:#A0A0A0 #000000 #000000 #A0A0A0}
    9 table {margin:1.4em 0 1.4em 1em}
    10 th {background-color:#E0EBFF; color:#900000; text-align:left}
    11 th, td {border:1px solid #808080; padding:2px 10px}
    12 tr.alt0 {background-color:#FFFFEE}
    13 tr.alt1 {background-color:#FFFFE0}
    14 </style>
    157</head>
    168<body>
    179<h1>Ajout de polices et encodages</h1>
    1810Ce tutoriel explique comment ajouter des polices TrueType, OpenType et Type1 afin de ne plus se
    19 limiter aux polices standard. L'autre intérêt est que l'on peut également choisir l'encodage des
    20 caractères afin d'utiliser d'autres langues (les polices standard ayant trop peu de caractères
    21 disponibles).
     11limiter aux polices standards. L'autre intérêt est que l'on peut également choisir l'encodage des
     12caractères afin d'utiliser d'autres langues (les polices standards ne supportant que l'encodage cp1252).
    2213<br>
    2314<br>
    24 Remarque : pour l'OpenType, seul le format basé sur le TrueType est supporté (pas celui basé sur le Type1).
    25 <br>
    26 <br>
    27 Il y a deux façons d'utiliser une nouvelle police : en l'incorporant ou pas. Lorsqu'une police
    28 n'est pas incorporée, elle est recherchée dans le système. L'avantage est que le fichier PDF est
    29 plus léger ; par contre, si elle n'est pas trouvée, une police de substitution est utilisée. Il
    30 vaut donc mieux s'assurer que le système qui lit le PDF a bien la police installée ; si le fichier
    31 doit être largement diffusé, il est fortement recommandé d'incorporer.
     15Pour l'OpenType, seul le format basé sur le TrueType est supporté (pas celui basé sur le Type1).<br>
     16Pour les Type1, vous devez posséder le fichier AFM correspondant (il est généralement fourni avec la police).
    3217<br>
    3318<br>
     
    3722<li>Déclaration de la police dans le script</li>
    3823</ul>
    39 Pour les Type1, vous devez posséder le fichier AFM correspondant. Il est généralement fourni avec la police.
    4024
    4125<h2>Génération du fichier de définition de police</h2>
     
    4529<br>
    4630<br>
    47 <code>MakeFont(<b>string</b> fontfile, [, <b>string</b> enc [, <b>boolean</b> embed]])</code>
     31<code>MakeFont(<b>string</b> fontfile [, <b>string</b> enc [, <b>boolean</b> embed [, <b>boolean</b> subset]]])</code>
    4832<dl class="param" style="margin-bottom:2em">
    4933<dt><code>fontfile</code></dt>
     
    5842<dd>
    5943<p>Indique si la police doit être incorporée ou non. Valeur par défaut : <code>true</code>.</p>
     44</dd>
     45<dt><code>subset</code></dt>
     46<dd>
     47<p>Indique si le subsetting doit être utilisé. Valeur par défaut : <code>true</code>.</p>
    6048</dd>
    6149</dl>
     
    9684<br>
    9785<br>
    98 Remarque : les polices standard utilisent cp1252.
     86Le troisième paramètre indique si la police doit être incorporée ou non. Lorsqu'une police
     87n'est pas incorporée, elle est recherchée dans le système. L'avantage est que le fichier PDF est
     88plus léger ; par contre, si elle n'est pas trouvée, une police de substitution est utilisée. Il
     89vaut donc mieux s'assurer que le système qui lit le PDF a bien la police installée. Pour assurer
     90un rendu correct dans tous les cas, il est fortement recommandé d'incorporer.
     91<br>
     92<br>
     93Le dernier paramètre indique si le subsetting doit être utilisé, c'est-à-dire si seuls les
     94caractères de l'encodage spécifié doivent être conservés dans la police incorporée. Cela
     95permet de réduire de manière importante la taille du fichier PDF, surtout si la police
     96d'origine était volumineuse.
    9997<br>
    10098<br>
     
    112110<span class="kw">require(</span><span class="str">'makefont/makefont.php'</span><span class="kw">);
    113111
    114 </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">);
     112</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">);
    115113</span>?&gt;</code></pre>
    116114</div>
     
    125123<br>
    126124<br>
    127 <kbd>php makefont\makefont.php c:\Windows\Fonts\comic.ttf cp1252</kbd>
     125<kbd>php makefont\makefont.php C:\Windows\Fonts\comic.ttf cp1252</kbd>
    128126<br>
    129127<br>
    130 Enfin, pour les polices TrueType et OpenType, il est possible de générer les fichier
     128Enfin, pour les polices TrueType et OpenType, il est possible de générer les fichiers
    131129<a href="http://www.fpdf.org/makefont/">en ligne</a> au lieu de le faire manuellement.
    132130
     
    189187</div>
    190188<p class='demo'><a href='tuto7.php' target='_blank' class='demo'>[Démo]</a></p>
    191 
    192 <h2>A propos du symbole euro</h2>
    193 Le caractère euro n'est pas présent dans tous les encodages, et n'est pas toujours situé à la
    194 même position :
    195 <table>
    196 <tr><th>Encodage</th><th>Position</th></tr>
    197 <tr class="alt0"><td>cp1250</td><td>128</td></tr>
    198 <tr class="alt1"><td>cp1251</td><td>136</td></tr>
    199 <tr class="alt0"><td>cp1252</td><td>128</td></tr>
    200 <tr class="alt1"><td>cp1253</td><td>128</td></tr>
    201 <tr class="alt0"><td>cp1254</td><td>128</td></tr>
    202 <tr class="alt1"><td>cp1255</td><td>128</td></tr>
    203 <tr class="alt0"><td>cp1257</td><td>128</td></tr>
    204 <tr class="alt1"><td>cp1258</td><td>128</td></tr>
    205 <tr class="alt0"><td>cp874</td><td>128</td></tr>
    206 <tr class="alt1"><td>ISO-8859-1</td><td>absent</td></tr>
    207 <tr class="alt0"><td>ISO-8859-2</td><td>absent</td></tr>
    208 <tr class="alt1"><td>ISO-8859-4</td><td>absent</td></tr>
    209 <tr class="alt0"><td>ISO-8859-5</td><td>absent</td></tr>
    210 <tr class="alt1"><td>ISO-8859-7</td><td>absent</td></tr>
    211 <tr class="alt0"><td>ISO-8859-9</td><td>absent</td></tr>
    212 <tr class="alt1"><td>ISO-8859-11</td><td>absent</td></tr>
    213 <tr class="alt0"><td>ISO-8859-15</td><td>164</td></tr>
    214 <tr class="alt1"><td>ISO-8859-16</td><td>164</td></tr>
    215 <tr class="alt0"><td>KOI8-R</td><td>absent</td></tr>
    216 <tr class="alt1"><td>KOI8-U</td><td>absent</td></tr>
    217 </table>
    218 ISO-8859-1 est très répandu mais ne comporte pas l'euro. Si vous en avez besoin, le plus simple
    219 consiste à prendre à la place cp1252 ou ISO-8859-15, qui sont pratiquement identiques mais
    220 disposent du précieux caractère.
    221 
    222 <h2>Réduction de la taille des polices TrueType</h2>
    223 Les fichiers de police sont souvent volumineux ; c'est dû au fait qu'ils contiennent les caractères
    224 correspondant à de nombreux encodages. La compression par Zlib les réduit mais les fichiers restent
    225 encombrants. Il existe une technique pour diminuer la taille de ces fichiers. Elle consiste à convertir
    226 la police en Type1 avec <a href="http://ttf2pt1.sourceforge.net" target="_blank">ttf2pt1</a> (l'exécutable
    227 pour Windows est disponible <a href="http://www.fpdf.org/fr/dl.php?id=21">ici</a>) en précisant
    228 l'encodage qui nous intéresse ; tous les autres caractères sont écartés.
    229 <br>
    230 Par exemple, la police arial.ttf livrée avec Windows Vista fait 748 ko (elle contient 3381 caractères).
    231 Compressée, elle en fait 411. Convertissons-là en Type1 en ne conservant que les caractères correspondant
    232 à l'encodage cp1250 :
    233 <br>
    234 <br>
    235 <kbd>ttf2pt1 -b -L cp1250.map c:\Windows\Fonts\arial.ttf arial</kbd>
    236 <br>
    237 <br>
    238 Les fichiers .map se trouvent dans le répertoire makefont de l'archive. On obtient alors
    239 les fichiers arial.pfb et arial.afm. arial.pfb ne fait plus que 57 ko, et 53 après compression.
    240 <br>
    241 <br>
    242 Il est possible d'aller encore plus loin. Si vous n'êtes intéressé que par un sous-ensemble de l'encodage
    243 (il est peu probable que vous ayez besoin des 217 caractères), vous pouvez ouvrir le fichier .map et
    244 enlever les lignes qui ne vous intéressent pas. Cela réduira d'autant la taille du fichier obtenu.
    245189</body>
    246190</html>
  • _plugins_/fpdf/demo/tutorial/tuto7.php

    r55912 r99921  
    33require('../fpdf.php');
    44
    5 $pdf=new FPDF();
     5$pdf = new FPDF();
    66$pdf->AddFont('Calligrapher','','calligra.php');
    77$pdf->AddPage();
  • _plugins_/fpdf/font/courier.php

    r55790 r99921  
    66for($i=0;$i<=255;$i++)
    77        $cw[chr($i)] = 600;
     8$enc = 'cp1252';
     9$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));
    810?>
  • _plugins_/fpdf/font/courierb.php

    r55790 r99921  
    66for($i=0;$i<=255;$i++)
    77        $cw[chr($i)] = 600;
     8$enc = 'cp1252';
     9$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));
    810?>
  • _plugins_/fpdf/font/courierbi.php

    r55790 r99921  
    66for($i=0;$i<=255;$i++)
    77        $cw[chr($i)] = 600;
     8$enc = 'cp1252';
     9$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));
    810?>
  • _plugins_/fpdf/font/courieri.php

    r55790 r99921  
    66for($i=0;$i<=255;$i++)
    77        $cw[chr($i)] = 600;
     8$enc = 'cp1252';
     9$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));
    810?>
  • _plugins_/fpdf/font/helvetica.php

    r55790 r99921  
    1717        chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
    1818        chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
     19$enc = 'cp1252';
     20$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));
    1921?>
  • _plugins_/fpdf/font/helveticab.php

    r55790 r99921  
    1717        chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
    1818        chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
     19$enc = 'cp1252';
     20$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));
    1921?>
  • _plugins_/fpdf/font/helveticabi.php

    r55790 r99921  
    1717        chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
    1818        chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
     19$enc = 'cp1252';
     20$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));
    1921?>
  • _plugins_/fpdf/font/helveticai.php

    r55790 r99921  
    1717        chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
    1818        chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
     19$enc = 'cp1252';
     20$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));
    1921?>
  • _plugins_/fpdf/font/symbol.php

    r55790 r99921  
    1717        chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329,
    1818        chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0);
     19$uv = array(32=>160,33=>33,34=>8704,35=>35,36=>8707,37=>array(37,2),39=>8715,40=>array(40,2),42=>8727,43=>array(43,2),45=>8722,46=>array(46,18),64=>8773,65=>array(913,2),67=>935,68=>array(916,2),70=>934,71=>915,72=>919,73=>921,74=>977,75=>array(922,4),79=>array(927,2),81=>920,82=>929,83=>array(931,3),86=>962,87=>937,88=>926,89=>936,90=>918,91=>91,92=>8756,93=>93,94=>8869,95=>95,96=>63717,97=>array(945,2),99=>967,100=>array(948,2),102=>966,103=>947,104=>951,105=>953,106=>981,107=>array(954,4),111=>array(959,2),113=>952,114=>961,115=>array(963,3),118=>982,119=>969,120=>958,121=>968,122=>950,123=>array(123,3),126=>8764,160=>8364,161=>978,162=>8242,163=>8804,164=>8725,165=>8734,166=>402,167=>9827,168=>9830,169=>9829,170=>9824,171=>8596,172=>array(8592,4),176=>array(176,2),178=>8243,179=>8805,180=>215,181=>8733,182=>8706,183=>8226,184=>247,185=>array(8800,2),187=>8776,188=>8230,189=>array(63718,2),191=>8629,192=>8501,193=>8465,194=>8476,195=>8472,196=>8855,197=>8853,198=>8709,199=>array(8745,2),201=>8835,202=>8839,203=>8836,204=>8834,205=>8838,206=>array(8712,2),208=>8736,209=>8711,210=>63194,211=>63193,212=>63195,213=>8719,214=>8730,215=>8901,216=>172,217=>array(8743,2),219=>8660,220=>array(8656,4),224=>9674,225=>9001,226=>array(63720,3),229=>8721,230=>array(63723,10),241=>9002,242=>8747,243=>8992,244=>63733,245=>8993,246=>array(63734,9));
    1920?>
  • _plugins_/fpdf/font/times.php

    r55790 r99921  
    1717        chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
    1818        chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500);
     19$enc = 'cp1252';
     20$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));
    1921?>
  • _plugins_/fpdf/font/timesb.php

    r55790 r99921  
    1717        chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
    1818        chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
     19$enc = 'cp1252';
     20$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));
    1921?>
  • _plugins_/fpdf/font/timesbi.php

    r55790 r99921  
    1717        chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
    1818        chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444);
     19$enc = 'cp1252';
     20$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));
    1921?>
  • _plugins_/fpdf/font/timesi.php

    r55790 r99921  
    1717        chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
    1818        chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444);
     19$enc = 'cp1252';
     20$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));
    1921?>
  • _plugins_/fpdf/font/zapfdingbats.php

    r55790 r99921  
    1717        chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874,
    1818        chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0);
     19$uv = array(32=>32,33=>array(9985,4),37=>9742,38=>array(9990,4),42=>9755,43=>9758,44=>array(9996,28),72=>9733,73=>array(10025,35),108=>9679,109=>10061,110=>9632,111=>array(10063,4),115=>9650,116=>9660,117=>9670,118=>10070,119=>9687,120=>array(10072,7),128=>array(10088,14),161=>array(10081,7),168=>9827,169=>9830,170=>9829,171=>9824,172=>array(9312,10),182=>array(10102,31),213=>8594,214=>array(8596,2),216=>array(10136,24),241=>array(10161,14));
    1920?>
  • _plugins_/fpdf/fpdf.php

    r55790 r99921  
    33* FPDF                                                                         *
    44*                                                                              *
    5 * Version: 1.7                                                                 *
    6 * Date:    2011-06-18                                                          *
     5* Version: 1.81                                                                *
     6* Date:    2015-12-20                                                          *
    77* Author:  Olivier PLATHEY                                                     *
    88*******************************************************************************/
    99
    10 define('FPDF_VERSION','1.7');
     10define('FPDF_VERSION','1.81');
    1111
    1212class FPDF
    1313{
    14 var $page;               // current page number
    15 var $n;                  // current object number
    16 var $offsets;            // array of object offsets
    17 var $buffer;             // buffer holding in-memory PDF
    18 var $pages;              // array containing pages
    19 var $state;              // current document state
    20 var $compress;           // compression flag
    21 var $k;                  // scale factor (number of points in user unit)
    22 var $DefOrientation;     // default orientation
    23 var $CurOrientation;     // current orientation
    24 var $StdPageSizes;       // standard page sizes
    25 var $DefPageSize;        // default page size
    26 var $CurPageSize;        // current page size
    27 var $PageSizes;          // used for pages with non default sizes or orientations
    28 var $wPt, $hPt;          // dimensions of current page in points
    29 var $w, $h;              // dimensions of current page in user unit
    30 var $lMargin;            // left margin
    31 var $tMargin;            // top margin
    32 var $rMargin;            // right margin
    33 var $bMargin;            // page break margin
    34 var $cMargin;            // cell margin
    35 var $x, $y;              // current position in user unit
    36 var $lasth;              // height of last printed cell
    37 var $LineWidth;          // line width in user unit
    38 var $fontpath;           // path containing fonts
    39 var $CoreFonts;          // array of core font names
    40 var $fonts;              // array of used fonts
    41 var $FontFiles;          // array of font files
    42 var $diffs;              // array of encoding differences
    43 var $FontFamily;         // current font family
    44 var $FontStyle;          // current font style
    45 var $underline;          // underlining flag
    46 var $CurrentFont;        // current font info
    47 var $FontSizePt;         // current font size in points
    48 var $FontSize;           // current font size in user unit
    49 var $DrawColor;          // commands for drawing color
    50 var $FillColor;          // commands for filling color
    51 var $TextColor;          // commands for text color
    52 var $ColorFlag;          // indicates whether fill and text colors are different
    53 var $ws;                 // word spacing
    54 var $images;             // array of used images
    55 var $PageLinks;          // array of links in pages
    56 var $links;              // array of internal links
    57 var $AutoPageBreak;      // automatic page breaking
    58 var $PageBreakTrigger;   // threshold used to trigger page breaks
    59 var $InHeader;           // flag set when processing header
    60 var $InFooter;           // flag set when processing footer
    61 var $ZoomMode;           // zoom display mode
    62 var $LayoutMode;         // layout display mode
    63 var $title;              // title
    64 var $subject;            // subject
    65 var $author;             // author
    66 var $keywords;           // keywords
    67 var $creator;            // creator
    68 var $AliasNbPages;       // alias for total number of pages
    69 var $PDFVersion;         // PDF version number
     14protected $page;               // current page number
     15protected $n;                  // current object number
     16protected $offsets;            // array of object offsets
     17protected $buffer;             // buffer holding in-memory PDF
     18protected $pages;              // array containing pages
     19protected $state;              // current document state
     20protected $compress;           // compression flag
     21protected $k;                  // scale factor (number of points in user unit)
     22protected $DefOrientation;     // default orientation
     23protected $CurOrientation;     // current orientation
     24protected $StdPageSizes;       // standard page sizes
     25protected $DefPageSize;        // default page size
     26protected $CurPageSize;        // current page size
     27protected $CurRotation;        // current page rotation
     28protected $PageInfo;           // page-related data
     29protected $wPt, $hPt;          // dimensions of current page in points
     30protected $w, $h;              // dimensions of current page in user unit
     31protected $lMargin;            // left margin
     32protected $tMargin;            // top margin
     33protected $rMargin;            // right margin
     34protected $bMargin;            // page break margin
     35protected $cMargin;            // cell margin
     36protected $x, $y;              // current position in user unit
     37protected $lasth;              // height of last printed cell
     38protected $LineWidth;          // line width in user unit
     39protected $fontpath;           // path containing fonts
     40protected $CoreFonts;          // array of core font names
     41protected $fonts;              // array of used fonts
     42protected $FontFiles;          // array of font files
     43protected $encodings;          // array of encodings
     44protected $cmaps;              // array of ToUnicode CMaps
     45protected $FontFamily;         // current font family
     46protected $FontStyle;          // current font style
     47protected $underline;          // underlining flag
     48protected $CurrentFont;        // current font info
     49protected $FontSizePt;         // current font size in points
     50protected $FontSize;           // current font size in user unit
     51protected $DrawColor;          // commands for drawing color
     52protected $FillColor;          // commands for filling color
     53protected $TextColor;          // commands for text color
     54protected $ColorFlag;          // indicates whether fill and text colors are different
     55protected $WithAlpha;          // indicates whether alpha channel is used
     56protected $ws;                 // word spacing
     57protected $images;             // array of used images
     58protected $PageLinks;          // array of links in pages
     59protected $links;              // array of internal links
     60protected $AutoPageBreak;      // automatic page breaking
     61protected $PageBreakTrigger;   // threshold used to trigger page breaks
     62protected $InHeader;           // flag set when processing header
     63protected $InFooter;           // flag set when processing footer
     64protected $AliasNbPages;       // alias for total number of pages
     65protected $ZoomMode;           // zoom display mode
     66protected $LayoutMode;         // layout display mode
     67protected $metadata;           // document properties
     68protected $PDFVersion;         // PDF version number
    7069
    7170/*******************************************************************************
    72 *                                                                              *
    7371*                               Public methods                                 *
    74 *                                                                              *
    7572*******************************************************************************/
    76 function FPDF($orientation='P', $unit='mm', $size='A4')
     73
     74function __construct($orientation='P', $unit='mm', $size='A4')
    7775{
    7876        // Some checks
    7977        $this->_dochecks();
    8078        // Initialization of properties
     79        $this->state = 0;
    8180        $this->page = 0;
    8281        $this->n = 2;
    8382        $this->buffer = '';
    8483        $this->pages = array();
    85         $this->PageSizes = array();
    86         $this->state = 0;
     84        $this->PageInfo = array();
    8785        $this->fonts = array();
    8886        $this->FontFiles = array();
    89         $this->diffs = array();
     87        $this->encodings = array();
     88        $this->cmaps = array();
    9089        $this->images = array();
    9190        $this->links = array();
     
    101100        $this->TextColor = '0 g';
    102101        $this->ColorFlag = false;
     102        $this->WithAlpha = false;
    103103        $this->ws = 0;
    104104        // Font path
     
    151151        $this->wPt = $this->w*$this->k;
    152152        $this->hPt = $this->h*$this->k;
     153        // Page rotation
     154        $this->CurRotation = 0;
    153155        // Page margins (1 cm)
    154156        $margin = 28.35/$this->k;
     
    231233{
    232234        // Title of document
    233         if($isUTF8)
    234                 $title = $this->_UTF8toUTF16($title);
    235         $this->title = $title;
     235        $this->metadata['Title'] = $isUTF8 ? $title : utf8_encode($title);
     236}
     237
     238function SetAuthor($author, $isUTF8=false)
     239{
     240        // Author of document
     241        $this->metadata['Author'] = $isUTF8 ? $author : utf8_encode($author);
    236242}
    237243
     
    239245{
    240246        // Subject of document
    241         if($isUTF8)
    242                 $subject = $this->_UTF8toUTF16($subject);
    243         $this->subject = $subject;
    244 }
    245 
    246 function SetAuthor($author, $isUTF8=false)
    247 {
    248         // Author of document
    249         if($isUTF8)
    250                 $author = $this->_UTF8toUTF16($author);
    251         $this->author = $author;
     247        $this->metadata['Subject'] = $isUTF8 ? $subject : utf8_encode($subject);
    252248}
    253249
     
    255251{
    256252        // Keywords of document
    257         if($isUTF8)
    258                 $keywords = $this->_UTF8toUTF16($keywords);
    259         $this->keywords = $keywords;
     253        $this->metadata['Keywords'] = $isUTF8 ? $keywords : utf8_encode($keywords);
    260254}
    261255
     
    263257{
    264258        // Creator of document
    265         if($isUTF8)
    266                 $creator = $this->_UTF8toUTF16($creator);
    267         $this->creator = $creator;
     259        $this->metadata['Creator'] = $isUTF8 ? $creator : utf8_encode($creator);
    268260}
    269261
     
    277269{
    278270        // Fatal error
    279         die('<b>FPDF error:</b> '.$msg);
    280 }
    281 
    282 function Open()
    283 {
    284         // Begin document
    285         $this->state = 1;
     271        throw new Exception('FPDF error: '.$msg);
    286272}
    287273
     
    303289}
    304290
    305 function AddPage($orientation='', $size='')
     291function AddPage($orientation='', $size='', $rotation=0)
    306292{
    307293        // Start a new page
    308         if($this->state==0)
    309                 $this->Open();
     294        if($this->state==3)
     295                $this->Error('The document is closed');
    310296        $family = $this->FontFamily;
    311297        $style = $this->FontStyle.($this->underline ? 'U' : '');
     
    326312        }
    327313        // Start new page
    328         $this->_beginpage($orientation,$size);
     314        $this->_beginpage($orientation,$size,$rotation);
    329315        // Set line cap style to square
    330316        $this->_out('2 J');
     
    473459        $info = $this->_loadfont($file);
    474460        $info['i'] = count($this->fonts)+1;
    475         if(!empty($info['diff']))
    476         {
    477                 // Search existing encodings
    478                 $n = array_search($info['diff'],$this->diffs);
    479                 if(!$n)
    480                 {
    481                         $n = count($this->diffs)+1;
    482                         $this->diffs[$n] = $info['diff'];
    483                 }
    484                 $info['diffn'] = $n;
    485         }
    486461        if(!empty($info['file']))
    487462        {
     
    583558{
    584559        // Output a string
     560        if(!isset($this->CurrentFont))
     561                $this->Error('No font has been set');
    585562        $s = sprintf('BT %.2F %.2F Td (%s) Tj ET',$x*$this->k,($this->h-$y)*$this->k,$this->_escape($txt));
    586563        if($this->underline && $txt!='')
     
    611588                        $this->_out('0 Tw');
    612589                }
    613                 $this->AddPage($this->CurOrientation,$this->CurPageSize);
     590                $this->AddPage($this->CurOrientation,$this->CurPageSize,$this->CurRotation);
    614591                $this->x = $x;
    615592                if($ws>0)
     
    645622        if($txt!=='')
    646623        {
     624                if(!isset($this->CurrentFont))
     625                        $this->Error('No font has been set');
    647626                if($align=='R')
    648627                        $dx = $w-$this->cMargin-$this->GetStringWidth($txt);
     
    653632                if($this->ColorFlag)
    654633                        $s .= 'q '.$this->TextColor.' ';
    655                 $txt2 = str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',$txt)));
    656                 $s .= sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$txt2);
     634                $s .= sprintf('BT %.2F %.2F Td (%s) Tj ET',($this->x+$dx)*$k,($this->h-($this->y+.5*$h+.3*$this->FontSize))*$k,$this->_escape($txt));
    657635                if($this->underline)
    658636                        $s .= ' '.$this->_dounderline($this->x+$dx,$this->y+.5*$h+.3*$this->FontSize,$txt);
     
    679657{
    680658        // Output text with automatic or explicit line breaks
     659        if(!isset($this->CurrentFont))
     660                $this->Error('No font has been set');
    681661        $cw = &$this->CurrentFont['cw'];
    682662        if($w==0)
     
    792772{
    793773        // Output text in flowing mode
     774        if(!isset($this->CurrentFont))
     775                $this->Error('No font has been set');
    794776        $cw = &$this->CurrentFont['cw'];
    795777        $w = $this->w-$this->rMargin-$this->x;
     
    809791                {
    810792                        // Explicit line break
    811                         $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
     793                        $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',false,$link);
    812794                        $i++;
    813795                        $sep = -1;
     
    844826                                if($i==$j)
    845827                                        $i++;
    846                                 $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
     828                                $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',false,$link);
    847829                        }
    848830                        else
    849831                        {
    850                                 $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link);
     832                                $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',false,$link);
    851833                                $i = $sep+1;
    852834                        }
     
    867849        // Last chunk
    868850        if($i!=$j)
    869                 $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',0,$link);
     851                $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j),0,0,'',false,$link);
    870852}
    871853
    872854function Ln($h=null)
    873855{
    874         // Line feed; default value is last cell height
     856        // Line feed; default value is the last cell height
    875857        $this->x = $this->lMargin;
    876858        if($h===null)
     
    883865{
    884866        // Put an image on the page
     867        if($file=='')
     868                $this->Error('Image file name is empty');
    885869        if(!isset($this->images[$file]))
    886870        {
     
    929913                        // Automatic page break
    930914                        $x2 = $this->x;
    931                         $this->AddPage($this->CurOrientation,$this->CurPageSize);
     915                        $this->AddPage($this->CurOrientation,$this->CurPageSize,$this->CurRotation);
    932916                        $this->x = $x2;
    933917                }
     
    943927}
    944928
     929function GetPageWidth()
     930{
     931        // Get current page width
     932        return $this->w;
     933}
     934
     935function GetPageHeight()
     936{
     937        // Get current page height
     938        return $this->h;
     939}
     940
    945941function GetX()
    946942{
     
    964960}
    965961
    966 function SetY($y)
    967 {
    968         // Set y position and reset x
    969         $this->x = $this->lMargin;
     962function SetY($y, $resetX=true)
     963{
     964        // Set y position and optionally reset x
    970965        if($y>=0)
    971966                $this->y = $y;
    972967        else
    973968                $this->y = $this->h+$y;
     969        if($resetX)
     970                $this->x = $this->lMargin;
    974971}
    975972
     
    977974{
    978975        // Set x and y positions
    979         $this->SetY($y);
    980976        $this->SetX($x);
    981 }
    982 
    983 function Output($name='', $dest='')
     977        $this->SetY($y,false);
     978}
     979
     980function Output($dest='', $name='', $isUTF8=false)
    984981{
    985982        // Output PDF to some destination
    986         if($this->state<3)
    987                 $this->Close();
    988         $dest = strtoupper($dest);
     983        $this->Close();
     984        if(strlen($name)==1 && strlen($dest)!=1)
     985        {
     986                // Fix parameter order
     987                $tmp = $dest;
     988                $dest = $name;
     989                $name = $tmp;
     990        }
    989991        if($dest=='')
    990         {
    991                 if($name=='')
    992                 {
    993                         $name = 'doc.pdf';
    994                         $dest = 'I';
    995                 }
    996                 else
    997                         $dest = 'F';
    998         }
    999         switch($dest)
     992                $dest = 'I';
     993        if($name=='')
     994                $name = 'doc.pdf';
     995        switch(strtoupper($dest))
    1000996        {
    1001997                case 'I':
     
    10061002                                // We send to a browser
    10071003                                header('Content-Type: application/pdf');
    1008                                 header('Content-Disposition: inline; filename="'.$name.'"');
     1004                                header('Content-Disposition: inline; '.$this->_httpencode('filename',$name,$isUTF8));
    10091005                                header('Cache-Control: private, max-age=0, must-revalidate');
    10101006                                header('Pragma: public');
     
    10161012                        $this->_checkoutput();
    10171013                        header('Content-Type: application/x-download');
    1018                         header('Content-Disposition: attachment; filename="'.$name.'"');
     1014                        header('Content-Disposition: attachment; '.$this->_httpencode('filename',$name,$isUTF8));
    10191015                        header('Cache-Control: private, max-age=0, must-revalidate');
    10201016                        header('Pragma: public');
     
    10231019                case 'F':
    10241020                        // Save to local file
    1025                         $f = fopen($name,'wb');
    1026                         if(!$f)
     1021                        if(!file_put_contents($name,$this->buffer))
    10271022                                $this->Error('Unable to create output file: '.$name);
    1028                         fwrite($f,$this->buffer,strlen($this->buffer));
    1029                         fclose($f);
    10301023                        break;
    10311024                case 'S':
     
    10391032
    10401033/*******************************************************************************
    1041 *                                                                              *
    10421034*                              Protected methods                               *
    1043 *                                                                              *
    10441035*******************************************************************************/
    1045 function _dochecks()
    1046 {
    1047         // Check availability of %F
    1048         if(sprintf('%.1F',1.0)!='1.0')
    1049                 $this->Error('This version of PHP is not supported');
     1036
     1037protected function _dochecks()
     1038{
    10501039        // Check mbstring overloading
    10511040        if(ini_get('mbstring.func_overload') & 2)
     
    10561045}
    10571046
    1058 function _checkoutput()
     1047protected function _checkoutput()
    10591048{
    10601049        if(PHP_SAPI!='cli')
     
    10761065}
    10771066
    1078 function _getpagesize($size)
     1067protected function _getpagesize($size)
    10791068{
    10801069        if(is_string($size))
     
    10951084}
    10961085
    1097 function _beginpage($orientation, $size)
     1086protected function _beginpage($orientation, $size, $rotation)
    10981087{
    10991088        $this->page++;
     
    11321121        }
    11331122        if($orientation!=$this->DefOrientation || $size[0]!=$this->DefPageSize[0] || $size[1]!=$this->DefPageSize[1])
    1134                 $this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
    1135 }
    1136 
    1137 function _endpage()
     1123                $this->PageInfo[$this->page]['size'] = array($this->wPt, $this->hPt);
     1124        if($rotation!=0)
     1125        {
     1126                if($rotation%90!=0)
     1127                        $this->Error('Incorrect rotation value: '.$rotation);
     1128                $this->CurRotation = $rotation;
     1129                $this->PageInfo[$this->page]['rotation'] = $rotation;
     1130        }
     1131}
     1132
     1133protected function _endpage()
    11381134{
    11391135        $this->state = 1;
    11401136}
    11411137
    1142 function _loadfont($font)
     1138protected function _loadfont($font)
    11431139{
    11441140        // Load a font definition file from the font directory
     1141        if(strpos($font,'/')!==false || strpos($font,"\\")!==false)
     1142                $this->Error('Incorrect font definition file name: '.$font);
    11451143        include($this->fontpath.$font);
    1146         $a = get_defined_vars();
    1147         if(!isset($a['name']))
     1144        if(!isset($name))
    11481145                $this->Error('Could not include font definition file');
    1149         return $a;
    1150 }
    1151 
    1152 function _escape($s)
    1153 {
    1154         // Escape special characters in strings
    1155         $s = str_replace('\\','\\\\',$s);
    1156         $s = str_replace('(','\\(',$s);
    1157         $s = str_replace(')','\\)',$s);
    1158         $s = str_replace("\r",'\\r',$s);
    1159         return $s;
    1160 }
    1161 
    1162 function _textstring($s)
    1163 {
    1164         // Format a text string
    1165         return '('.$this->_escape($s).')';
    1166 }
    1167 
    1168 function _UTF8toUTF16($s)
     1146        if(isset($enc))
     1147                $enc = strtolower($enc);
     1148        if(!isset($subsetted))
     1149                $subsetted = false;
     1150        return get_defined_vars();
     1151}
     1152
     1153protected function _isascii($s)
     1154{
     1155        // Test if string is ASCII
     1156        $nb = strlen($s);
     1157        for($i=0;$i<$nb;$i++)
     1158        {
     1159                if(ord($s[$i])>127)
     1160                        return false;
     1161        }
     1162        return true;
     1163}
     1164
     1165protected function _httpencode($param, $value, $isUTF8)
     1166{
     1167        // Encode HTTP header field parameter
     1168        if($this->_isascii($value))
     1169                return $param.'="'.$value.'"';
     1170        if(!$isUTF8)
     1171                $value = utf8_encode($value);
     1172        if(strpos($_SERVER['HTTP_USER_AGENT'],'MSIE')!==false)
     1173                return $param.'="'.rawurlencode($value).'"';
     1174        else
     1175                return $param."*=UTF-8''".rawurlencode($value);
     1176}
     1177
     1178protected function _UTF8toUTF16($s)
    11691179{
    11701180        // Convert UTF-8 to UTF-16BE with BOM
     
    11991209}
    12001210
    1201 function _dounderline($x, $y, $txt)
     1211protected function _escape($s)
     1212{
     1213        // Escape special characters
     1214        if(strpos($s,'(')!==false || strpos($s,')')!==false || strpos($s,'\\')!==false || strpos($s,"\r")!==false)
     1215                return str_replace(array('\\','(',')',"\r"), array('\\\\','\\(','\\)','\\r'), $s);
     1216        else
     1217                return $s;
     1218}
     1219
     1220protected function _textstring($s)
     1221{
     1222        // Format a text string
     1223        if(!$this->_isascii($s))
     1224                $s = $this->_UTF8toUTF16($s);
     1225        return '('.$this->_escape($s).')';
     1226}
     1227
     1228protected function _dounderline($x, $y, $txt)
    12021229{
    12031230        // Underline text
     
    12081235}
    12091236
    1210 function _parsejpg($file)
     1237protected function _parsejpg($file)
    12111238{
    12121239        // Extract info from a JPEG file
     
    12271254}
    12281255
    1229 function _parsepng($file)
     1256protected function _parsepng($file)
    12301257{
    12311258        // Extract info from a PNG file
     
    12381265}
    12391266
    1240 function _parsepngstream($f, $file)
     1267protected function _parsepngstream($f, $file)
    12411268{
    12421269        // Check signature
     
    13561383                $data = gzcompress($color);
    13571384                $info['smask'] = gzcompress($alpha);
     1385                $this->WithAlpha = true;
    13581386                if($this->PDFVersion<'1.4')
    13591387                        $this->PDFVersion = '1.4';
     
    13631391}
    13641392
    1365 function _readstream($f, $n)
     1393protected function _readstream($f, $n)
    13661394{
    13671395        // Read n bytes from stream
     
    13801408}
    13811409
    1382 function _readint($f)
     1410protected function _readint($f)
    13831411{
    13841412        // Read a 4-byte integer from stream
     
    13871415}
    13881416
    1389 function _parsegif($file)
     1417protected function _parsegif($file)
    13901418{
    13911419        // Extract info from a GIF file (via PNG conversion)
     
    13981426                $this->Error('Missing or incorrect image file: '.$file);
    13991427        imageinterlace($im,0);
    1400         $f = @fopen('php://temp','rb+');
    1401         if($f)
    1402         {
    1403                 // Perform conversion in memory
    1404                 ob_start();
    1405                 imagepng($im);
    1406                 $data = ob_get_clean();
    1407                 imagedestroy($im);
    1408                 fwrite($f,$data);
    1409                 rewind($f);
    1410                 $info = $this->_parsepngstream($f,$file);
    1411                 fclose($f);
    1412         }
    1413         else
    1414         {
    1415                 // Use temporary file
    1416                 $tmp = tempnam('.','gif');
    1417                 if(!$tmp)
    1418                         $this->Error('Unable to create a temporary file');
    1419                 if(!imagepng($im,$tmp))
    1420                         $this->Error('Error while saving to temporary file');
    1421                 imagedestroy($im);
    1422                 $info = $this->_parsepng($tmp);
    1423                 unlink($tmp);
    1424         }
     1428        ob_start();
     1429        imagepng($im);
     1430        $data = ob_get_clean();
     1431        imagedestroy($im);
     1432        $f = fopen('php://temp','rb+');
     1433        if(!$f)
     1434                $this->Error('Unable to create memory stream');
     1435        fwrite($f,$data);
     1436        rewind($f);
     1437        $info = $this->_parsepngstream($f,$file);
     1438        fclose($f);
    14251439        return $info;
    14261440}
    14271441
    1428 function _newobj()
    1429 {
    1430         // Begin a new object
    1431         $this->n++;
    1432         $this->offsets[$this->n] = strlen($this->buffer);
    1433         $this->_out($this->n.' 0 obj');
    1434 }
    1435 
    1436 function _putstream($s)
    1437 {
    1438         $this->_out('stream');
    1439         $this->_out($s);
    1440         $this->_out('endstream');
    1441 }
    1442 
    1443 function _out($s)
     1442protected function _out($s)
    14441443{
    14451444        // Add a line to the document
    14461445        if($this->state==2)
    14471446                $this->pages[$this->page] .= $s."\n";
    1448         else
    1449                 $this->buffer .= $s."\n";
    1450 }
    1451 
    1452 function _putpages()
     1447        elseif($this->state==1)
     1448                $this->_put($s);
     1449        elseif($this->state==0)
     1450                $this->Error('No page has been added yet');
     1451        elseif($this->state==3)
     1452                $this->Error('The document is closed');
     1453}
     1454
     1455protected function _put($s)
     1456{
     1457        $this->buffer .= $s."\n";
     1458}
     1459
     1460protected function _getoffset()
     1461{
     1462        return strlen($this->buffer);
     1463}
     1464
     1465protected function _newobj($n=null)
     1466{
     1467        // Begin a new object
     1468        if($n===null)
     1469                $n = ++$this->n;
     1470        $this->offsets[$n] = $this->_getoffset();
     1471        $this->_put($n.' 0 obj');
     1472}
     1473
     1474protected function _putstream($data)
     1475{
     1476        $this->_put('stream');
     1477        $this->_put($data);
     1478        $this->_put('endstream');
     1479}
     1480
     1481protected function _putstreamobject($data)
     1482{
     1483        if($this->compress)
     1484        {
     1485                $entries = '/Filter /FlateDecode ';
     1486                $data = gzcompress($data);
     1487        }
     1488        else
     1489                $entries = '';
     1490        $entries .= '/Length '.strlen($data);
     1491        $this->_newobj();
     1492        $this->_put('<<'.$entries.'>>');
     1493        $this->_putstream($data);
     1494        $this->_put('endobj');
     1495}
     1496
     1497protected function _putpage($n)
     1498{
     1499        $this->_newobj();
     1500        $this->_put('<</Type /Page');
     1501        $this->_put('/Parent 1 0 R');
     1502        if(isset($this->PageInfo[$n]['size']))
     1503                $this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageInfo[$n]['size'][0],$this->PageInfo[$n]['size'][1]));
     1504        if(isset($this->PageInfo[$n]['rotation']))
     1505                $this->_put('/Rotate '.$this->PageInfo[$n]['rotation']);
     1506        $this->_put('/Resources 2 0 R');
     1507        if(isset($this->PageLinks[$n]))
     1508        {
     1509                // Links
     1510                $annots = '/Annots [';
     1511                foreach($this->PageLinks[$n] as $pl)
     1512                {
     1513                        $rect = sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
     1514                        $annots .= '<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
     1515                        if(is_string($pl[4]))
     1516                                $annots .= '/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
     1517                        else
     1518                        {
     1519                                $l = $this->links[$pl[4]];
     1520                                if(isset($this->PageInfo[$l[0]]['size']))
     1521                                        $h = $this->PageInfo[$l[0]]['size'][1];
     1522                                else
     1523                                        $h = ($this->DefOrientation=='P') ? $this->DefPageSize[1]*$this->k : $this->DefPageSize[0]*$this->k;
     1524                                $annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',$this->PageInfo[$l[0]]['n'],$h-$l[1]*$this->k);
     1525                        }
     1526                }
     1527                $this->_put($annots.']');
     1528        }
     1529        if($this->WithAlpha)
     1530                $this->_put('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
     1531        $this->_put('/Contents '.($this->n+1).' 0 R>>');
     1532        $this->_put('endobj');
     1533        // Page content
     1534        if(!empty($this->AliasNbPages))
     1535                $this->pages[$n] = str_replace($this->AliasNbPages,$this->page,$this->pages[$n]);
     1536        $this->_putstreamobject($this->pages[$n]);
     1537}
     1538
     1539protected function _putpages()
    14531540{
    14541541        $nb = $this->page;
    1455         if(!empty($this->AliasNbPages))
    1456         {
    1457                 // Replace number of pages
    1458                 for($n=1;$n<=$nb;$n++)
    1459                         $this->pages[$n] = str_replace($this->AliasNbPages,$nb,$this->pages[$n]);
    1460         }
     1542        for($n=1;$n<=$nb;$n++)
     1543                $this->PageInfo[$n]['n'] = $this->n+1+2*($n-1);
     1544        for($n=1;$n<=$nb;$n++)
     1545                $this->_putpage($n);
     1546        // Pages root
     1547        $this->_newobj(1);
     1548        $this->_put('<</Type /Pages');
     1549        $kids = '/Kids [';
     1550        for($n=1;$n<=$nb;$n++)
     1551                $kids .= $this->PageInfo[$n]['n'].' 0 R ';
     1552        $this->_put($kids.']');
     1553        $this->_put('/Count '.$nb);
    14611554        if($this->DefOrientation=='P')
    14621555        {
    1463                 $wPt = $this->DefPageSize[0]*$this->k;
    1464                 $hPt = $this->DefPageSize[1]*$this->k;
    1465         }
    1466         else
    1467         {
    1468                 $wPt = $this->DefPageSize[1]*$this->k;
    1469                 $hPt = $this->DefPageSize[0]*$this->k;
    1470         }
    1471         $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
    1472         for($n=1;$n<=$nb;$n++)
    1473         {
    1474                 // Page
    1475                 $this->_newobj();
    1476                 $this->_out('<</Type /Page');
    1477                 $this->_out('/Parent 1 0 R');
    1478                 if(isset($this->PageSizes[$n]))
    1479                         $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$this->PageSizes[$n][0],$this->PageSizes[$n][1]));
    1480                 $this->_out('/Resources 2 0 R');
    1481                 if(isset($this->PageLinks[$n]))
    1482                 {
    1483                         // Links
    1484                         $annots = '/Annots [';
    1485                         foreach($this->PageLinks[$n] as $pl)
    1486                         {
    1487                                 $rect = sprintf('%.2F %.2F %.2F %.2F',$pl[0],$pl[1],$pl[0]+$pl[2],$pl[1]-$pl[3]);
    1488                                 $annots .= '<</Type /Annot /Subtype /Link /Rect ['.$rect.'] /Border [0 0 0] ';
    1489                                 if(is_string($pl[4]))
    1490                                         $annots .= '/A <</S /URI /URI '.$this->_textstring($pl[4]).'>>>>';
    1491                                 else
    1492                                 {
    1493                                         $l = $this->links[$pl[4]];
    1494                                         $h = isset($this->PageSizes[$l[0]]) ? $this->PageSizes[$l[0]][1] : $hPt;
    1495                                         $annots .= sprintf('/Dest [%d 0 R /XYZ 0 %.2F null]>>',1+2*$l[0],$h-$l[1]*$this->k);
    1496                                 }
    1497                         }
    1498                         $this->_out($annots.']');
    1499                 }
    1500                 if($this->PDFVersion>'1.3')
    1501                         $this->_out('/Group <</Type /Group /S /Transparency /CS /DeviceRGB>>');
    1502                 $this->_out('/Contents '.($this->n+1).' 0 R>>');
    1503                 $this->_out('endobj');
    1504                 // Page content
    1505                 $p = ($this->compress) ? gzcompress($this->pages[$n]) : $this->pages[$n];
    1506                 $this->_newobj();
    1507                 $this->_out('<<'.$filter.'/Length '.strlen($p).'>>');
    1508                 $this->_putstream($p);
    1509                 $this->_out('endobj');
    1510         }
    1511         // Pages root
    1512         $this->offsets[1] = strlen($this->buffer);
    1513         $this->_out('1 0 obj');
    1514         $this->_out('<</Type /Pages');
    1515         $kids = '/Kids [';
    1516         for($i=0;$i<$nb;$i++)
    1517                 $kids .= (3+2*$i).' 0 R ';
    1518         $this->_out($kids.']');
    1519         $this->_out('/Count '.$nb);
    1520         $this->_out(sprintf('/MediaBox [0 0 %.2F %.2F]',$wPt,$hPt));
    1521         $this->_out('>>');
    1522         $this->_out('endobj');
    1523 }
    1524 
    1525 function _putfonts()
    1526 {
    1527         $nf = $this->n;
    1528         foreach($this->diffs as $diff)
    1529         {
    1530                 // Encodings
    1531                 $this->_newobj();
    1532                 $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
    1533                 $this->_out('endobj');
    1534         }
     1556                $w = $this->DefPageSize[0];
     1557                $h = $this->DefPageSize[1];
     1558        }
     1559        else
     1560        {
     1561                $w = $this->DefPageSize[1];
     1562                $h = $this->DefPageSize[0];
     1563        }
     1564        $this->_put(sprintf('/MediaBox [0 0 %.2F %.2F]',$w*$this->k,$h*$this->k));
     1565        $this->_put('>>');
     1566        $this->_put('endobj');
     1567}
     1568
     1569protected function _putfonts()
     1570{
    15351571        foreach($this->FontFiles as $file=>$info)
    15361572        {
     
    15441580                if(!$compressed && isset($info['length2']))
    15451581                        $font = substr($font,6,$info['length1']).substr($font,6+$info['length1']+6,$info['length2']);
    1546                 $this->_out('<</Length '.strlen($font));
     1582                $this->_put('<</Length '.strlen($font));
    15471583                if($compressed)
    1548                         $this->_out('/Filter /FlateDecode');
    1549                 $this->_out('/Length1 '.$info['length1']);
     1584                        $this->_put('/Filter /FlateDecode');
     1585                $this->_put('/Length1 '.$info['length1']);
    15501586                if(isset($info['length2']))
    1551                         $this->_out('/Length2 '.$info['length2'].' /Length3 0');
    1552                 $this->_out('>>');
     1587                        $this->_put('/Length2 '.$info['length2'].' /Length3 0');
     1588                $this->_put('>>');
    15531589                $this->_putstream($font);
    1554                 $this->_out('endobj');
     1590                $this->_put('endobj');
    15551591        }
    15561592        foreach($this->fonts as $k=>$font)
    15571593        {
    1558                 // Font objects
     1594                // Encoding
     1595                if(isset($font['diff']))
     1596                {
     1597                        if(!isset($this->encodings[$font['enc']]))
     1598                        {
     1599                                $this->_newobj();
     1600                                $this->_put('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$font['diff'].']>>');
     1601                                $this->_put('endobj');
     1602                                $this->encodings[$font['enc']] = $this->n;
     1603                        }
     1604                }
     1605                // ToUnicode CMap
     1606                if(isset($font['uv']))
     1607                {
     1608                        if(isset($font['enc']))
     1609                                $cmapkey = $font['enc'];
     1610                        else
     1611                                $cmapkey = $font['name'];
     1612                        if(!isset($this->cmaps[$cmapkey]))
     1613                        {
     1614                                $cmap = $this->_tounicodecmap($font['uv']);
     1615                                $this->_putstreamobject($cmap);
     1616                                $this->cmaps[$cmapkey] = $this->n;
     1617                        }
     1618                }
     1619                // Font object
    15591620                $this->fonts[$k]['n'] = $this->n+1;
    15601621                $type = $font['type'];
    15611622                $name = $font['name'];
     1623                if($font['subsetted'])
     1624                        $name = 'AAAAAA+'.$name;
    15621625                if($type=='Core')
    15631626                {
    15641627                        // Core font
    15651628                        $this->_newobj();
    1566                         $this->_out('<</Type /Font');
    1567                         $this->_out('/BaseFont /'.$name);
    1568                         $this->_out('/Subtype /Type1');
     1629                        $this->_put('<</Type /Font');
     1630                        $this->_put('/BaseFont /'.$name);
     1631                        $this->_put('/Subtype /Type1');
    15691632                        if($name!='Symbol' && $name!='ZapfDingbats')
    1570                                 $this->_out('/Encoding /WinAnsiEncoding');
    1571                         $this->_out('>>');
    1572                         $this->_out('endobj');
     1633                                $this->_put('/Encoding /WinAnsiEncoding');
     1634                        if(isset($font['uv']))
     1635                                $this->_put('/ToUnicode '.$this->cmaps[$cmapkey].' 0 R');
     1636                        $this->_put('>>');
     1637                        $this->_put('endobj');
    15731638                }
    15741639                elseif($type=='Type1' || $type=='TrueType')
     
    15761641                        // Additional Type1 or TrueType/OpenType font
    15771642                        $this->_newobj();
    1578                         $this->_out('<</Type /Font');
    1579                         $this->_out('/BaseFont /'.$name);
    1580                         $this->_out('/Subtype /'.$type);
    1581                         $this->_out('/FirstChar 32 /LastChar 255');
    1582                         $this->_out('/Widths '.($this->n+1).' 0 R');
    1583                         $this->_out('/FontDescriptor '.($this->n+2).' 0 R');
    1584                         if(isset($font['diffn']))
    1585                                 $this->_out('/Encoding '.($nf+$font['diffn']).' 0 R');
     1643                        $this->_put('<</Type /Font');
     1644                        $this->_put('/BaseFont /'.$name);
     1645                        $this->_put('/Subtype /'.$type);
     1646                        $this->_put('/FirstChar 32 /LastChar 255');
     1647                        $this->_put('/Widths '.($this->n+1).' 0 R');
     1648                        $this->_put('/FontDescriptor '.($this->n+2).' 0 R');
     1649                        if(isset($font['diff']))
     1650                                $this->_put('/Encoding '.$this->encodings[$font['enc']].' 0 R');
    15861651                        else
    1587                                 $this->_out('/Encoding /WinAnsiEncoding');
    1588                         $this->_out('>>');
    1589                         $this->_out('endobj');
     1652                                $this->_put('/Encoding /WinAnsiEncoding');
     1653                        if(isset($font['uv']))
     1654                                $this->_put('/ToUnicode '.$this->cmaps[$cmapkey].' 0 R');
     1655                        $this->_put('>>');
     1656                        $this->_put('endobj');
    15901657                        // Widths
    15911658                        $this->_newobj();
     
    15941661                        for($i=32;$i<=255;$i++)
    15951662                                $s .= $cw[chr($i)].' ';
    1596                         $this->_out($s.']');
    1597                         $this->_out('endobj');
     1663                        $this->_put($s.']');
     1664                        $this->_put('endobj');
    15981665                        // Descriptor
    15991666                        $this->_newobj();
     
    16031670                        if(!empty($font['file']))
    16041671                                $s .= ' /FontFile'.($type=='Type1' ? '' : '2').' '.$this->FontFiles[$font['file']]['n'].' 0 R';
    1605                         $this->_out($s.'>>');
    1606                         $this->_out('endobj');
     1672                        $this->_put($s.'>>');
     1673                        $this->_put('endobj');
    16071674                }
    16081675                else
     
    16171684}
    16181685
    1619 function _putimages()
     1686protected function _tounicodecmap($uv)
     1687{
     1688        $ranges = '';
     1689        $nbr = 0;
     1690        $chars = '';
     1691        $nbc = 0;
     1692        foreach($uv as $c=>$v)
     1693        {
     1694                if(is_array($v))
     1695                {
     1696                        $ranges .= sprintf("<%02X> <%02X> <%04X>\n",$c,$c+$v[1]-1,$v[0]);
     1697                        $nbr++;
     1698                }
     1699                else
     1700                {
     1701                        $chars .= sprintf("<%02X> <%04X>\n",$c,$v);
     1702                        $nbc++;
     1703                }
     1704        }
     1705        $s = "/CIDInit /ProcSet findresource begin\n";
     1706        $s .= "12 dict begin\n";
     1707        $s .= "begincmap\n";
     1708        $s .= "/CIDSystemInfo\n";
     1709        $s .= "<</Registry (Adobe)\n";
     1710        $s .= "/Ordering (UCS)\n";
     1711        $s .= "/Supplement 0\n";
     1712        $s .= ">> def\n";
     1713        $s .= "/CMapName /Adobe-Identity-UCS def\n";
     1714        $s .= "/CMapType 2 def\n";
     1715        $s .= "1 begincodespacerange\n";
     1716        $s .= "<00> <FF>\n";
     1717        $s .= "endcodespacerange\n";
     1718        if($nbr>0)
     1719        {
     1720                $s .= "$nbr beginbfrange\n";
     1721                $s .= $ranges;
     1722                $s .= "endbfrange\n";
     1723        }
     1724        if($nbc>0)
     1725        {
     1726                $s .= "$nbc beginbfchar\n";
     1727                $s .= $chars;
     1728                $s .= "endbfchar\n";
     1729        }
     1730        $s .= "endcmap\n";
     1731        $s .= "CMapName currentdict /CMap defineresource pop\n";
     1732        $s .= "end\n";
     1733        $s .= "end";
     1734        return $s;
     1735}
     1736
     1737protected function _putimages()
    16201738{
    16211739        foreach(array_keys($this->images) as $file)
     
    16271745}
    16281746
    1629 function _putimage(&$info)
     1747protected function _putimage(&$info)
    16301748{
    16311749        $this->_newobj();
    16321750        $info['n'] = $this->n;
    1633         $this->_out('<</Type /XObject');
    1634         $this->_out('/Subtype /Image');
    1635         $this->_out('/Width '.$info['w']);
    1636         $this->_out('/Height '.$info['h']);
     1751        $this->_put('<</Type /XObject');
     1752        $this->_put('/Subtype /Image');
     1753        $this->_put('/Width '.$info['w']);
     1754        $this->_put('/Height '.$info['h']);
    16371755        if($info['cs']=='Indexed')
    1638                 $this->_out('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]');
    1639         else
    1640         {
    1641                 $this->_out('/ColorSpace /'.$info['cs']);
     1756                $this->_put('/ColorSpace [/Indexed /DeviceRGB '.(strlen($info['pal'])/3-1).' '.($this->n+1).' 0 R]');
     1757        else
     1758        {
     1759                $this->_put('/ColorSpace /'.$info['cs']);
    16421760                if($info['cs']=='DeviceCMYK')
    1643                         $this->_out('/Decode [1 0 1 0 1 0 1 0]');
    1644         }
    1645         $this->_out('/BitsPerComponent '.$info['bpc']);
     1761                        $this->_put('/Decode [1 0 1 0 1 0 1 0]');
     1762        }
     1763        $this->_put('/BitsPerComponent '.$info['bpc']);
    16461764        if(isset($info['f']))
    1647                 $this->_out('/Filter /'.$info['f']);
     1765                $this->_put('/Filter /'.$info['f']);
    16481766        if(isset($info['dp']))
    1649                 $this->_out('/DecodeParms <<'.$info['dp'].'>>');
     1767                $this->_put('/DecodeParms <<'.$info['dp'].'>>');
    16501768        if(isset($info['trns']) && is_array($info['trns']))
    16511769        {
     
    16531771                for($i=0;$i<count($info['trns']);$i++)
    16541772                        $trns .= $info['trns'][$i].' '.$info['trns'][$i].' ';
    1655                 $this->_out('/Mask ['.$trns.']');
     1773                $this->_put('/Mask ['.$trns.']');
    16561774        }
    16571775        if(isset($info['smask']))
    1658                 $this->_out('/SMask '.($this->n+1).' 0 R');
    1659         $this->_out('/Length '.strlen($info['data']).'>>');
     1776                $this->_put('/SMask '.($this->n+1).' 0 R');
     1777        $this->_put('/Length '.strlen($info['data']).'>>');
    16601778        $this->_putstream($info['data']);
    1661         $this->_out('endobj');
     1779        $this->_put('endobj');
    16621780        // Soft mask
    16631781        if(isset($info['smask']))
     
    16691787        // Palette
    16701788        if($info['cs']=='Indexed')
    1671         {
    1672                 $filter = ($this->compress) ? '/Filter /FlateDecode ' : '';
    1673                 $pal = ($this->compress) ? gzcompress($info['pal']) : $info['pal'];
    1674                 $this->_newobj();
    1675                 $this->_out('<<'.$filter.'/Length '.strlen($pal).'>>');
    1676                 $this->_putstream($pal);
    1677                 $this->_out('endobj');
    1678         }
    1679 }
    1680 
    1681 function _putxobjectdict()
     1789                $this->_putstreamobject($info['pal']);
     1790}
     1791
     1792protected function _putxobjectdict()
    16821793{
    16831794        foreach($this->images as $image)
    1684                 $this->_out('/I'.$image['i'].' '.$image['n'].' 0 R');
    1685 }
    1686 
    1687 function _putresourcedict()
    1688 {
    1689         $this->_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
    1690         $this->_out('/Font <<');
     1795                $this->_put('/I'.$image['i'].' '.$image['n'].' 0 R');
     1796}
     1797
     1798protected function _putresourcedict()
     1799{
     1800        $this->_put('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
     1801        $this->_put('/Font <<');
    16911802        foreach($this->fonts as $font)
    1692                 $this->_out('/F'.$font['i'].' '.$font['n'].' 0 R');
    1693         $this->_out('>>');
    1694         $this->_out('/XObject <<');
     1803                $this->_put('/F'.$font['i'].' '.$font['n'].' 0 R');
     1804        $this->_put('>>');
     1805        $this->_put('/XObject <<');
    16951806        $this->_putxobjectdict();
    1696         $this->_out('>>');
    1697 }
    1698 
    1699 function _putresources()
     1807        $this->_put('>>');
     1808}
     1809
     1810protected function _putresources()
    17001811{
    17011812        $this->_putfonts();
    17021813        $this->_putimages();
    17031814        // Resource dictionary
    1704         $this->offsets[2] = strlen($this->buffer);
    1705         $this->_out('2 0 obj');
    1706         $this->_out('<<');
     1815        $this->_newobj(2);
     1816        $this->_put('<<');
    17071817        $this->_putresourcedict();
    1708         $this->_out('>>');
    1709         $this->_out('endobj');
    1710 }
    1711 
    1712 function _putinfo()
    1713 {
    1714         $this->_out('/Producer '.$this->_textstring('FPDF '.FPDF_VERSION));
    1715         if(!empty($this->title))
    1716                 $this->_out('/Title '.$this->_textstring($this->title));
    1717         if(!empty($this->subject))
    1718                 $this->_out('/Subject '.$this->_textstring($this->subject));
    1719         if(!empty($this->author))
    1720                 $this->_out('/Author '.$this->_textstring($this->author));
    1721         if(!empty($this->keywords))
    1722                 $this->_out('/Keywords '.$this->_textstring($this->keywords));
    1723         if(!empty($this->creator))
    1724                 $this->_out('/Creator '.$this->_textstring($this->creator));
    1725         $this->_out('/CreationDate '.$this->_textstring('D:'.@date('YmdHis')));
    1726 }
    1727 
    1728 function _putcatalog()
    1729 {
    1730         $this->_out('/Type /Catalog');
    1731         $this->_out('/Pages 1 0 R');
     1818        $this->_put('>>');
     1819        $this->_put('endobj');
     1820}
     1821
     1822protected function _putinfo()
     1823{
     1824        $this->metadata['Producer'] = 'FPDF '.FPDF_VERSION;
     1825        $this->metadata['CreationDate'] = 'D:'.@date('YmdHis');
     1826        foreach($this->metadata as $key=>$value)
     1827                $this->_put('/'.$key.' '.$this->_textstring($value));
     1828}
     1829
     1830protected function _putcatalog()
     1831{
     1832        $n = $this->PageInfo[1]['n'];
     1833        $this->_put('/Type /Catalog');
     1834        $this->_put('/Pages 1 0 R');
    17321835        if($this->ZoomMode=='fullpage')
    1733                 $this->_out('/OpenAction [3 0 R /Fit]');
     1836                $this->_put('/OpenAction ['.$n.' 0 R /Fit]');
    17341837        elseif($this->ZoomMode=='fullwidth')
    1735                 $this->_out('/OpenAction [3 0 R /FitH null]');
     1838                $this->_put('/OpenAction ['.$n.' 0 R /FitH null]');
    17361839        elseif($this->ZoomMode=='real')
    1737                 $this->_out('/OpenAction [3 0 R /XYZ null null 1]');
     1840                $this->_put('/OpenAction ['.$n.' 0 R /XYZ null null 1]');
    17381841        elseif(!is_string($this->ZoomMode))
    1739                 $this->_out('/OpenAction [3 0 R /XYZ null null '.sprintf('%.2F',$this->ZoomMode/100).']');
     1842                $this->_put('/OpenAction ['.$n.' 0 R /XYZ null null '.sprintf('%.2F',$this->ZoomMode/100).']');
    17401843        if($this->LayoutMode=='single')
    1741                 $this->_out('/PageLayout /SinglePage');
     1844                $this->_put('/PageLayout /SinglePage');
    17421845        elseif($this->LayoutMode=='continuous')
    1743                 $this->_out('/PageLayout /OneColumn');
     1846                $this->_put('/PageLayout /OneColumn');
    17441847        elseif($this->LayoutMode=='two')
    1745                 $this->_out('/PageLayout /TwoColumnLeft');
    1746 }
    1747 
    1748 function _putheader()
    1749 {
    1750         $this->_out('%PDF-'.$this->PDFVersion);
    1751 }
    1752 
    1753 function _puttrailer()
    1754 {
    1755         $this->_out('/Size '.($this->n+1));
    1756         $this->_out('/Root '.$this->n.' 0 R');
    1757         $this->_out('/Info '.($this->n-1).' 0 R');
    1758 }
    1759 
    1760 function _enddoc()
     1848                $this->_put('/PageLayout /TwoColumnLeft');
     1849}
     1850
     1851protected function _putheader()
     1852{
     1853        $this->_put('%PDF-'.$this->PDFVersion);
     1854}
     1855
     1856protected function _puttrailer()
     1857{
     1858        $this->_put('/Size '.($this->n+1));
     1859        $this->_put('/Root '.$this->n.' 0 R');
     1860        $this->_put('/Info '.($this->n-1).' 0 R');
     1861}
     1862
     1863protected function _enddoc()
    17611864{
    17621865        $this->_putheader();
     
    17651868        // Info
    17661869        $this->_newobj();
    1767         $this->_out('<<');
     1870        $this->_put('<<');
    17681871        $this->_putinfo();
    1769         $this->_out('>>');
    1770         $this->_out('endobj');
     1872        $this->_put('>>');
     1873        $this->_put('endobj');
    17711874        // Catalog
    17721875        $this->_newobj();
    1773         $this->_out('<<');
     1876        $this->_put('<<');
    17741877        $this->_putcatalog();
    1775         $this->_out('>>');
    1776         $this->_out('endobj');
     1878        $this->_put('>>');
     1879        $this->_put('endobj');
    17771880        // Cross-ref
    1778         $o = strlen($this->buffer);
    1779         $this->_out('xref');
    1780         $this->_out('0 '.($this->n+1));
    1781         $this->_out('0000000000 65535 f ');
     1881        $offset = $this->_getoffset();
     1882        $this->_put('xref');
     1883        $this->_put('0 '.($this->n+1));
     1884        $this->_put('0000000000 65535 f ');
    17821885        for($i=1;$i<=$this->n;$i++)
    1783                 $this->_out(sprintf('%010d 00000 n ',$this->offsets[$i]));
     1886                $this->_put(sprintf('%010d 00000 n ',$this->offsets[$i]));
    17841887        // Trailer
    1785         $this->_out('trailer');
    1786         $this->_out('<<');
     1888        $this->_put('trailer');
     1889        $this->_put('<<');
    17871890        $this->_puttrailer();
    1788         $this->_out('>>');
    1789         $this->_out('startxref');
    1790         $this->_out($o);
    1791         $this->_out('%%EOF');
     1891        $this->_put('>>');
     1892        $this->_put('startxref');
     1893        $this->_put($offset);
     1894        $this->_put('%%EOF');
    17921895        $this->state = 3;
    17931896}
    1794 // End of class
    1795 }
    1796 
    1797 // Handle special IE contype request
    1798 if(isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT']=='contype')
    1799 {
    1800         header('Content-Type: application/pdf');
    1801         exit;
    1802 }
    1803 
     1897}
    18041898?>
  • _plugins_/fpdf/makefont/makefont.php

    r55790 r99921  
    33* Utility to generate font definition files                                    *
    44*                                                                              *
    5 * Version: 1.2                                                                 *
    6 * Date:    2011-06-18                                                          *
     5* Version: 1.3                                                                 *
     6* Date:    2015-11-29                                                          *
    77* Author:  Olivier PLATHEY                                                     *
    88*******************************************************************************/
     
    6060}
    6161
    62 function GetInfoFromTrueType($file, $embed, $map)
    63 {
    64         // Return informations from a TrueType font
    65         $ttf = new TTFParser();
    66         $ttf->Parse($file);
     62function GetInfoFromTrueType($file, $embed, $subset, $map)
     63{
     64        // Return information from a TrueType font
     65        try
     66        {
     67                $ttf = new TTFParser($file);
     68                $ttf->Parse();
     69        }
     70        catch(Exception $e)
     71        {
     72                Error($e->getMessage());
     73        }
    6774        if($embed)
    6875        {
    69                 if(!$ttf->Embeddable)
     76                if(!$ttf->embeddable)
    7077                        Error('Font license does not allow embedding');
    71                 $info['Data'] = file_get_contents($file);
    72                 $info['OriginalSize'] = filesize($file);
     78                if($subset)
     79                {
     80                        $chars = array();
     81                        foreach($map as $v)
     82                        {
     83                                if($v['name']!='.notdef')
     84                                        $chars[] = $v['uv'];
     85                        }
     86                        $ttf->Subset($chars);
     87                        $info['Data'] = $ttf->Build();
     88                }
     89                else
     90                        $info['Data'] = file_get_contents($file);
     91                $info['OriginalSize'] = strlen($info['Data']);
    7392        }
    7493        $k = 1000/$ttf->unitsPerEm;
    7594        $info['FontName'] = $ttf->postScriptName;
    76         $info['Bold'] = $ttf->Bold;
     95        $info['Bold'] = $ttf->bold;
    7796        $info['ItalicAngle'] = $ttf->italicAngle;
    7897        $info['IsFixedPitch'] = $ttf->isFixedPitch;
     
    83102        $info['FontBBox'] = array(round($k*$ttf->xMin), round($k*$ttf->yMin), round($k*$ttf->xMax), round($k*$ttf->yMax));
    84103        $info['CapHeight'] = round($k*$ttf->capHeight);
    85         $info['MissingWidth'] = round($k*$ttf->widths[0]);
     104        $info['MissingWidth'] = round($k*$ttf->glyphs[0]['w']);
    86105        $widths = array_fill(0, 256, $info['MissingWidth']);
    87         for($c=0;$c<=255;$c++)
    88         {
    89                 if($map[$c]['name']!='.notdef')
    90                 {
    91                         $uv = $map[$c]['uv'];
    92                         if(isset($ttf->chars[$uv]))
     106        foreach($map as $c=>$v)
     107        {
     108                if($v['name']!='.notdef')
     109                {
     110                        if(isset($ttf->chars[$v['uv']]))
    93111                        {
    94                                 $w = $ttf->widths[$ttf->chars[$uv]];
     112                                $id = $ttf->chars[$v['uv']];
     113                                $w = $ttf->glyphs[$id]['w'];
    95114                                $widths[$c] = round($k*$w);
    96115                        }
    97116                        else
    98                                 Warning('Character '.$map[$c]['name'].' is missing');
     117                                Warning('Character '.$v['name'].' is missing');
    99118                }
    100119        }
     
    105124function GetInfoFromType1($file, $embed, $map)
    106125{
    107         // Return informations from a Type1 font
     126        // Return information from a Type1 font
    108127        if($embed)
    109128        {
     
    173192        if(!isset($info['FontName']))
    174193                Error('FontName missing in AFM file');
     194        if(!isset($info['Ascender']))
     195                $info['Ascender'] = $info['FontBBox'][3];
     196        if(!isset($info['Descender']))
     197                $info['Descender'] = $info['FontBBox'][1];
    175198        $info['Bold'] = isset($info['Weight']) && preg_match('/bold|black/i', $info['Weight']);
    176199        if(isset($cw['.notdef']))
     
    179202                $info['MissingWidth'] = 0;
    180203        $widths = array_fill(0, 256, $info['MissingWidth']);
    181         for($c=0;$c<=255;$c++)
    182         {
    183                 $name = $map[$c]['name'];
    184                 if($name!='.notdef')
    185                 {
    186                         if(isset($cw[$name]))
    187                                 $widths[$c] = $cw[$name];
     204        foreach($map as $c=>$v)
     205        {
     206                if($v['name']!='.notdef')
     207                {
     208                        if(isset($cw[$v['name']]))
     209                                $widths[$c] = $cw[$v['name']];
    188210                        else
    189                                 Warning('Character '.$name.' is missing');
     211                                Warning('Character '.$v['name'].' is missing');
    190212                }
    191213        }
     
    273295}
    274296
     297function MakeUnicodeArray($map)
     298{
     299        // Build mapping to Unicode values
     300        $ranges = array();
     301        foreach($map as $c=>$v)
     302        {
     303                $uv = $v['uv'];
     304                if($uv!=-1)
     305                {
     306                        if(isset($range))
     307                        {
     308                                if($c==$range[1]+1 && $uv==$range[3]+1)
     309                                {
     310                                        $range[1]++;
     311                                        $range[3]++;
     312                                }
     313                                else
     314                                {
     315                                        $ranges[] = $range;
     316                                        $range = array($c, $c, $uv, $uv);
     317                                }
     318                        }
     319                        else
     320                                $range = array($c, $c, $uv, $uv);
     321                }
     322        }
     323        $ranges[] = $range;
     324
     325        foreach($ranges as $range)
     326        {
     327                if(isset($s))
     328                        $s .= ',';
     329                else
     330                        $s = 'array(';
     331                $s .= $range[0].'=>';
     332                $nb = $range[1]-$range[0]+1;
     333                if($nb>1)
     334                        $s .= 'array('.$range[2].','.$nb.')';
     335                else
     336                        $s .= $range[2];
     337        }
     338        $s .= ')';
     339        return $s;
     340}
     341
    275342function SaveToFile($file, $s, $mode)
    276343{
     
    278345        if(!$f)
    279346                Error('Can\'t write to file '.$file);
    280         fwrite($f, $s, strlen($s));
     347        fwrite($f, $s);
    281348        fclose($f);
    282349}
    283350
    284 function MakeDefinitionFile($file, $type, $enc, $embed, $map, $info)
     351function MakeDefinitionFile($file, $type, $enc, $embed, $subset, $map, $info)
    285352{
    286353        $s = "<?php\n";
     
    295362        if($diff)
    296363                $s .= '$diff = \''.$diff."';\n";
     364        $s .= '$uv = '.MakeUnicodeArray($map).";\n";
    297365        if($embed)
    298366        {
     
    304372                }
    305373                else
     374                {
    306375                        $s .= '$originalsize = '.$info['OriginalSize'].";\n";
     376                        if($subset)
     377                                $s .= "\$subsetted = true;\n";
     378                }
    307379        }
    308380        $s .= "?>\n";
     
    310382}
    311383
    312 function MakeFont($fontfile, $enc='cp1252', $embed=true)
     384function MakeFont($fontfile, $enc='cp1252', $embed=true, $subset=true)
    313385{
    314386        // Generate a font definition file
    315387        if(get_magic_quotes_runtime())
    316                 @set_magic_quotes_runtime(0);
     388                @set_magic_quotes_runtime(false);
    317389        ini_set('auto_detect_line_endings', '1');
    318390
     
    330402
    331403        if($type=='TrueType')
    332                 $info = GetInfoFromTrueType($fontfile, $embed, $map);
     404                $info = GetInfoFromTrueType($fontfile, $embed, $subset, $map);
    333405        else
    334406                $info = GetInfoFromType1($fontfile, $embed, $map);
     
    347419                {
    348420                        $info['File'] = basename($fontfile);
     421                        $subset = false;
    349422                        Notice('Font file could not be compressed (zlib extension not available)');
    350423                }
    351424        }
    352425
    353         MakeDefinitionFile($basename.'.php', $type, $enc, $embed, $map, $info);
     426        MakeDefinitionFile($basename.'.php', $type, $enc, $embed, $subset, $map, $info);
    354427        Message('Font definition file generated: '.$basename.'.php');
    355428}
     
    358431{
    359432        // Command-line interface
     433        ini_set('log_errors', '0');
    360434        if($argc==1)
    361                 die("Usage: php makefont.php fontfile [enc] [embed]\n");
     435                die("Usage: php makefont.php fontfile [encoding] [embed] [subset]\n");
    362436        $fontfile = $argv[1];
    363437        if($argc>=3)
     
    369443        else
    370444                $embed = true;
    371         MakeFont($fontfile, $enc, $embed);
     445        if($argc>=5)
     446                $subset = ($argv[4]=='true' || $argv[4]=='1');
     447        else
     448                $subset = true;
     449        MakeFont($fontfile, $enc, $embed, $subset);
    372450}
    373451?>
  • _plugins_/fpdf/makefont/ttfparser.php

    r55790 r99921  
    11<?php
    22/*******************************************************************************
    3 * Utility to parse TTF font files                                              *
     3* Class to parse and subset TrueType fonts                                     *
    44*                                                                              *
    5 * Version: 1.0                                                                 *
    6 * Date:    2011-06-18                                                          *
     5* Version: 1.1                                                                 *
     6* Date:    2015-11-29                                                          *
    77* Author:  Olivier PLATHEY                                                     *
    88*******************************************************************************/
     
    1010class TTFParser
    1111{
    12         var $f;
    13         var $tables;
    14         var $unitsPerEm;
    15         var $xMin, $yMin, $xMax, $yMax;
    16         var $numberOfHMetrics;
    17         var $numGlyphs;
    18         var $widths;
    19         var $chars;
    20         var $postScriptName;
    21         var $Embeddable;
    22         var $Bold;
    23         var $typoAscender;
    24         var $typoDescender;
    25         var $capHeight;
    26         var $italicAngle;
    27         var $underlinePosition;
    28         var $underlineThickness;
    29         var $isFixedPitch;
    30 
    31         function Parse($file)
     12        protected $f;
     13        protected $tables;
     14        protected $numberOfHMetrics;
     15        protected $numGlyphs;
     16        protected $glyphNames;
     17        protected $indexToLocFormat;
     18        protected $subsettedChars;
     19        protected $subsettedGlyphs;
     20        public $chars;
     21        public $glyphs;
     22        public $unitsPerEm;
     23        public $xMin, $yMin, $xMax, $yMax;
     24        public $postScriptName;
     25        public $embeddable;
     26        public $bold;
     27        public $typoAscender;
     28        public $typoDescender;
     29        public $capHeight;
     30        public $italicAngle;
     31        public $underlinePosition;
     32        public $underlineThickness;
     33        public $isFixedPitch;
     34
     35        function __construct($file)
    3236        {
    3337                $this->f = fopen($file, 'rb');
    3438                if(!$this->f)
    3539                        $this->Error('Can\'t open file: '.$file);
    36 
     40        }
     41
     42        function __destruct()
     43        {
     44                if(is_resource($this->f))
     45                        fclose($this->f);
     46        }
     47
     48        function Parse()
     49        {
     50                $this->ParseOffsetTable();
     51                $this->ParseHead();
     52                $this->ParseHhea();
     53                $this->ParseMaxp();
     54                $this->ParseHmtx();
     55                $this->ParseLoca();
     56                $this->ParseGlyf();
     57                $this->ParseCmap();
     58                $this->ParseName();
     59                $this->ParseOS2();
     60                $this->ParsePost();
     61        }
     62
     63        function ParseOffsetTable()
     64        {
    3765                $version = $this->Read(4);
    3866                if($version=='OTTO')
     
    4674                {
    4775                        $tag = $this->Read(4);
    48                         $this->Skip(4); // checkSum
     76                        $checkSum = $this->Read(4);
    4977                        $offset = $this->ReadULong();
    50                         $this->Skip(4); // length
    51                         $this->tables[$tag] = $offset;
    52                 }
    53 
    54                 $this->ParseHead();
    55                 $this->ParseHhea();
    56                 $this->ParseMaxp();
    57                 $this->ParseHmtx();
    58                 $this->ParseCmap();
    59                 $this->ParseName();
    60                 $this->ParseOS2();
    61                 $this->ParsePost();
    62 
    63                 fclose($this->f);
    64         }
     78                        $length = $this->ReadULong(4);
     79                        $this->tables[$tag] = array('offset'=>$offset, 'length'=>$length, 'checkSum'=>$checkSum);
     80                }
     81        }       
    6582
    6683        function ParseHead()
     
    7895                $this->xMax = $this->ReadShort();
    7996                $this->yMax = $this->ReadShort();
     97                $this->Skip(3*2); // macStyle, lowestRecPPEM, fontDirectionHint
     98                $this->indexToLocFormat = $this->ReadShort();
    8099        }
    81100
     
    97116        {
    98117                $this->Seek('hmtx');
    99                 $this->widths = array();
     118                $this->glyphs = array();
    100119                for($i=0;$i<$this->numberOfHMetrics;$i++)
    101120                {
    102121                        $advanceWidth = $this->ReadUShort();
    103                         $this->Skip(2); // lsb
    104                         $this->widths[$i] = $advanceWidth;
    105                 }
    106                 if($this->numberOfHMetrics<$this->numGlyphs)
    107                 {
    108                         $lastWidth = $this->widths[$this->numberOfHMetrics-1];
    109                         $this->widths = array_pad($this->widths, $this->numGlyphs, $lastWidth);
     122                        $lsb = $this->ReadShort();
     123                        $this->glyphs[$i] = array('w'=>$advanceWidth, 'lsb'=>$lsb);
     124                }
     125                for($i=$this->numberOfHMetrics;$i<$this->numGlyphs;$i++)
     126                {
     127                        $lsb = $this->ReadShort();
     128                        $this->glyphs[$i] = array('w'=>$advanceWidth, 'lsb'=>$lsb);
     129                }
     130        }
     131
     132        function ParseLoca()
     133        {
     134                $this->Seek('loca');
     135                $offsets = array();
     136                if($this->indexToLocFormat==0)
     137                {
     138                        // Short format
     139                        for($i=0;$i<=$this->numGlyphs;$i++)
     140                                $offsets[] = 2*$this->ReadUShort();
     141                }
     142                else
     143                {
     144                        // Long format
     145                        for($i=0;$i<=$this->numGlyphs;$i++)
     146                                $offsets[] = $this->ReadULong();
     147                }
     148                for($i=0;$i<$this->numGlyphs;$i++)
     149                {
     150                        $this->glyphs[$i]['offset'] = $offsets[$i];
     151                        $this->glyphs[$i]['length'] = $offsets[$i+1] - $offsets[$i];
     152                }
     153        }
     154
     155        function ParseGlyf()
     156        {
     157                $tableOffset = $this->tables['glyf']['offset'];
     158                foreach($this->glyphs as &$glyph)
     159                {
     160                        if($glyph['length']>0)
     161                        {
     162                                fseek($this->f, $tableOffset+$glyph['offset'], SEEK_SET);
     163                                if($this->ReadShort()<0)
     164                                {
     165                                        // Composite glyph
     166                                        $this->Skip(4*2); // xMin, yMin, xMax, yMax
     167                                        $offset = 5*2;
     168                                        $a = array();
     169                                        do
     170                                        {
     171                                                $flags = $this->ReadUShort();
     172                                                $index = $this->ReadUShort();
     173                                                $a[$offset+2] = $index;
     174                                                if($flags & 1) // ARG_1_AND_2_ARE_WORDS
     175                                                        $skip = 2*2;
     176                                                else
     177                                                        $skip = 2;
     178                                                if($flags & 8) // WE_HAVE_A_SCALE
     179                                                        $skip += 2;
     180                                                elseif($flags & 64) // WE_HAVE_AN_X_AND_Y_SCALE
     181                                                        $skip += 2*2;
     182                                                elseif($flags & 128) // WE_HAVE_A_TWO_BY_TWO
     183                                                        $skip += 4*2;
     184                                                $this->Skip($skip);
     185                                                $offset += 2*2 + $skip;
     186                                        }
     187                                        while($flags & 32); // MORE_COMPONENTS
     188                                        $glyph['components'] = $a;
     189                                }
     190                        }
    110191                }
    111192        }
     
    133214                $idRangeOffset = array();
    134215                $this->chars = array();
    135                 fseek($this->f, $this->tables['cmap']+$offset31, SEEK_SET);
     216                fseek($this->f, $this->tables['cmap']['offset']+$offset31, SEEK_SET);
    136217                $format = $this->ReadUShort();
    137218                if($format!=4)
     
    182263        {
    183264                $this->Seek('name');
    184                 $tableOffset = ftell($this->f);
     265                $tableOffset = $this->tables['name']['offset'];
    185266                $this->postScriptName = '';
    186267                $this->Skip(2); // format
     
    214295                $this->Skip(3*2); // xAvgCharWidth, usWeightClass, usWidthClass
    215296                $fsType = $this->ReadUShort();
    216                 $this->Embeddable = ($fsType!=2) && ($fsType & 0x200)==0;
     297                $this->embeddable = ($fsType!=2) && ($fsType & 0x200)==0;
    217298                $this->Skip(11*2+10+4*4+4);
    218299                $fsSelection = $this->ReadUShort();
    219                 $this->Bold = ($fsSelection & 32)!=0;
     300                $this->bold = ($fsSelection & 32)!=0;
    220301                $this->Skip(2*2); // usFirstCharIndex, usLastCharIndex
    221302                $this->typoAscender = $this->ReadShort();
     
    233314        {
    234315                $this->Seek('post');
    235                 $this->Skip(4); // version
     316                $version = $this->ReadULong();
    236317                $this->italicAngle = $this->ReadShort();
    237318                $this->Skip(2); // Skip decimal part
     
    239320                $this->underlineThickness = $this->ReadShort();
    240321                $this->isFixedPitch = ($this->ReadULong()!=0);
    241         }
    242 
    243         function Error($msg)
    244         {
    245                 if(PHP_SAPI=='cli')
    246                         die("Error: $msg\n");
     322                if($version==0x20000)
     323                {
     324                        // Extract glyph names
     325                        $this->Skip(4*4); // min/max usage
     326                        $this->Skip(2); // numberOfGlyphs
     327                        $glyphNameIndex = array();
     328                        $names = array();
     329                        $numNames = 0;
     330                        for($i=0;$i<$this->numGlyphs;$i++)
     331                        {
     332                                $index = $this->ReadUShort();
     333                                $glyphNameIndex[] = $index;
     334                                if($index>=258 && $index-257>$numNames)
     335                                        $numNames = $index-257;
     336                        }
     337                        for($i=0;$i<$numNames;$i++)
     338                        {
     339                                $len = ord($this->Read(1));
     340                                $names[] = $this->Read($len);
     341                        }
     342                        foreach($glyphNameIndex as $i=>$index)
     343                        {
     344                                if($index>=258)
     345                                        $this->glyphs[$i]['name'] = $names[$index-258];
     346                                else
     347                                        $this->glyphs[$i]['name'] = $index;
     348                        }
     349                        $this->glyphNames = true;
     350                }
    247351                else
    248                         die("<b>Error</b>: $msg");
     352                        $this->glyphNames = false;
     353        }
     354
     355        function Subset($chars)
     356        {
     357/*              $chars = array_keys($this->chars);
     358                $this->subsettedChars = $chars;
     359                $this->subsettedGlyphs = array();
     360                for($i=0;$i<$this->numGlyphs;$i++)
     361                {
     362                        $this->subsettedGlyphs[] = $i;
     363                        $this->glyphs[$i]['ssid'] = $i;
     364                }*/
     365
     366                $this->AddGlyph(0);
     367                $this->subsettedChars = array();
     368                foreach($chars as $char)
     369                {
     370                        if(isset($this->chars[$char]))
     371                        {
     372                                $this->subsettedChars[] = $char;
     373                                $this->AddGlyph($this->chars[$char]);
     374                        }
     375                }
     376        }
     377
     378        function AddGlyph($id)
     379        {
     380                if(!isset($this->glyphs[$id]['ssid']))
     381                {
     382                        $this->glyphs[$id]['ssid'] = count($this->subsettedGlyphs);
     383                        $this->subsettedGlyphs[] = $id;
     384                        if(isset($this->glyphs[$id]['components']))
     385                        {
     386                                foreach($this->glyphs[$id]['components'] as $cid)
     387                                        $this->AddGlyph($cid);
     388                        }
     389                }
     390        }
     391
     392        function Build()
     393        {
     394                $this->BuildCmap();
     395                $this->BuildHhea();
     396                $this->BuildHmtx();
     397                $this->BuildLoca();
     398                $this->BuildGlyf();
     399                $this->BuildMaxp();
     400                $this->BuildPost();
     401                return $this->BuildFont();
     402        }
     403
     404        function BuildCmap()
     405        {
     406                if(!isset($this->subsettedChars))
     407                        return;
     408
     409                // Divide charset in contiguous segments
     410                $chars = $this->subsettedChars;
     411                sort($chars);
     412                $segments = array();
     413                $segment = array($chars[0], $chars[0]);
     414                for($i=1;$i<count($chars);$i++)
     415                {
     416                        if($chars[$i]>$segment[1]+1)
     417                        {
     418                                $segments[] = $segment;
     419                                $segment = array($chars[$i], $chars[$i]);
     420                        }
     421                        else
     422                                $segment[1]++;
     423                }
     424                $segments[] = $segment;
     425                $segments[] = array(0xFFFF, 0xFFFF);
     426                $segCount = count($segments);
     427
     428                // Build a Format 4 subtable
     429                $startCount = array();
     430                $endCount = array();
     431                $idDelta = array();
     432                $idRangeOffset = array();
     433                $glyphIdArray = '';
     434                for($i=0;$i<$segCount;$i++)
     435                {
     436                        list($start, $end) = $segments[$i];
     437                        $startCount[] = $start;
     438                        $endCount[] = $end;
     439                        if($start!=$end)
     440                        {
     441                                // Segment with multiple chars
     442                                $idDelta[] = 0;
     443                                $idRangeOffset[] = strlen($glyphIdArray) + ($segCount-$i)*2;
     444                                for($c=$start;$c<=$end;$c++)
     445                                {
     446                                        $ssid = $this->glyphs[$this->chars[$c]]['ssid'];
     447                                        $glyphIdArray .= pack('n', $ssid);
     448                                }
     449                        }
     450                        else
     451                        {
     452                                // Segment with a single char
     453                                if($start<0xFFFF)
     454                                        $ssid = $this->glyphs[$this->chars[$start]]['ssid'];
     455                                else
     456                                        $ssid = 0;
     457                                $idDelta[] = $ssid - $start;
     458                                $idRangeOffset[] = 0;
     459                        }
     460                }
     461                $entrySelector = 0;
     462                $n = $segCount;
     463                while($n!=1)
     464                {
     465                        $n = $n>>1;
     466                        $entrySelector++;
     467                }
     468                $searchRange = (1<<$entrySelector)*2;
     469                $rangeShift = 2*$segCount - $searchRange;
     470                $cmap = pack('nnnn', 2*$segCount, $searchRange, $entrySelector, $rangeShift);
     471                foreach($endCount as $val)
     472                        $cmap .= pack('n', $val);
     473                $cmap .= pack('n', 0); // reservedPad
     474                foreach($startCount as $val)
     475                        $cmap .= pack('n', $val);
     476                foreach($idDelta as $val)
     477                        $cmap .= pack('n', $val);
     478                foreach($idRangeOffset as $val)
     479                        $cmap .= pack('n', $val);
     480                $cmap .= $glyphIdArray;
     481
     482                $data = pack('nn', 0, 1); // version, numTables
     483                $data .= pack('nnN', 3, 1, 12); // platformID, encodingID, offset
     484                $data .= pack('nnn', 4, 6+strlen($cmap), 0); // format, length, language
     485                $data .= $cmap;
     486                $this->SetTable('cmap', $data);
     487        }
     488
     489        function BuildHhea()
     490        {
     491                $this->LoadTable('hhea');
     492                $numberOfHMetrics = count($this->subsettedGlyphs);
     493                $data = substr_replace($this->tables['hhea']['data'], pack('n',$numberOfHMetrics), 4+15*2, 2);
     494                $this->SetTable('hhea', $data);
     495        }
     496
     497        function BuildHmtx()
     498        {
     499                $data = '';
     500                foreach($this->subsettedGlyphs as $id)
     501                {
     502                        $glyph = $this->glyphs[$id];
     503                        $data .= pack('nn', $glyph['w'], $glyph['lsb']);
     504                }
     505                $this->SetTable('hmtx', $data);
     506        }
     507
     508        function BuildLoca()
     509        {
     510                $data = '';
     511                $offset = 0;
     512                foreach($this->subsettedGlyphs as $id)
     513                {
     514                        if($this->indexToLocFormat==0)
     515                                $data .= pack('n', $offset/2);
     516                        else
     517                                $data .= pack('N', $offset);
     518                        $offset += $this->glyphs[$id]['length'];
     519                }
     520                if($this->indexToLocFormat==0)
     521                        $data .= pack('n', $offset/2);
     522                else
     523                        $data .= pack('N', $offset);
     524                $this->SetTable('loca', $data);
     525        }
     526
     527        function BuildGlyf()
     528        {
     529                $tableOffset = $this->tables['glyf']['offset'];
     530                $data = '';
     531                foreach($this->subsettedGlyphs as $id)
     532                {
     533                        $glyph = $this->glyphs[$id];
     534                        fseek($this->f, $tableOffset+$glyph['offset'], SEEK_SET);
     535                        $glyph_data = $this->Read($glyph['length']);
     536                        if(isset($glyph['components']))
     537                        {
     538                                // Composite glyph
     539                                foreach($glyph['components'] as $offset=>$cid)
     540                                {
     541                                        $ssid = $this->glyphs[$cid]['ssid'];
     542                                        $glyph_data = substr_replace($glyph_data, pack('n',$ssid), $offset, 2);
     543                                }
     544                        }
     545                        $data .= $glyph_data;
     546                }
     547                $this->SetTable('glyf', $data);
     548        }
     549
     550        function BuildMaxp()
     551        {
     552                $this->LoadTable('maxp');
     553                $numGlyphs = count($this->subsettedGlyphs);
     554                $data = substr_replace($this->tables['maxp']['data'], pack('n',$numGlyphs), 4, 2);
     555                $this->SetTable('maxp', $data);
     556        }
     557
     558        function BuildPost()
     559        {
     560                $this->Seek('post');
     561                if($this->glyphNames)
     562                {
     563                        // Version 2.0
     564                        $numberOfGlyphs = count($this->subsettedGlyphs);
     565                        $numNames = 0;
     566                        $names = '';
     567                        $data = $this->Read(2*4+2*2+5*4);
     568                        $data .= pack('n', $numberOfGlyphs);
     569                        foreach($this->subsettedGlyphs as $id)
     570                        {
     571                                $name = $this->glyphs[$id]['name'];
     572                                if(is_string($name))
     573                                {
     574                                        $data .= pack('n', 258+$numNames);
     575                                        $names .= chr(strlen($name)).$name;
     576                                        $numNames++;
     577                                }
     578                                else
     579                                        $data .= pack('n', $name);
     580                        }
     581                        $data .= $names;
     582                }
     583                else
     584                {
     585                        // Version 3.0
     586                        $this->Skip(4);
     587                        $data = "\x00\x03\x00\x00";
     588                        $data .= $this->Read(4+2*2+5*4);
     589                }
     590                $this->SetTable('post', $data);
     591        }
     592
     593        function BuildFont()
     594        {
     595                $tags = array();
     596                foreach(array('cmap', 'cvt ', 'fpgm', 'glyf', 'head', 'hhea', 'hmtx', 'loca', 'maxp', 'name', 'post', 'prep') as $tag)
     597                {
     598                        if(isset($this->tables[$tag]))
     599                                $tags[] = $tag;
     600                }
     601                $numTables = count($tags);
     602                $offset = 12 + 16*$numTables;
     603                foreach($tags as $tag)
     604                {
     605                        if(!isset($this->tables[$tag]['data']))
     606                                $this->LoadTable($tag);
     607                        $this->tables[$tag]['offset'] = $offset;
     608                        $offset += strlen($this->tables[$tag]['data']);
     609                }
     610//              $this->tables['head']['data'] = substr_replace($this->tables['head']['data'], "\x00\x00\x00\x00", 8, 4);
     611
     612                // Build offset table
     613                $entrySelector = 0;
     614                $n = $numTables;
     615                while($n!=1)
     616                {
     617                        $n = $n>>1;
     618                        $entrySelector++;
     619                }
     620                $searchRange = 16*(1<<$entrySelector);
     621                $rangeShift = 16*$numTables - $searchRange;
     622                $offsetTable = pack('nnnnnn', 1, 0, $numTables, $searchRange, $entrySelector, $rangeShift);
     623                foreach($tags as $tag)
     624                {
     625                        $table = $this->tables[$tag];
     626                        $offsetTable .= $tag.$table['checkSum'].pack('NN', $table['offset'], $table['length']);
     627                }
     628
     629                // Compute checkSumAdjustment (0xB1B0AFBA - font checkSum)
     630                $s = $this->CheckSum($offsetTable);
     631                foreach($tags as $tag)
     632                        $s .= $this->tables[$tag]['checkSum'];
     633                $a = unpack('n2', $this->CheckSum($s));
     634                $high = 0xB1B0 + ($a[1]^0xFFFF);
     635                $low = 0xAFBA + ($a[2]^0xFFFF) + 1;
     636                $checkSumAdjustment = pack('nn', $high+($low>>16), $low);
     637                $this->tables['head']['data'] = substr_replace($this->tables['head']['data'], $checkSumAdjustment, 8, 4);
     638
     639                $font = $offsetTable;
     640                foreach($tags as $tag)
     641                        $font .= $this->tables[$tag]['data'];
     642
     643                return $font;
     644        }
     645
     646        function LoadTable($tag)
     647        {
     648                $this->Seek($tag);
     649                $length = $this->tables[$tag]['length'];
     650                $n = $length % 4;
     651                if($n>0)
     652                        $length += 4 - $n;
     653                $this->tables[$tag]['data'] = $this->Read($length);
     654        }
     655
     656        function SetTable($tag, $data)
     657        {
     658                $length = strlen($data);
     659                $n = $length % 4;
     660                if($n>0)
     661                        $data = str_pad($data, $length+4-$n, "\x00");
     662                $this->tables[$tag]['data'] = $data;
     663                $this->tables[$tag]['length'] = $length;
     664                $this->tables[$tag]['checkSum'] = $this->CheckSum($data);
    249665        }
    250666
     
    253669                if(!isset($this->tables[$tag]))
    254670                        $this->Error('Table not found: '.$tag);
    255                 fseek($this->f, $this->tables[$tag], SEEK_SET);
     671                fseek($this->f, $this->tables[$tag]['offset'], SEEK_SET);
    256672        }
    257673
     
    263679        function Read($n)
    264680        {
    265                 return fread($this->f, $n);
     681                return $n>0 ? fread($this->f, $n) : '';
    266682        }
    267683
     
    286702                return $a['N'];
    287703        }
     704
     705        function CheckSum($s)
     706        {
     707                $n = strlen($s);
     708                $high = 0;
     709                $low = 0;
     710                for($i=0;$i<$n;$i+=4)
     711                {
     712                        $high += (ord($s[$i])<<8) + ord($s[$i+1]);
     713                        $low += (ord($s[$i+2])<<8) + ord($s[$i+3]);
     714                }
     715                return pack('nn', $high+($low>>16), $low);
     716        }
     717
     718        function Error($msg)
     719        {
     720                throw new Exception($msg);
     721        }
    288722}
    289723?>
  • _plugins_/fpdf/paquet.xml

    r97785 r99921  
    22        prefix="fpdf"
    33        categorie="outil"
    4         version="1.0.2"
     4        version="1.1.0"
    55        etat="stable"
    66        compatibilite="[2.0.0;3.1.*]"
     
    1515        <auteur>Olivier PLATHEY</auteur>
    1616
    17         <copyright>2004-2011</copyright>
     17        <copyright>2004-2016</copyright>
    1818        <licence lien="http://www.apache.org/licenses/LICENSE-2.0">Apache Licence, Version 2.0</licence>
    1919</paquet>
  • _plugins_/fpdf/plugin.xml

    r97796 r99921  
    77        </description>
    88        <auteur>[Pierre KUHN->http://www.pierre-kuhn.org], Olivier PLATHEY</auteur>
    9         <version>1.0.2</version>
    10         <licence>Apache license - (c) 2004-2011</licence>
     9        <version>1.1.0</version>
     10        <licence>Apache license - (c) 2004-2016</licence>
    1111        <etat>stable</etat>
    1212        <prefix>fpdf</prefix>
Note: See TracChangeset for help on using the changeset viewer.