259 lines
6.9 KiB
PHP
259 lines
6.9 KiB
PHP
#!/usr/bin/env php
|
|
<?php
|
|
/**
|
|
* convert.php
|
|
*
|
|
* @since 2011-05-23
|
|
* @category Library
|
|
* @package PdfFont
|
|
* @author Nicola Asuni <info@tecnick.com>
|
|
* @copyright 2011-2024 Nicola Asuni - Tecnick.com LTD
|
|
* @license http://www.gnu.org/copyleft/lesser.html GNU-LGPL v3 (see LICENSE.TXT)
|
|
* @link https://github.com/tecnickcom/tc-lib-pdf-font
|
|
*
|
|
* This file is part of tc-lib-pdf-font software library.
|
|
*
|
|
* Command-line tool to convert fonts data for the tc-lib-pdf-font library.
|
|
*/
|
|
|
|
if (php_sapi_name() != 'cli') {
|
|
fwrite(STDERR, 'You need to run this command from console.'."\n");
|
|
exit(1);
|
|
}
|
|
|
|
/**
|
|
* Display help guide for this command.
|
|
*/
|
|
function showHelp()
|
|
{
|
|
$help = <<<EOD
|
|
|
|
convert - Command-line tool to convert fonts data for the tc-lib-pdf-font library.
|
|
|
|
Usage:
|
|
convert.php [ options ] -i fontfile[,fontfile]...
|
|
|
|
Options:
|
|
|
|
-o, --outpath
|
|
Output path for generated font files (must be writeable by the
|
|
web server). Leave empty for default font folder.
|
|
|
|
-t, --type
|
|
Font type. Leave empty for autodetect mode.
|
|
Valid values are:
|
|
Core
|
|
TrueTypeUnicode
|
|
TrueType
|
|
Type1
|
|
CID0JP = CID-0 Japanese
|
|
CID0KR = CID-0 Korean
|
|
CID0CS = CID-0 Chinese Simplified
|
|
CID0CT = CID-0 Chinese Traditional
|
|
|
|
-e, --encoding
|
|
Name of the encoding table to use.
|
|
Leave empty for default mode.
|
|
Omit this parameter for TrueTypeUnicode and symbolic fonts
|
|
like Symbol or ZapfDingBats.
|
|
|
|
-f, --flags
|
|
Unsigned 32-bit integer containing flags specifying various
|
|
characteristics of the font (see PDF32000:2008 - 9.8.2 Font
|
|
Descriptor Flags):
|
|
+1 for fixed font;
|
|
+4 for symbol;
|
|
+32 for non-symbol;
|
|
+64 for italic.
|
|
Fixed and Italic mode are generally autodetected so you have
|
|
to set it to:
|
|
4 = symbolic font;
|
|
32 = non-symbolic font (default).
|
|
|
|
-p, --platform_id
|
|
Platform ID for CMAP table to extract (when building a Unicode
|
|
font for Windows this value should be 3, for Macintosh should
|
|
be 1).
|
|
|
|
-n, --encoding_id
|
|
Encoding ID for CMAP table to extract (when building a Unicode
|
|
font for Windows this value should be 1, for Macintosh should
|
|
be 0).
|
|
When Platform ID is 3, legal values for Encoding ID are:
|
|
0 = Symbol,
|
|
1 = Unicode,
|
|
2 = ShiftJIS,
|
|
3 = PRC,
|
|
4 = Big5,
|
|
5 = Wansung,
|
|
6 = Johab,
|
|
7 = Reserved,
|
|
8 = Reserved,
|
|
9 = Reserved,
|
|
10 = UCS-4.
|
|
|
|
-l, --linked
|
|
Link to system font instead of copying the font data (not
|
|
transportable).
|
|
Note: this feature is unsupported by Type1 fonts.
|
|
|
|
-i, --fonts
|
|
Comma-separated list of input font files.
|
|
|
|
-h, --help
|
|
Display this help and exit.
|
|
|
|
Examples:
|
|
|
|
./convert.php --outpath=/tmp/ --type=Type1 --encoding=cp1252 --flags=97 --encoding_id=1 \
|
|
--fonts=/tmp/pdfa/pdfacourieri.pfb,/tmp/pdfa/pdfacourierbi.pfb
|
|
|
|
./convert.php --outpath=/tmp/ --type=TrueTypeUnicode --flags=32 --encoding_id=1 \
|
|
--fonts=/tmp/freefont-20120503/FreeSans.ttf
|
|
|
|
./convert.php --outpath=/tmp/ --type=TrueTypeUnicode --flags=97 --encoding_id=1 \
|
|
--fonts=/tmp/dejavu-fonts-ttf-2.35/ttf/DejaVuSansMono-BoldOblique.ttf
|
|
|
|
|
|
EOD;
|
|
fwrite(STDOUT, $help);
|
|
exit(0);
|
|
}
|
|
|
|
// remove the name of the executing script
|
|
array_shift($argv);
|
|
|
|
// no options chosen, display help
|
|
if (empty($argv)) {
|
|
showHelp();
|
|
}
|
|
|
|
// initialize the array of options
|
|
$options = array(
|
|
'outpath' => './',
|
|
'type' => '',
|
|
'encoding' => '',
|
|
'flags' => 32,
|
|
'platform_id' => 3,
|
|
'encoding_id' => 1,
|
|
'linked' => false
|
|
);
|
|
|
|
// short input options
|
|
$sopt = 't:e:f:o:p:n:li:h';
|
|
|
|
// long input options
|
|
$lopt = array(
|
|
'outpath:',
|
|
'type:',
|
|
'encoding:',
|
|
'flags:',
|
|
'platform_id:',
|
|
'encoding_id:',
|
|
'linked',
|
|
'fonts:',
|
|
'help'
|
|
);
|
|
|
|
// parse input options
|
|
$inopt = getopt($sopt, $lopt);
|
|
|
|
// import options (with some sanitization)
|
|
foreach ($inopt as $opt => $val) {
|
|
switch ($opt) {
|
|
case 'o':
|
|
case 'outpath':
|
|
$options['outpath'] = realpath($val);
|
|
if (substr($options['outpath'], -1) != '/') {
|
|
$options['outpath'] .= '/';
|
|
}
|
|
break;
|
|
case 't':
|
|
case 'type':
|
|
if (in_array($val, array('TrueTypeUnicode', 'TrueType', 'Type1', 'CID0JP', 'CID0KR', 'CID0CS', 'CID0CT'))) {
|
|
$options['type'] = $val;
|
|
}
|
|
break;
|
|
case 'e':
|
|
case 'encoding':
|
|
$options['encoding'] = $val;
|
|
break;
|
|
case 'f':
|
|
case 'flags':
|
|
$options['flags'] = intval($val);
|
|
break;
|
|
case 'p':
|
|
case 'platform_id':
|
|
$options['platform_id'] = min(max(1, intval($val)), 3);
|
|
break;
|
|
case 'n':
|
|
case 'encoding_id':
|
|
$options['encoding_id'] = min(max(0, intval($val)), 10);
|
|
break;
|
|
case 'l':
|
|
case 'linked':
|
|
$options['linked'] = true;
|
|
break;
|
|
case 'i':
|
|
case 'fonts':
|
|
$options['fonts'] = explode(',', $val);
|
|
break;
|
|
case 'h':
|
|
case 'help':
|
|
default:
|
|
showHelp();
|
|
break;
|
|
}
|
|
}
|
|
|
|
// check input values
|
|
|
|
if (!is_dir($options['outpath']) || !is_writable($options['outpath'])) {
|
|
fwrite(STDERR, 'ERROR: Can\'t write to '.$options['outpath']."\n\n");
|
|
exit(2);
|
|
}
|
|
|
|
if (empty($options['fonts'])) {
|
|
fwrite(STDERR, 'ERROR: missing input fonts (try --help for usage)'."\n\n");
|
|
exit(3);
|
|
}
|
|
|
|
fwrite(STDOUT, "\n".'>>> Converting fonts:'."\n".'*** Output directory set to '.$options['outpath']."\n");
|
|
|
|
// count conversions
|
|
$convert_errors = 0;
|
|
$convert_success = 0;
|
|
|
|
require_once (dirname(dirname(__DIR__)).'/vendor/autoload.php');
|
|
|
|
foreach ($options['fonts'] as $font) {
|
|
try {
|
|
$import = new \Com\Tecnick\Pdf\Font\Import(
|
|
realpath($font),
|
|
$options['outpath'],
|
|
$options['type'],
|
|
$options['encoding'],
|
|
$options['flags'],
|
|
$options['platform_id'],
|
|
$options['encoding_id'],
|
|
$options['linked']
|
|
);
|
|
$fontname = $import->getFontName();
|
|
fwrite(STDOUT, "\033[32m".'+++ OK : '.$font.' added as '.$fontname."\033[m\n");
|
|
++$convert_success;
|
|
} catch (\Exception $exc) {
|
|
++$convert_errors;
|
|
fwrite(STDERR, "\033[31m".'--- ERROR: can\'t add '.$font."\n ".$exc->getMessage()."\033[m\n");
|
|
}
|
|
}
|
|
|
|
$endmsg = '>>> PROCESS COMPLETED: '.$convert_success.' CONVERTED FONT(S), '.$convert_errors.' ERROR(S)!'."\n\n";
|
|
|
|
if ($convert_errors > 0) {
|
|
fwrite(STDERR, "\033[31m".$endmsg.'ERROR'."\033[m");
|
|
exit(4);
|
|
}
|
|
|
|
fwrite(STDOUT, "\033[32m".$endmsg."\033[m");
|
|
exit(0);
|