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&amp;mysql(六)
Oct 09 PHP
我的论坛源代码(三)
Oct 09 PHP
用PHP和ACCESS写聊天室(三)
Oct 09 PHP
PHP中file_exists与is_file,is_dir的区别介绍
Sep 12 PHP
async和DOM Script文件加载比较
Jul 20 PHP
php中多维数组按指定value排序的实现代码
Aug 19 PHP
php实现比较两个字符串日期大小的方法
May 12 PHP
Symfony2实现在controller中获取url的方法
Mar 18 PHP
yii2 页面底部加载css和js的技巧
Apr 21 PHP
php进程daemon化的正确实现方法
Sep 06 PHP
Thinkphp5 如何隐藏入口文件index.php(URL重写)
Oct 16 PHP
详解PHP Swoole与TCP三次握手
May 27 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 第二节 数据类型之数组
2012/04/28 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
php获取随机数组列表的方法
2014/11/13 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
加载远程图片时,经常因为缓存而得不到更新的解决方法(分享)
2013/06/26 Javascript
可自己添加html的伪弹出框实现代码
2013/09/08 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
JavaScript返回上一页的三种方法及区别介绍
2015/07/04 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
vue的路由映射问题及解决方案
2019/10/14 Javascript
如何基于filter实现网站整体变灰功能
2020/04/17 Javascript
[02:07]DOTA2超级联赛专访BBC:难忘网吧超神经历
2013/06/09 DOTA
[04:12]第二届DOTA2亚洲邀请赛选手传记-Newbee.Sccc
2017/04/03 DOTA
Python的MongoDB模块PyMongo操作方法集锦
2016/01/05 Python
Python和JavaScript间代码转换的4个工具
2016/02/22 Python
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
Python调用服务接口的实例
2019/01/03 Python
使用pycharm在本地开发并实时同步到服务器
2019/08/02 Python
python对常见数据类型的遍历解析
2019/08/27 Python
Python如何使用OS模块调用cmd
2020/02/27 Python
CSS3移动端vw+rem不依赖JS实现响应式布局的方法
2019/01/23 HTML / CSS
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
加利福尼亚州威尼斯的女性奢侈品设计师服装和概念店:Mona Moore
2018/09/13 全球购物
母亲节演讲稿范文
2014/01/02 职场文书
授权委托书格式模板
2014/04/03 职场文书
公司党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
优秀工作者事迹材料
2014/12/26 职场文书
2015关于重阳节的演讲稿
2015/03/20 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
2016道德模范先进事迹材料
2016/02/26 职场文书
创业计划书之餐饮
2019/09/02 职场文书
导游词之北京明十三陵
2019/10/28 职场文书
Sentry的安装、配置、使用教程(Sentry日志手机系统)
2022/07/23 Python