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之第四天
Oct 09 PHP
php2html php生成静态页函数
Dec 08 PHP
PHP spl_autoload_register实现自动加载研究
Dec 06 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
php导入导出excel实例
Oct 25 PHP
PHP函数分享之curl方式取得数据、模拟登陆、POST数据
Jun 04 PHP
ThinkPHP3.1数据CURD操作快速入门
Jun 19 PHP
php操作redis中的hash和zset类型数据的方法和代码例子
Jul 05 PHP
Codeigniter控制器controller继承问题实例分析
Jan 19 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
May 20 PHP
php多进程应用场景实例详解
Jul 22 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
Feb 06 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的ob_start来生成静态页面的方法分析
2011/03/09 PHP
php修改时间格式的代码
2011/05/29 PHP
ThinkPHP入口文件设置及相关注意事项分析
2014/12/05 PHP
PHP读取XML格式文件的方法总结
2017/02/27 PHP
页面元素绑定jquery toggle后元素隐藏的解决方法
2014/03/27 Javascript
JS代码实现根据时间变换页面背景效果
2016/06/16 Javascript
JS JSOP跨域请求实例详解
2016/07/04 Javascript
Javascript基础学习笔记(菜鸟必看篇)
2016/07/22 Javascript
微信小程序 Image API实例详解
2016/09/30 Javascript
手机注册发送验证码倒计时的简单实例
2017/11/15 Javascript
JavaScript中click和onclick本质区别与用法分析
2018/06/07 Javascript
Vue组件系列开发之模态框
2019/04/18 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
python正则分组的应用
2013/11/10 Python
Python深入学习之特殊方法与多范式
2014/08/31 Python
python连接MySQL数据库实例分析
2015/05/12 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
python解析html提取数据,并生成word文档实例解析
2018/01/22 Python
python绘制热力图heatmap
2020/03/23 Python
对PyQt5的输入对话框使用(QInputDialog)详解
2019/06/25 Python
Python 动态导入对象,importlib.import_module()的使用方法
2019/08/28 Python
Django models filter筛选条件详解
2020/03/16 Python
keras load model时出现Missing Layer错误的解决方式
2020/06/11 Python
PyTorch如何搭建一个简单的网络
2020/08/24 Python
美国主要的特色咖啡和茶公司:Peet’s Coffee
2020/02/14 全球购物
M.M.LaFleur官网:美国职业女装品牌
2020/10/27 全球购物
.NET程序员的几道面试题
2012/06/01 面试题
事业单位公务员的职业生涯规划
2014/01/15 职场文书
运动会解说词50字
2014/01/18 职场文书
教师职称自我鉴定
2014/02/12 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
毕业论文指导老师意见
2015/06/04 职场文书
JavaScript 语句之常用 for 循环详解
2021/03/29 Javascript
CSS实现章节添加自增序号的方法
2021/06/23 HTML / CSS
Spring Boot 排除某个类加载注入IOC的操作
2021/08/02 Java/Android
Python+Selenium实现抖音、快手、B站、小红书、微视、百度好看视频、西瓜视频、微信视频号、搜狐视频、一点号、大风号、趣头条等短视频自动发布
2022/04/13 Python