#!/usr/bin/env php * @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 in bulk. */ 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 = << dirname(__DIR__).'/target/fonts/'); // short input options $sopt = 'o:'; // long input options $lopt = array('outpath:'); // 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 'h': case 'help': default: showHelp(); break; } } // check input values if (!is_dir($options['outpath'])) { mkdir($options['outpath'], 0755, true); } if (!is_writable($options['outpath'])) { fwrite(STDERR, 'ERROR: Can\'t write to '.$options['outpath']."\n\n"); exit(2); } $ttfdir = __DIR__.'/vendor/tecnickcom/tc-font-mirror/'; if (!is_dir($ttfdir)) { fwrite(STDERR, 'ERROR: The '.$ttfdir.' directory is empty, please execute \'make build\' before this command.'."\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(__DIR__).'/vendor/autoload.php'); $fontdir = array_diff(scandir($ttfdir), array('.', '..', '.git')); // URL of websites containing the font sources $font_url = array( 'cid0' => 'http://unifoundry.com/unifont.html', 'core' => 'https://partners.adobe.com/public/developer/en/pdf/Core14_AFMs.zip', 'dejavu' => 'http://sourceforge.net/projects/dejavu/files/dejavu/2.35/dejavu-fonts-ttf-2.35.zip', 'freefont' => 'https://ftp.gnu.org/gnu/freefont/freefont-ttf-20120503.zip', 'pdfa' => 'https://github.com/tecnickcom/tc-font-pdfa', 'unifont' => 'http://unifoundry.com/unifont.html', ); foreach ($fontdir as $dir) { $indir = $ttfdir.$dir; if (!is_dir($indir)) { continue; } // search font files in sub directories $all_files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($indir)); $fonts = iterator_to_array(new RegexIterator($all_files, '/\.ttf$/')); $fonts = array_merge($fonts, iterator_to_array(new RegexIterator($all_files, '/\.pfb$/'))); $fonts = array_merge($fonts, iterator_to_array(new RegexIterator($all_files, '/\.otf$/'))); if (empty($fonts)) { $fonts = iterator_to_array(new RegexIterator($all_files, '/\.afm$/')); } if (empty($fonts)) { continue; } // build output path directory $outdir = $options['outpath'].$dir.'/'; if (!is_dir($outdir)) { mkdir($outdir, 0755, true); } copy($indir.'/LICENSE', $outdir.'LICENSE'); // generate a README file $readme = '# '.$dir.' font files for tc-lib-pdf-font'."\n\n" .'This folder contains font files and/or font data extracted from:'."\n" .$font_url[$dir]."\n" .'using the "bulk_convert.php" utility in https://github.com/tecnickcom/tc-font-pdf-font'."\n\n" .'The original files (if present) have been renamed and compressed using the ZLIB data format (.z files).'."\n" .'The font files are subject to the conditions stated in the LICENSE file.'."\n" .'For further information please consult the original documentation at the link above.'."\n"; file_put_contents($outdir.'README', $readme); foreach ($fonts as $font) { if (substr($font, -4) == '.otf') { // OTF fonts are not yet supported but we can try to convert them to TTF using FontForge system('fontforge -script otf2ttf.ff '.escapeshellcmd($font), $err); if ($err != 0) { fwrite(STDERR, "\033[31m".'Unable to convert: '.$font."\033[m"); continue; } $font = substr($font, 0, -4).'.ttf'; } $type = ''; $encoding = ''; if ($dir == 'cid0') { $type = strtoupper(basename($font, '.ttf')); } elseif (($dir == 'core') || ($dir == 'pdfa')) { if (strpos($font, 'Symbol') !== false) { $encoding = 'symbol'; } elseif (strpos($font, 'ZapfDingbats') === false) { $encoding = 'cp1252'; } } try { $import = new \Com\Tecnick\Pdf\Font\Import( realpath($font), $outdir, $type, $encoding ); $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);