当前位置:首页 > PHP教程 > php应用 > 列表

PHP获取ttf格式文件字体名的方法示例

发布:smiling 来源: PHP粉丝网  添加日期:2021-11-11 16:57:11 浏览: 评论:0 

这篇文章主要介绍了PHP获取ttf格式文件字体名的方法,结合实例形式分析了php读取ttf字体文件属性的相关操作技巧,需要的朋友可以参考下。

本文实例讲述了PHP获取ttf格式文件字体名的方法,分享给大家供大家参考,具体如下:

  1. <?php 
  2. $names = GetFontName('c:/windows/fonts/FZHPJW.TTF'); 
  3. foreach ($names as $name) { 
  4.   if ($name['language'] == 1033) 
  5.     $code = 'utf-16le'
  6.   elseif ($name['language'] == 2052) $code = 'utf-16be'
  7.   var_dump(mb_convert_encoding($name['name'],'utf-8',$code)); 
  8. function GetFontName($FilePath) { 
  9.   $fp = fopen($FilePath'r'); 
  10.   if ($fp) { 
  11.     //TT_OFFSET_TABLE 
  12.     $meta = unpack('n6'fread($fp, 12)); 
  13.     //检查是否是一个true type字体文件以及版本号是否为1.0 
  14.     if ($meta[1] != 1 || $meta[2] != 0) 
  15.       return FALSE; 
  16.     $Found = FALSE; 
  17.     for ($i = 0; $i < $meta[3]; $i++) { 
  18.       //TT_TABLE_DIRECTORY 
  19.       $tablemeta = unpack('N4'$data = fread($fp, 16)); 
  20.       if (substr($data, 0, 4) == 'name') { 
  21.         $Found = TRUE; 
  22.         break
  23.       } 
  24.     } 
  25.     if ($Found) { 
  26.       fseek($fp$tablemeta[3]); 
  27.       //TT_NAME_TABLE_HEADER 
  28.       $tablecount = unpack('n3'fread($fp, 6)); 
  29.       $Found = FALSE; 
  30.       for ($i = 0; $i < $tablecount[2]; $i++) { 
  31.         //TT_NAME_RECORD 
  32.         $table = unpack('n6'fread($fp, 12)); 
  33.         if ($table[4] == 1) { 
  34.           $npos = ftell($fp); 
  35.           fseek($fp$n = $tablemeta[3] + $tablecount[3] + $table[6], SEEK_SET); 
  36.           $fontname = trim($x = fread($fp$table[5])); 
  37.           if (strlen($fontname) > 0) { 
  38.             $names[] = array ( 
  39.                 'platform' => $table[1], //平台(操作系统) 
  40.     'language' => $table[3], //字体名称的语言 
  41.     'encoding' => $table[2], //字体名称的编码 
  42.     'name' => $fontname //字体名称 
  43.             ); 
  44.             //break; 
  45.           } 
  46.           fseek($fp$npos, SEEK_SET); 
  47.         } 
  48.       } 
  49.     } 
  50.     fclose($fp); 
  51.   } 
  52.   return $names
  53. ?> 

运行结果:

string(6) "SimHei"

string(5) "SimHe" //貌似有UTF-16LE编码漏字的BUG

string(6) "黑体"

注:如果这里仅需要获取字体名称,可将上述代码进行改进如下:

  1. <?php 
  2. $names = GetFontName('c:/windows/fonts/FZHPJW.TTF'); 
  3. $newnames = array(); 
  4. foreach ($names as $name) { 
  5.   if ($name['language'] == 1033) 
  6.     $code = 'utf-16le'
  7.   elseif ($name['language'] == 2052) $code = 'utf-16be'
  8.   array_push($newnames,@mb_convert_encoding($name['name'], 'utf-8'$code)); 
  9. $font_name=array_pop($newnames); 
  10. echo $font_name
  11. function GetFontName($FilePath) { 
  12.   $fp = fopen($FilePath'r'); 
  13.   if ($fp) { 
  14.     //TT_OFFSET_TABLE 
  15.     $meta = unpack('n6'fread($fp, 12)); 
  16.     //检查是否是一个true type字体文件以及版本号是否为1.0 
  17.     if ($meta[1] != 1 || $meta[2] != 0) 
  18.       return FALSE; 
  19.     $Found = FALSE; 
  20.     for ($i = 0; $i < $meta[3]; $i++) { 
  21.       //TT_TABLE_DIRECTORY 
  22.       $tablemeta = unpack('N4'$data = fread($fp, 16)); 
  23.       if (substr($data, 0, 4) == 'name') { 
  24.         $Found = TRUE; 
  25.         break
  26.       } 
  27.     } 
  28.     if ($Found) { 
  29.       fseek($fp$tablemeta[3]); 
  30.       //TT_NAME_TABLE_HEADER 
  31.       $tablecount = unpack('n3'fread($fp, 6)); 
  32.       $Found = FALSE; 
  33.       for ($i = 0; $i < $tablecount[2]; $i++) { 
  34.         //TT_NAME_RECORD 
  35.         $table = unpack('n6'fread($fp, 12)); 
  36.         if ($table[4] == 1) { 
  37.           $npos = ftell($fp); 
  38.           fseek($fp$n = $tablemeta[3] + $tablecount[3] + $table[6], SEEK_SET); 
  39.           $fontname = trim($x = fread($fp$table[5])); 
  40.           if (strlen($fontname) > 0) { 
  41.             $names[] = array ( 
  42.                 'platform' => $table[1], //平台(操作系统) 
  43.     'language' => $table[3], //字体名称的语言 
  44.     'encoding' => $table[2], //字体名称的编码 
  45.     'name' => $fontname //字体名称 
  46.             ); 
  47.             //break; 
  48.           } 
  49.           fseek($fp$npos, SEEK_SET); 
  50.         } 
  51.       } 
  52.     } 
  53.     fclose($fp); 
  54.   } 
  55.   return $names
  56. ?> 

则此时可直接输出:

黑体

Tags: PHP获取ttf

分享到: