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 相关文章推荐
通过html表格发电子邮件
Oct 09 PHP
如何在WIN2K下安装PHP4.04
Oct 09 PHP
IStream与TStream之间的相互转换
Aug 01 PHP
GBK的页面输出JSON格式的php函数
Feb 16 PHP
php上传文件的增强函数
Jul 21 PHP
PHP+JS+rsa数据加密传输实现代码
Mar 23 PHP
PHP实现定时执行任务的方法
Oct 05 PHP
php内存缓存实现方法
Jan 24 PHP
PHP生成json和xml类型接口数据格式
May 17 PHP
PHP实现字符串的全排列详解
Apr 24 PHP
PHP基础之输出缓冲区基本概念、原理分析
Jun 19 PHP
Laravel5.1 框架响应基本用法实例分析
Jan 04 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
德劲1103二次变频版的打磨
2021/03/02 无线电
纯真IP数据库的应用 IP地址转化成十进制
2009/06/14 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
php判断两个浮点数是否相等的方法
2015/03/14 PHP
调试php程序的简单步骤
2019/10/04 PHP
php使用Swoole实现毫秒级定时任务的方法
2020/09/04 PHP
QQ登录简单实现代码
2021/03/09 Javascript
js复制网页内容并兼容各主流浏览器的代码
2013/12/17 Javascript
jquery教程ajax请求json数据示例
2014/01/13 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
js实现图片上传并正常显示
2015/12/19 Javascript
Vue.js render方法使用详解
2017/04/05 Javascript
vue实现搜索过滤效果
2019/05/28 Javascript
解决layui的radio属性或别的属性没显示出来的问题
2019/09/26 Javascript
JS实现音乐导航特效
2020/01/06 Javascript
Vue + Scss 动态切换主题颜色实现换肤的示例代码
2020/04/27 Javascript
[01:17]Ti4 循环赛第一日回顾
2014/07/11 DOTA
Phantomjs抓取渲染JS后的网页(Python代码)
2016/05/13 Python
Python生成随机密码的方法
2017/06/16 Python
教你用Python创建微信聊天机器人
2020/03/31 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
python 按钮点击关闭窗口的实现
2020/03/04 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
CSS的pointer-events属性详细介绍(作用和注意事项)
2014/04/23 HTML / CSS
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
给定一个时间点,希望得到其他时间点
2013/11/07 面试题
暑假家长评语大全
2014/04/17 职场文书
爱心捐款倡议书范文
2014/05/12 职场文书
2014年党的群众路线活动个人整改措施
2014/10/28 职场文书
房屋授权无偿使用证明
2014/11/29 职场文书
小学运动会加油稿
2015/07/22 职场文书
JS ES6异步解决方案
2021/04/29 Javascript
python自动化操作之动态验证码、滑动验证码的降噪和识别
2021/08/30 Python