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


Posted in PHP onMarch 06, 2019

本文实例讲述了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编码漏字的BUG
string(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 相关文章推荐
WINDOWS 2000下使用ISAPI方式安装PHP
Sep 05 PHP
桌面中心(一)创建数据库
Oct 09 PHP
DISCUZ 论坛管理员密码忘记的解决方法
May 14 PHP
PHP+XML 制作简单的留言本 图文教程
Nov 02 PHP
php下正则来匹配dede模板标签的代码
Aug 21 PHP
解析PHP跳出循环的方法以及continue、break、exit的区别介绍
Jul 01 PHP
php数组保存文本与文本反编成数组实例
Nov 13 PHP
PHP实现QQ快速登录的方法
Sep 28 PHP
php多线程并发实现方法
Sep 30 PHP
PHP处理Ajax请求与Ajax跨域问题
Feb 13 PHP
Laravel框架自定义验证过程实例分析
Feb 01 PHP
phpStorm2020 注册码
Sep 17 PHP
php ajax confirm 删除实例详解
Mar 06 #PHP
详解PHP多个进程配合redis的有序集合实现大文件去重
Mar 06 #PHP
一次因composer错误使用引发的问题与解决
Mar 06 #PHP
利用PHP如何统计Nginx日志的User Agent数据
Mar 06 #PHP
浅谈php://filter的妙用
Mar 05 #PHP
PHP实现微信小程序用户授权的工具类示例
Mar 05 #PHP
统计PHP目录中的文件数方法
Mar 05 #PHP
You might like
php zlib压缩和解压缩swf文件的代码
2008/12/30 PHP
深入探讨:PHP使用数据库永久连接方式操作MySQL的是与非
2013/06/05 PHP
thinkphp实现多语言功能(语言包)
2014/03/04 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
Laravel框架定时任务2种实现方式示例
2018/12/08 PHP
分享27个jQuery 表单插件集合推荐
2011/04/25 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
JS实现点击登录弹出窗口同时背景色渐变动画效果
2016/03/25 Javascript
jQuery动态增减行的实例代码解析(推荐)
2016/12/05 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
vue filters的使用详解
2018/06/11 Javascript
让webpack+vue-cil项目不再自动打开浏览器的方法
2018/09/27 Javascript
使用JS监听键盘按下事件(keydown event)
2019/11/07 Javascript
如何使用Javascript中的this关键字
2020/05/28 Javascript
JS PHP字符串截取函数实现原理解析
2020/08/29 Javascript
原生JS实现音乐播放器的示例代码
2021/02/25 Javascript
Python抽象类的新写法
2015/06/18 Python
Python程序中用csv模块来操作csv文件的基本使用教程
2016/03/03 Python
Python中的os.path路径模块中的操作方法总结
2016/07/07 Python
python中使用iterrows()对dataframe进行遍历的实例
2018/06/09 Python
Python Pandas 获取列匹配特定值的行的索引问题
2019/07/01 Python
在cmd中查看python的安装路径方法
2019/07/03 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
师范学院毕业生求职信范文
2013/12/26 职场文书
高中历史教学反思
2014/02/08 职场文书
餐饮部总监岗位职责范文
2014/02/13 职场文书
体育课课后反思
2014/04/24 职场文书
2014年秋季开学寄语
2014/08/02 职场文书
在职证明书范本(2014新版)
2014/09/25 职场文书
个人房屋转让协议书范本
2014/10/26 职场文书
2014乡党委副书记党建工作汇报材料
2014/11/02 职场文书
先进员工事迹材料
2014/12/20 职场文书
美丽心灵观后感
2015/06/01 职场文书
观看禁毒宣传片后的感想
2015/08/11 职场文书
详解Python牛顿插值法
2021/05/11 Python
Python自动化工具之实现Excel转Markdown表格
2022/04/08 Python