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(3) php 函数
Feb 15 PHP
PHP关联链接常用代码
Nov 05 PHP
浅谈PHP变量作用域以及地址引用问题
Dec 27 PHP
CMS中PHP判断系统是否已经安装的方法示例
Jul 26 PHP
laravel 5 实现模板主题功能
Mar 02 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
php自定义扩展名获取函数示例
Dec 12 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
Oct 17 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 PHP
phpStorm+XDebug+chrome 配置详解
Apr 01 PHP
php实现的数组转xml案例分析
Sep 28 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 29 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+mysql实现数据库随机重排实例
2014/10/17 PHP
PHP数学运算函数大汇总(经典值得收藏)
2016/04/01 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
PHP简单获取多个checkbox值的方法
2016/06/13 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
PHP CURL post数据报错 failed creating formpost data
2016/10/16 PHP
javascript面向对象之二 命名空间
2011/02/08 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
JavaScript插件化开发教程 (一)
2015/01/27 Javascript
javascript 对象数组根据对象object key的值排序
2015/03/09 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
浅谈Javascript数组(推荐)
2016/05/17 Javascript
使用Promise链式调用解决多个异步回调的问题
2017/01/15 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
详解使用 Node.js 开发简单的脚手架工具
2018/06/08 Javascript
微信小程序收藏功能的实现代码
2018/06/12 Javascript
echarts实现词云自定义形状的示例代码
2019/02/20 Javascript
详解ES6中的Map与Set集合
2019/03/22 Javascript
JS+CSS实现炫酷光感效果
2020/09/05 Javascript
DWR内存兼容及无法调用问题解决方案
2020/10/16 Javascript
详解template标签用法(含vue中的用法总结)
2021/01/12 Vue.js
[02:35]DOTA2英雄基础教程 狙击手
2014/01/14 DOTA
跟老齐学Python之模块的加载
2014/10/24 Python
Django的分页器实例(paginator)
2017/12/01 Python
Tornado实现多进程/多线程的HTTP服务详解
2019/07/25 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
农药学硕士毕业生自荐信
2013/09/25 职场文书
药物学专业学生的自我评价
2013/10/27 职场文书
学生个人的自我评价分享
2013/11/05 职场文书
八年级语文教学反思
2014/02/11 职场文书
2015年乡镇平安建设工作总结
2015/05/13 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL