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 相关文章推荐
Admin generator, filters and I18n
Oct 06 PHP
深入php var_dump()函数的详解
Jun 05 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
Apr 24 PHP
php合并数组中相同元素的方法
Nov 13 PHP
PHP中配置IIS7实现基本身份验证的方法
Sep 24 PHP
Joomla实现组件中弹出一个模式(modal)窗口的方法
May 04 PHP
php自定义函数实现汉字转换utf8编码的方法
Sep 29 PHP
PHP SFTP实现上传下载功能
Jul 26 PHP
Laravel实现定时任务的示例代码
Aug 10 PHP
Laravel修改验证提示信息为中文的示例
Oct 23 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
Dec 30 PHP
浅谈PHP之ThinkPHP框架使用详解
Jul 21 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
linux下安装php的memcached客户端
2014/08/03 PHP
php cookie名使用点号(句号)会被转换
2014/10/23 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
PHP+Redis链表解决高并发下商品超卖问题(实现原理及步骤)
2020/08/03 PHP
JAVASCRIPT对象及属性
2007/02/13 Javascript
动态刷新 dorado树的js代码
2009/06/12 Javascript
多种方法判断Javascript对象是否存在
2013/09/22 Javascript
javascript匿名函数实例分析
2014/11/18 Javascript
js预加载图片方法汇总
2015/06/15 Javascript
使用jquery+CSS3实现仿windows10开始菜单的下拉导航菜单特效
2015/09/24 Javascript
jquery拖拽排序简单实现方法(效果增强版)
2016/02/16 Javascript
浅谈Node.js 子进程与应用场景
2018/01/24 Javascript
vue实现简易图片左右旋转,上一张,下一张组件案例
2020/07/31 Javascript
Vue使用axios引起的后台session不同操作
2020/08/14 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
Python实现多线程抓取妹子图
2015/08/08 Python
Python实现GUI学生信息管理系统
2020/04/05 Python
python Django编写接口并用Jmeter测试的方法
2019/07/31 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
Python创建一个元素都为0的列表实例
2019/11/28 Python
PyQt使用QPropertyAnimation开发简单动画
2020/04/02 Python
python实现文法左递归的消除方法
2020/05/22 Python
python如何利用Mitmproxy抓包
2020/10/10 Python
python 对象真假值的实例(哪些视为False)
2020/12/11 Python
CSS3 3D制作实战案例分析
2016/09/18 HTML / CSS
涂鸦板简单实现 Html5编写属于自己的画画板
2016/07/05 HTML / CSS
总经理岗位职责范本
2014/02/02 职场文书
大学生怎样写好自荐信
2014/02/25 职场文书
学习型党组织建设经验材料
2014/05/26 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
小学运动会班级口号
2014/06/09 职场文书
家属联谊会致辞
2015/07/31 职场文书
清明节随笔
2015/08/15 职场文书
MySQL 分组查询的优化方法
2021/05/12 MySQL
怎么禁用Windows 11快照布局? win11不使用快照布局的技巧
2021/11/21 数码科技