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

<?php$names = GetFontName("c:/windows/fonts/FZHPJW.TTF");foreach ($names as $name) {  if ($name["language"] == 1033)    $code = "utf-16le";  elseif ($name["language"] == 2052) $code = "utf-16be";  var_dump(mb_convert_encoding($name["name"],"utf-8",$code));}function GetFontName($FilePath) {  $fp = fopen($FilePath, "r");  if ($fp) {    //TT_OFFSET_TABLE    $meta = unpack("n6", fread($fp, 12));    //检查是否是一个true type字体文件以及版本号是否为1.0    if ($meta[1] != 1 || $meta[2] != 0)      return FALSE;    $Found = FALSE;    for ($i = 0; $i < $meta[3]; $i++) {      //TT_TABLE_DIRECTORY      $tablemeta = unpack("N4", $data = fread($fp, 16));      if (substr($data, 0, 4) == "name") {        $Found = TRUE;        break;      }    }    if ($Found) {      fseek($fp, $tablemeta[3]);      //TT_NAME_TABLE_HEADER      $tablecount = unpack("n3", fread($fp, 6));      $Found = FALSE;      for ($i = 0; $i < $tablecount[2]; $i++) {        //TT_NAME_RECORD        $table = unpack("n6", fread($fp, 12));        if ($table[4] == 1) {          $npos = ftell($fp);          fseek($fp, $n = $tablemeta[3] + $tablecount[3] + $table[6], SEEK_SET);          $fontname = trim($x = fread($fp, $table[5]));          if (strlen($fontname) > 0) {            $names[] = array (                "platform" => $table[1], //平台(操作系统)    "language" => $table[3], //字体名称的语言    "encoding" => $table[2], //字体名称的编码    "name" => $fontname //字体名称            );            //break;          }          fseek($fp, $npos, SEEK_SET);        }      }    }    fclose($fp);  }  return $names;}?>

运行结果:

string(6) "SimHei"string(5) "SimHe" //貌似有UTF-16LE编码漏字的BUGstring(6) "黑体"

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

<?php$names = GetFontName("c:/windows/fonts/FZHPJW.TTF");$newnames = array();foreach ($names as $name) {  if ($name["language"] == 1033)    $code = "utf-16le";  elseif ($name["language"] == 2052) $code = "utf-16be";  array_push($newnames,@mb_convert_encoding($name["name"], "utf-8", $code));}$font_name=array_pop($newnames);echo $font_name;function GetFontName($FilePath) {  $fp = fopen($FilePath, "r");  if ($fp) {    //TT_OFFSET_TABLE    $meta = unpack("n6", fread($fp, 12));    //检查是否是一个true type字体文件以及版本号是否为1.0    if ($meta[1] != 1 || $meta[2] != 0)      return FALSE;    $Found = FALSE;    for ($i = 0; $i < $meta[3]; $i++) {      //TT_TABLE_DIRECTORY      $tablemeta = unpack("N4", $data = fread($fp, 16));      if (substr($data, 0, 4) == "name") {        $Found = TRUE;        break;      }    }    if ($Found) {      fseek($fp, $tablemeta[3]);      //TT_NAME_TABLE_HEADER      $tablecount = unpack("n3", fread($fp, 6));      $Found = FALSE;      for ($i = 0; $i < $tablecount[2]; $i++) {        //TT_NAME_RECORD        $table = unpack("n6", fread($fp, 12));        if ($table[4] == 1) {          $npos = ftell($fp);          fseek($fp, $n = $tablemeta[3] + $tablecount[3] + $table[6], SEEK_SET);          $fontname = trim($x = fread($fp, $table[5]));          if (strlen($fontname) > 0) {            $names[] = array (                "platform" => $table[1], //平台(操作系统)    "language" => $table[3], //字体名称的语言    "encoding" => $table[2], //字体名称的编码    "name" => $fontname //字体名称            );            //break;          }          fseek($fp, $npos, SEEK_SET);        }      }    }    fclose($fp);  }  return $names;}?>

则此时可直接输出:

黑体

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php文件操作总结》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP基本语法入门教程》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。