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 split汉字
Jun 05 PHP
ThinkPHP自动验证失败的解决方法
Jun 09 PHP
php日期转时间戳,指定日期转换成时间戳
Jul 17 PHP
Laravel 4 初级教程之视图、命名空间、路由
Oct 30 PHP
php冒泡排序与快速排序实例详解
Dec 07 PHP
Yii2中Restful API原理实例分析
Jul 25 PHP
PHP封装的PDO数据库操作类实例
Jun 21 PHP
php-fpm添加service服务的例子
Apr 27 PHP
PHP+MySQL实现模糊查询员工信息功能示例
Jun 01 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 PHP
Laravel 验证码认证学习记录小结
Dec 20 PHP
TP3.2.3框架文件上传操作实例详解
Jan 23 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实现图片简单上传
2006/10/09 PHP
Avengerls vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript 新浪背投广告实现代码
2009/07/07 Javascript
javascript 表单验证常见正则
2009/09/28 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
批量实现面向对象的实例代码
2013/07/01 Javascript
js对table的td进行相同内容合并示例详解
2013/12/27 Javascript
使用 jQuery.ajax 上传带文件的表单遇到的问题
2016/10/31 Javascript
Angular2入门--架构总览
2017/03/29 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
Vue2.0子同级组件之间数据交互方法
2018/02/28 Javascript
基于iScroll实现内容滚动效果
2018/03/21 Javascript
vue axios整合使用全攻略
2018/05/24 Javascript
vue.js父子组件通信动态绑定的实例
2018/09/28 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
原生js基于canvas实现一个简单的前端截图工具代码实例
2019/09/10 Javascript
python删除列表中重复记录的方法
2015/04/28 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
对python中的argv和argc使用详解
2018/12/15 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
2019/08/23 Python
Python class的继承方法代码实例
2020/02/14 Python
python 解决tqdm模块不能单行显示的问题
2020/02/19 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
使用CSS3制作一个简单的进度条(demo)
2017/05/23 HTML / CSS
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
canvas 绘图时位置偏离的问题解决
2020/09/16 HTML / CSS
英国时尚和家居用品零售商:Matalan
2021/02/28 全球购物
澳大利亚头发和美容产品购物网站:OZ Hair & Beauty
2020/03/27 全球购物
职工运动会感言
2014/02/07 职场文书
小学教师师德感言
2014/02/10 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
2014年法务工作总结
2014/12/11 职场文书
入队仪式主持词
2015/07/04 职场文书
关于食品安全的演讲稿范文(三篇)
2019/10/21 职场文书
Tensorflow与RNN、双向LSTM等的踩坑记录及解决
2021/05/31 Python