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之第六天
Oct 09 PHP
php实现文件下载更能介绍
Nov 23 PHP
浅析PHP安装扩展mcrypt以及相关依赖项(PHP安装PECL扩展的方法)
Jul 05 PHP
两级联动select刷新后其值保持不变的实现方法
Jan 27 PHP
codeigniter数据库操作函数汇总
Jun 12 PHP
2个比较经典的PHP加密解密函数分享
Jul 01 PHP
ThinkPHP水印功能实现修复PNG透明水印并增加JPEG图片质量可调整
Nov 05 PHP
php编程每天必学之验证码
Mar 03 PHP
PHP记录和读取JSON格式日志文件
Jul 07 PHP
Yii2框架加载css和js文件的方法分析
May 25 PHP
PHP实现微信提现功能(微信商城)
Nov 21 PHP
PHP文件操作简单介绍及函数汇总
Dec 11 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获取客户端电脑屏幕参数的方法
2015/01/09 PHP
PHP中的session安全吗?
2016/01/22 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
jQuery DIV弹出效果实现代码
2009/07/03 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
javascript中setTimeout的问题解决方法
2014/05/08 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
半个小时学json(json传递示例)
2016/12/25 Javascript
利用JQuery实现datatables插件的增加和删除行功能
2017/01/06 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
2020/08/27 Javascript
javascript基础知识之html5轮播图实例讲解(44)
2017/02/17 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
VUE实现一个分页组件的示例
2017/09/13 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
JS实现的点击按钮图片上下滚动效果示例
2019/01/28 Javascript
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
layui-table对返回的数据进行转变显示的实例
2019/09/04 Javascript
深入浅析vue中cross-env的使用
2019/09/12 Javascript
9种方法优化jQuery代码详解
2020/02/04 jQuery
JS常见内存泄漏及解决方案解析
2020/05/30 Javascript
vue-cli打包后本地运行dist文件中的index.html操作
2020/08/12 Javascript
python修改字典内key对应值的方法
2015/07/11 Python
Python列出一个文件夹及其子目录的所有文件
2016/06/30 Python
Python3+django2.0+apache2+ubuntu14部署网站上线的方法
2018/07/07 Python
python3 批量获取对应端口服务的实例
2019/07/25 Python
使用TensorFlow-Slim进行图像分类的实现
2019/12/31 Python
外贸业务员求职信范文
2013/12/12 职场文书
考核工作实施方案
2014/03/30 职场文书
公司租房协议书范本
2014/10/08 职场文书
怎样写离婚协议书
2015/01/26 职场文书
呼兰河传读书笔记
2015/06/30 职场文书
婚宴新娘致辞
2015/07/28 职场文书
导游词之包公祠
2019/11/25 职场文书
Python Matplotlib库实现画局部图
2021/11/17 Python
Mac电脑OS系统下安装Nginx的详细教程
2022/04/14 Servers
Python尝试实现蒙特卡罗模拟期权定价
2022/04/21 Python