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 session 检测和注销
Mar 16 PHP
php下通过curl抓取yahoo boss 搜索结果的实现代码
Jun 10 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
php删除字符串末尾子字符,删除开始字符,删除两端字符(实现代码)
Jun 27 PHP
php根据年月获取季度的方法
Mar 31 PHP
PHP中读取照片exif信息的方法
Aug 20 PHP
PHP实现动态web服务器方法
Jul 29 PHP
php 使用redis锁限制并发访问类示例
Nov 02 PHP
php使用gd2绘制基本图形示例(直线、圆、正方形)
Feb 15 PHP
php分页查询的简单实现代码
Mar 14 PHP
redis+php实现微博(三)微博列表功能详解
Sep 23 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
Apr 02 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
2014/09/28 PHP
PHP中定义数组常量(array常量)的方法
2014/11/17 PHP
smarty高级特性之对象的使用方法
2015/12/25 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
Z-Blog中用到的js代码
2007/03/15 Javascript
JS写的数字拼图小游戏代码[学习参考]
2008/10/29 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
2014/04/02 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
js实现ifram取父窗口URL地址的方法
2015/02/09 Javascript
相册展示PhotoSwipe.js插件实现
2016/08/25 Javascript
Angular 4依赖注入学习教程之简介(一)
2017/06/04 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
详解如何用模块化的方式写vuejs
2017/12/16 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
Weex开发之地图篇的具体使用
2019/10/16 Javascript
如何通过JS实现转码与解码
2020/02/21 Javascript
详解JavaScript自定义函数
2020/07/29 Javascript
React实现全选功能
2020/08/25 Javascript
Python使用requests及BeautifulSoup构建爬虫实例代码
2018/01/24 Python
Python 创建空的list,以及append用法讲解
2018/05/04 Python
python实现诗歌游戏(类继承)
2019/02/26 Python
python使用flask与js进行前后台交互的例子
2019/07/19 Python
Crocs美国官方网站:卡骆驰洞洞鞋
2017/08/04 全球购物
描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理
2015/03/25 面试题
校园达人秀策划书
2014/01/12 职场文书
幼儿园托班开学寄语
2014/01/18 职场文书
机关门卫的岗位职责
2014/04/29 职场文书
挂职锻炼工作总结2015
2015/05/28 职场文书
师范生教育见习总结
2015/06/23 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
网络营销实训总结
2015/08/03 职场文书
单位病假条范文
2015/08/17 职场文书
《落花生》教学反思
2016/02/16 职场文书
php字符串倒叙
2021/04/01 PHP
Java基础之线程锁相关知识总结
2021/06/30 Java/Android
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL