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 相关文章推荐
计算2000年01月01日起到指定日的天数
Oct 09 PHP
简单的页面缓冲技术
Oct 09 PHP
php 不同编码下的字符串长度区分
Sep 26 PHP
PHPThumb PHP 图片缩略图库
Mar 11 PHP
PHP UTF8中文字符截断函数代码
Sep 11 PHP
php将session放入memcached的设置方法
Feb 14 PHP
php写入数据到CSV文件的方法
Mar 14 PHP
在Mac上编译安装PHP7的开发环境
Jul 28 PHP
谈谈 PHP7新增功能
Dec 16 PHP
PHP+百度AI OCR文字识别实现了图片的文字识别功能
May 08 PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 PHP
thinkphp诸多限制条件下如何getshell详解
Dec 09 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
PHP中上传大体积文件时需要的设置
2006/10/09 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
javascript 数组学习资料收集
2010/04/11 Javascript
jquery绑定原理 简单解析与实现代码分享
2011/09/06 Javascript
JQuery Highcharts 动态生成图表的方法
2013/11/15 Javascript
javasctipt如何显示几分钟前、几天前等
2014/04/30 Javascript
windows下安装nodejs及框架express
2015/08/07 NodeJs
Google 地图获取API Key详细教程
2016/08/06 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
详解ES6中的let命令
2020/04/05 Javascript
Bootstrap.css与layDate日期选择样式起冲突的解决办法
2017/04/07 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
webpack项目使用eslint建立代码规范实现
2019/05/16 Javascript
配置node服务器并且链接微信公众号接口配置步骤详解
2019/06/21 Javascript
前端vue-cli项目中使用img图片和background背景图的几种方法
2019/11/13 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
javascript实现页面的实时时钟显示示例
2020/08/06 Javascript
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
[57:36]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第三场 2月1日
2021/03/11 DOTA
python创建线程示例
2014/05/06 Python
Python正则表达式实现截取成对括号的方法
2017/01/06 Python
python 文件查找及内容匹配方法
2018/10/25 Python
深入理解Python异常处理的哲学
2019/02/01 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
python操作cfg配置文件方式
2019/12/22 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
实例代码讲解Python 线程池
2020/08/24 Python
HTML5拖拽功能实现的拼图游戏
2018/07/31 HTML / CSS
意大利体育用品网上商城:Nencini Sport
2016/08/18 全球购物
全国优秀教师事迹材料
2014/08/26 职场文书
房屋鉴定委托书范本
2014/09/23 职场文书
公司车辆维修管理制度
2015/08/05 职场文书
车间班组长竞聘书
2015/09/15 职场文书
迎客户欢迎词三篇
2019/09/27 职场文书