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 相关文章推荐
基于mysql的论坛(5)
Oct 09 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
利用PHP实现短域名互转
Jul 05 PHP
phpmyadmin打开很慢的解决方法
Apr 21 PHP
百度实时推送api接口应用示例
Oct 21 PHP
Ubuntu12下编译安装PHP5.3开发环境
Mar 27 PHP
详解PHP处理密码的几种方式
Nov 30 PHP
PHP count()函数讲解
Feb 03 PHP
简单实用的PHP文本缓存类实例
Mar 22 PHP
PHP使用OB缓存实现静态化功能示例
Mar 23 PHP
php实现的支付宝网页支付功能示例【基于TP5框架】
Sep 16 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
Apr 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 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例
2015/05/12 PHP
Yii2 hasOne(), hasMany() 实现三表关联的方法(两种)
2017/02/15 PHP
分享20款好玩的jQuery游戏
2011/04/17 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
jquery动态增加删除表格行的小例子
2013/11/14 Javascript
Knockout数组(observable)使用详解示例
2013/11/15 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
jQuery的图片滑块焦点图插件整理推荐
2014/12/07 Javascript
Angular2表单自定义验证器的实现
2016/10/19 Javascript
JS小数转换为整数的方法分析
2017/01/07 Javascript
详解Vue路由History mode模式中页面无法渲染的原因及解决
2017/09/28 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
Vue实现textarea固定输入行数与添加下划线样式的思路详解
2018/06/28 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
jQuery模拟html下拉多选框的原生实现方法示例
2019/05/30 jQuery
微信小程序判断页面是否从其他页面返回的实例代码
2019/07/03 Javascript
详解Python的Django框架中的templates设置
2015/05/11 Python
Python中第三方库Requests库的高级用法详解
2017/03/12 Python
Python实现获取磁盘剩余空间的2种方法
2017/06/07 Python
Python程序运行原理图文解析
2018/02/10 Python
浅谈python之新式类
2018/08/12 Python
WxPython建立批量录入框窗口
2019/02/27 Python
Python使用sqlalchemy模块连接数据库操作示例
2019/03/13 Python
使用 Python 遍历目录树的方法
2020/02/29 Python
Python发送邮件封装实现过程详解
2020/05/09 Python
Pytorch 解决自定义子Module .cuda() tensor失败的问题
2020/06/23 Python
python如何爬取动态网站
2020/09/09 Python
pycharm激活码2020最新分享适用pycharm2020最新版亲测可用
2020/11/22 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
美国瑜伽品牌:Gaiam
2017/10/31 全球购物
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
介绍一下mysql的日期和时间函数
2013/03/28 面试题
实习单位接收函模板
2014/01/10 职场文书
个人对照检查材料
2014/02/12 职场文书
优秀班组申报材料
2014/12/25 职场文书
Spring boot应用启动后首次访问很慢的解决方案
2021/06/23 Java/Android