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 相关文章推荐
一个用php实现的获取URL信息的类
Jan 02 PHP
在PHP中养成7个面向对象的好习惯
Jan 28 PHP
PHP 获取文件权限函数介绍
Jul 11 PHP
PHP中ob_start函数的使用说明
Nov 11 PHP
PHP中使用localhost连接Mysql不成功的解决方法
Aug 20 PHP
php实现通用的信用卡验证类
Mar 24 PHP
Yii2中设置与获取别名的函数(setAlias和getAlias)用法分析
Jul 25 PHP
php flush无效,IIS7下php实时输出的方法
Aug 25 PHP
PHP二维数组去重实例分析
Nov 18 PHP
Laravel多用户认证系统示例详解
Mar 13 PHP
一文掌握PHP Xdebug 本地与远程调试(小结)
Apr 23 PHP
PHP7生产环境队列Beanstalkd用法详解
May 19 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下实现伪 url 的超简单方法[转]
2007/09/24 PHP
php制作中间带自己定义图片二维码的方法
2014/01/27 PHP
Array对象方法参考
2006/10/03 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
运用JQuery的toggle实现网页加载完成自动弹窗
2014/03/18 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
JS中生成随机数的用法及相关函数
2016/01/09 Javascript
轻松掌握JavaScript中的Math object数学对象
2016/05/26 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
jQuery模拟淘宝购物车功能
2017/02/27 Javascript
Ajax验证用户名或昵称是否已被注册
2017/04/05 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
VUE重点问题总结
2018/03/19 Javascript
JS简单数组排序操作示例【sort方法】
2019/05/17 Javascript
解决在layer.open中使用时间控件laydate失败的问题
2019/09/11 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
iview form清除校验状态的实现
2019/09/19 Javascript
微信小程序用canvas画图并分享
2020/03/09 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
[54:05]DOTA2-DPC中国联赛定级赛 SAG vs iG BO3第一场 1月9日
2021/03/11 DOTA
python万年历实现代码 含运行结果
2017/05/20 Python
Python实现的概率分布运算操作示例
2017/08/14 Python
Python之dict(或对象)与json之间的互相转化实例
2018/06/05 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
python如何统计代码运行的时长
2019/07/24 Python
Python创建自己的加密货币的示例
2021/03/01 Python
如何用canvas实现在线签名的示例代码
2018/07/10 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
家得宝墨西哥官网:The Home Depot墨西哥
2019/11/18 全球购物
资产评估专业大学生求职信
2013/09/29 职场文书
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
勤俭节约倡议书范文
2015/04/29 职场文书
关于环保的宣传稿
2015/07/23 职场文书
Java实现学生管理系统(IO版)
2022/02/24 Java/Android