1#!/usr/bin/env php 2<?php 3//============================================================+ 4// File name : tcpdf_addfont.php 5// Version : 1.0.002 6// Begin : 2013-05-13 7// Last Update : 2013-08-05 8// Authors : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com 9// Remi Collet 10// License : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html) 11// ------------------------------------------------------------------- 12// Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD 13// 14// This file is part of TCPDF software library. 15// 16// TCPDF is free software: you can redistribute it and/or modify it 17// under the terms of the GNU Lesser General Public License as 18// published by the Free Software Foundation, either version 3 of the 19// License, or (at your option) any later version. 20// 21// TCPDF is distributed in the hope that it will be useful, but 22// WITHOUT ANY WARRANTY; without even the implied warranty of 23// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 24// See the GNU Lesser General Public License for more details. 25// 26// You should have received a copy of the License 27// along with TCPDF. If not, see 28// <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>. 29// 30// See LICENSE.TXT file for more information. 31// ------------------------------------------------------------------- 32// 33// Description : This is a command line script to generate TCPDF fonts. 34// 35//============================================================+ 36 37/** 38 * @file 39 * This is a command line script to generate TCPDF fonts.<br> 40 * @package com.tecnick.tcpdf 41 * @version 1.0.000 42 */ 43 44if (php_sapi_name() != 'cli') { 45 echo 'You need to run this command from console.'; 46 exit(1); 47} 48 49$tcpdf_include_dirs = array(realpath(dirname(__FILE__).'/../tcpdf.php'), '/usr/share/php/tcpdf/tcpdf.php', '/usr/share/tcpdf/tcpdf.php', '/usr/share/php-tcpdf/tcpdf.php', '/var/www/tcpdf/tcpdf.php', '/var/www/html/tcpdf/tcpdf.php', '/usr/local/apache2/htdocs/tcpdf/tcpdf.php'); 50foreach ($tcpdf_include_dirs as $tcpdf_include_path) { 51 if (@file_exists($tcpdf_include_path)) { 52 require_once($tcpdf_include_path); 53 break; 54 } 55} 56 57/** 58 * Display help guide for this command. 59 */ 60function showHelp() { 61 $help = <<<EOD 62tcpdf_addfont - command line tool to convert fonts for the TCPDF library. 63 64Usage: tcpdf_addfont.php [ options ] -i fontfile[,fontfile]... 65 66Options: 67 68 -t 69 --type Font type. Leave empty for autodetect mode. 70 Valid values are: 71 TrueTypeUnicode 72 TrueType 73 Type1 74 CID0JP = CID-0 Japanese 75 CID0KR = CID-0 Korean 76 CID0CS = CID-0 Chinese Simplified 77 CID0CT = CID-0 Chinese Traditional 78 79 -e 80 --enc Name of the encoding table to use. Leave empty for 81 default mode. Omit this parameter for TrueType Unicode 82 and symbolic fonts like Symbol or ZapfDingBats. 83 84 -f 85 --flags Unsigned 32-bit integer containing flags specifying 86 various characteristics of the font (PDF32000:2008 - 87 9.8.2 Font Descriptor Flags): +1 for fixed font; +4 for 88 symbol or +32 for non-symbol; +64 for italic. Fixed and 89 Italic mode are generally autodetected so you have to 90 set it to 32 = non-symbolic font (default) or 4 = 91 symbolic font. 92 93 -o 94 --outpath Output path for generated font files (must be writeable 95 by the web server). Leave empty for default font folder. 96 97 -p 98 --platid Platform ID for CMAP table to extract (when building a 99 Unicode font for Windows this value should be 3, for 100 Macintosh should be 1). 101 102 -n 103 --encid Encoding ID for CMAP table to extract (when building a 104 Unicode font for Windows this value should be 1, for 105 Macintosh should be 0). When Platform ID is 3, legal 106 values for Encoding ID are: 0=Symbol, 1=Unicode, 107 2=ShiftJIS, 3=PRC, 4=Big5, 5=Wansung, 6=Johab, 108 7=Reserved, 8=Reserved, 9=Reserved, 10=UCS-4. 109 110 -b 111 --addcbbox Includes the character bounding box information on the 112 php font file. 113 114 -l 115 --link Link to system font instead of copying the font data # 116 (not transportable) - Note: do not work with Type1 fonts. 117 118 -i 119 --fonts Comma-separated list of input font files. 120 121 -h 122 --help Display this help and exit. 123EOD; 124 echo $help."\n\n"; 125 exit(0); 126} 127 128// remove the name of the executing script 129array_shift($argv); 130 131// no options chosen 132if (!is_array($argv)) { 133 showHelp(); 134} 135 136// initialize the array of options 137$options = array('type'=>'', 'enc'=>'', 'flags'=>32, 'outpath'=>K_PATH_FONTS, 'platid'=>3, 'encid'=>1, 'addcbbox'=>false, 'link'=>false); 138 139// short input options 140$sopt = ''; 141$sopt .= 't:'; 142$sopt .= 'e:'; 143$sopt .= 'f:'; 144$sopt .= 'o:'; 145$sopt .= 'p:'; 146$sopt .= 'n:'; 147$sopt .= 'b'; 148$sopt .= 'l'; 149$sopt .= 'i:'; 150$sopt .= 'h'; 151 152// long input options 153$lopt = array(); 154$lopt[] = 'type:'; 155$lopt[] = 'enc:'; 156$lopt[] = 'flags:'; 157$lopt[] = 'outpath:'; 158$lopt[] = 'platid:'; 159$lopt[] = 'encid:'; 160$lopt[] = 'addcbbox'; 161$lopt[] = 'link'; 162$lopt[] = 'fonts:'; 163$lopt[] = 'help'; 164 165// parse input options 166$inopt = getopt($sopt, $lopt); 167 168// import options (with some sanitization) 169foreach ($inopt as $opt => $val) { 170 switch ($opt) { 171 case 't': 172 case 'type': { 173 if (in_array($val, array('TrueTypeUnicode', 'TrueType', 'Type1', 'CID0JP', 'CID0KR', 'CID0CS', 'CID0CT'))) { 174 $options['type'] = $val; 175 } 176 break; 177 } 178 case 'e': 179 case 'enc': { 180 $options['enc'] = $val; 181 break; 182 } 183 case 'f': 184 case 'flags': { 185 $options['flags'] = intval($val); 186 break; 187 } 188 case 'o': 189 case 'outpath': { 190 $options['outpath'] = realpath($val); 191 if (substr($options['outpath'], -1) != '/') { 192 $options['outpath'] .= '/'; 193 } 194 break; 195 } 196 case 'p': 197 case 'platid': { 198 $options['platid'] = min(max(1, intval($val)), 3); 199 break; 200 } 201 case 'n': 202 case 'encid': { 203 $options['encid'] = min(max(0, intval($val)), 10); 204 break; 205 } 206 case 'b': 207 case 'addcbbox': { 208 $options['addcbbox'] = true; 209 break; 210 } 211 case 'l': 212 case 'link': { 213 $options['link'] = true; 214 break; 215 } 216 case 'i': 217 case 'fonts': { 218 $options['fonts'] = explode(',', $val); 219 break; 220 } 221 case 'h': 222 case 'help': 223 default: { 224 showHelp(); 225 break; 226 } 227 } // end of switch 228} // end of while loop 229 230if (empty($options['fonts'])) { 231 echo "ERROR: missing input fonts (try --help for usage)\n\n"; 232 exit(2); 233} 234 235// check the output path 236if (!is_dir($options['outpath']) OR !is_writable($options['outpath'])) { 237 echo "ERROR: Can't write to ".$options['outpath']."\n\n"; 238 exit(3); 239} 240 241echo "\n>>> Converting fonts for TCPDF:\n"; 242 243echo '*** Output dir set to '.$options['outpath']."\n"; 244 245// check if there are conversion errors 246$errors = false; 247 248foreach ($options['fonts'] as $font) { 249 $fontfile = realpath($font); 250 $fontname = TCPDF_FONTS::addTTFfont($fontfile, $options['type'], $options['enc'], $options['flags'], $options['outpath'], $options['platid'], $options['encid'], $options['addcbbox'], $options['link']); 251 if ($fontname === false) { 252 $errors = true; 253 echo "--- ERROR: can't add ".$font."\n"; 254 } else { 255 echo "+++ OK : ".$fontfile.' added as '.$fontname."\n"; 256 } 257} 258 259if ($errors) { 260 echo "--- Process completed with ERRORS!\n\n"; 261 exit(4); 262} 263 264echo ">>> Process successfully completed!\n\n"; 265exit(0); 266 267//============================================================+ 268// END OF FILE 269//============================================================+ 270