Chris@909: = 0 && $cc < 0xFFFF && $glyph) { Chris@909: $cidtogidmap{$cc*2} = chr($glyph >> 8); Chris@909: $cidtogidmap{$cc*2 + 1} = chr($glyph & 0xFF); Chris@909: } Chris@909: } Chris@909: if($gn=='.notdef' && !isset($fm['MissingWidth'])) Chris@909: $fm['MissingWidth']=$w; Chris@909: } Chris@909: elseif($code=='FontName') Chris@909: $fm['FontName']=$param; Chris@909: elseif($code=='Weight') Chris@909: $fm['Weight']=$param; Chris@909: elseif($code=='ItalicAngle') Chris@909: $fm['ItalicAngle']=(double)$param; Chris@909: elseif($code=='Ascender') Chris@909: $fm['Ascender']=(int)$param; Chris@909: elseif($code=='Descender') Chris@909: $fm['Descender']=(int)$param; Chris@909: elseif($code=='UnderlineThickness') Chris@909: $fm['UnderlineThickness']=(int)$param; Chris@909: elseif($code=='UnderlinePosition') Chris@909: $fm['UnderlinePosition']=(int)$param; Chris@909: elseif($code=='IsFixedPitch') Chris@909: $fm['IsFixedPitch']=($param=='true'); Chris@909: elseif($code=='FontBBox') Chris@909: $fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]); Chris@909: elseif($code=='CapHeight') Chris@909: $fm['CapHeight']=(int)$param; Chris@909: elseif($code=='StdVW') Chris@909: $fm['StdVW']=(int)$param; Chris@909: } Chris@909: if(!isset($fm['MissingWidth'])) Chris@909: $fm['MissingWidth']=600; Chris@909: Chris@909: if(!isset($fm['FontName'])) Chris@909: die('FontName not found'); Chris@909: Chris@909: $fm['Widths']=$widths; Chris@909: Chris@909: return $fm; Chris@909: } Chris@909: Chris@909: function MakeFontDescriptor($fm) Chris@909: { Chris@909: //Ascent Chris@909: $asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000); Chris@909: $fd="{'Ascent'=>".$asc; Chris@909: //Descent Chris@909: $desc=(isset($fm['Descender']) ? $fm['Descender'] : -200); Chris@909: $fd.=",'Descent'=>".$desc; Chris@909: //CapHeight Chris@909: if(isset($fm['CapHeight'])) Chris@909: $ch=$fm['CapHeight']; Chris@909: elseif(isset($fm['CapXHeight'])) Chris@909: $ch=$fm['CapXHeight']; Chris@909: else Chris@909: $ch=$asc; Chris@909: $fd.=",'CapHeight'=>".$ch; Chris@909: //Flags Chris@909: $flags=0; Chris@909: if(isset($fm['IsFixedPitch']) and $fm['IsFixedPitch']) Chris@909: $flags+=1<<0; Chris@909: $flags+=1<<5; Chris@909: if(isset($fm['ItalicAngle']) and $fm['ItalicAngle']!=0) Chris@909: $flags+=1<<6; Chris@909: $fd.=",'Flags'=>".$flags; Chris@909: //FontBBox Chris@909: if(isset($fm['FontBBox'])) Chris@909: $fbb=$fm['FontBBox']; Chris@909: else Chris@909: $fbb=array(0,$des-100,1000,$asc+100); Chris@909: $fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'"; Chris@909: //ItalicAngle Chris@909: $ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0); Chris@909: $fd.=",'ItalicAngle'=>".$ia; Chris@909: //StemV Chris@909: if(isset($fm['StdVW'])) Chris@909: $stemv=$fm['StdVW']; Chris@909: elseif(isset($fm['Weight']) and eregi('(bold|black)',$fm['Weight'])) Chris@909: $stemv=120; Chris@909: else Chris@909: $stemv=70; Chris@909: $fd.=",'StemV'=>".$stemv; Chris@909: //MissingWidth Chris@909: if(isset($fm['MissingWidth'])) Chris@909: $fd.=",'MissingWidth'=>".$fm['MissingWidth']; Chris@909: $fd.='}'; Chris@909: return $fd; Chris@909: } Chris@909: Chris@909: function MakeWidthArray($fm) Chris@909: { Chris@909: //Make character width array Chris@909: $s="{"; Chris@909: $cw=$fm['Widths']; Chris@909: $els=array(); Chris@909: $c=0; Chris@909: foreach ($cw as $i => $w) Chris@909: { Chris@909: $els[] = ((($c++)%16==0)?"\n\t":'').$i.'=>'.$w; Chris@909: } Chris@909: $s .= implode(', ', $els); Chris@909: $s.='}'; Chris@909: return $s; Chris@909: } Chris@909: Chris@909: function SaveToFile($file,$s,$mode='t') Chris@909: { Chris@909: $f=fopen($file,'w'.$mode); Chris@909: if(!$f) Chris@909: die('Can\'t write to file '.$file); Chris@909: fwrite($f,$s,strlen($s)); Chris@909: fclose($f); Chris@909: } Chris@909: Chris@909: function ReadShort($f) Chris@909: { Chris@909: $a=unpack('n1n',fread($f,2)); Chris@909: return $a['n']; Chris@909: } Chris@909: Chris@909: function ReadLong($f) Chris@909: { Chris@909: $a=unpack('N1N',fread($f,4)); Chris@909: return $a['N']; Chris@909: } Chris@909: Chris@909: function CheckTTF($file) Chris@909: { Chris@909: //Check if font license allows embedding Chris@909: $f=fopen($file,'rb'); Chris@909: if(!$f) Chris@909: die('Error: Can\'t open '.$file); Chris@909: //Extract number of tables Chris@909: fseek($f,4,SEEK_CUR); Chris@909: $nb=ReadShort($f); Chris@909: fseek($f,6,SEEK_CUR); Chris@909: //Seek OS/2 table Chris@909: $found=false; Chris@909: for($i=0;$i<$nb;$i++) Chris@909: { Chris@909: if(fread($f,4)=='OS/2') Chris@909: { Chris@909: $found=true; Chris@909: break; Chris@909: } Chris@909: fseek($f,12,SEEK_CUR); Chris@909: } Chris@909: if(!$found) Chris@909: { Chris@909: fclose($f); Chris@909: return; Chris@909: } Chris@909: fseek($f,4,SEEK_CUR); Chris@909: $offset=ReadLong($f); Chris@909: fseek($f,$offset,SEEK_SET); Chris@909: //Extract fsType flags Chris@909: fseek($f,8,SEEK_CUR); Chris@909: $fsType=ReadShort($f); Chris@909: $rl=($fsType & 0x02)!=0; Chris@909: $pp=($fsType & 0x04)!=0; Chris@909: $e=($fsType & 0x08)!=0; Chris@909: fclose($f); Chris@909: if($rl and !$pp and !$e) Chris@909: echo 'Warning: font license does not allow embedding'; Chris@909: } Chris@909: Chris@909: /******************************************************************************* Chris@909: * $fontfile: path to TTF file (or empty string if not to be embedded) * Chris@909: * $ufmfile: path to UFM file * Chris@909: *******************************************************************************/ Chris@909: function MakeFont($fontfile,$ufmfile) Chris@909: { Chris@909: //Generate a font definition file Chris@909: set_magic_quotes_runtime(0); Chris@909: if(!file_exists($ufmfile)) Chris@909: die('Error: UFM file not found: '.$ufmfile); Chris@909: $cidtogidmap = ''; Chris@909: $fm=ReadUFM($ufmfile, $cidtogidmap); Chris@909: $fd=MakeFontDescriptor($fm); Chris@909: //Find font type Chris@909: if($fontfile) Chris@909: { Chris@909: $ext=strtolower(substr($fontfile,-3)); Chris@909: if($ext=='ttf') Chris@909: $type='TrueTypeUnicode'; Chris@909: else Chris@909: die('Error: not a truetype font: '.$ext); Chris@909: } Chris@909: else Chris@909: { Chris@909: if($type!='TrueTypeUnicode') Chris@909: die('Error: incorrect font type: '.$type); Chris@909: } Chris@909: //Start generation Chris@909: $basename=strtolower(substr(basename($ufmfile),0,-4)); Chris@909: $s='TCPDFFontDescriptor.define(\''.$basename."') do |font|\n"; Chris@909: $s.=" font[:type]='".$type."'\n"; Chris@909: $s.=" font[:name]='".$fm['FontName']."'\n"; Chris@909: $s.=" font[:desc]=".$fd."\n"; Chris@909: if(!isset($fm['UnderlinePosition'])) Chris@909: $fm['UnderlinePosition']=-100; Chris@909: if(!isset($fm['UnderlineThickness'])) Chris@909: $fm['UnderlineThickness']=50; Chris@909: $s.=" font[:up]=".$fm['UnderlinePosition']."\n"; Chris@909: $s.=" font[:ut]=".$fm['UnderlineThickness']."\n"; Chris@909: $s.=" font[:cw]=".MakeWidthArray($fm)."\n"; Chris@909: $s.=" font[:enc]=''\n"; Chris@909: $s.=" font[:diff]=''\n"; Chris@909: if($fontfile) Chris@909: { Chris@909: //Embedded font Chris@909: if(!file_exists($fontfile)) Chris@909: die('Error: font file not found: '.$fontfile); Chris@909: CheckTTF($fontfile); Chris@909: $f=fopen($fontfile,'rb'); Chris@909: if(!$f) Chris@909: die('Error: Can\'t open '.$fontfile); Chris@909: $file=fread($f,filesize($fontfile)); Chris@909: fclose($f); Chris@909: if(function_exists('gzcompress')) Chris@909: { Chris@909: $cmp=$basename.'.z'; Chris@909: SaveToFile($cmp,gzcompress($file),'b'); Chris@909: $s.=' font[:file]=\''.$cmp."'\n"; Chris@909: echo 'Font file compressed ('.$cmp.')
'; Chris@909: Chris@909: $cmp=$basename.'.ctg.z'; Chris@909: SaveToFile($cmp,gzcompress($cidtogidmap),'b'); Chris@909: echo 'CIDToGIDMap created and compressed ('.$cmp.')
'; Chris@909: $s.=' font[:ctg]=\''.$cmp."'\n"; Chris@909: } Chris@909: else Chris@909: { Chris@909: $s.='$file=\''.basename($fontfile)."'\n"; Chris@909: echo 'Notice: font file could not be compressed (gzcompress not available)
'; Chris@909: Chris@909: $cmp=$basename.'.ctg'; Chris@909: $f = fopen($cmp, 'wb'); Chris@909: fwrite($f, $cidtogidmap); Chris@909: fclose($f); Chris@909: echo 'CIDToGIDMap created ('.$cmp.')
'; Chris@909: $s.=' font[:ctg]=\''.$cmp."'\n"; Chris@909: } Chris@909: if($type=='Type1') Chris@909: { Chris@909: $s.=' font[:size1]='.$size1."\n"; Chris@909: $s.=' font[:size2]='.$size2."\n"; Chris@909: } Chris@909: else Chris@909: $s.=' font[:originalsize]='.filesize($fontfile)."\n"; Chris@909: } Chris@909: else Chris@909: { Chris@909: //Not embedded font Chris@909: $s.=' font[:file]='."''\n"; Chris@909: } Chris@909: $s.="end\n"; Chris@909: SaveToFile($basename.'.rb',$s); Chris@909: echo 'Font definition file generated ('.$basename.'.rb'.')
'; Chris@909: } Chris@909: Chris@909: $arg = $GLOBALS['argv']; Chris@909: if (count($arg) >= 3) { Chris@909: ob_start(); Chris@909: array_shift($arg); Chris@909: MakeFont($arg[0], $arg[1]); Chris@909: $t = ob_get_clean(); Chris@909: print preg_replace('!!i', "\n", $t); Chris@909: } Chris@909: else { Chris@909: print "Usage: makefontuni_ruby.php \n"; Chris@909: } Chris@909: ?>