Font files such as TTF and OTF have metadata embedded in them with information such as the font’s name, what font family it belongs to and so forth. I wrote a PHP class that provides the ability to grab this information from any TTF and OTF file. I’ve tested it on many different fonts and it’s working surprisingly well.
Example Usage
$objFontInfo = new FontInfo( "path/to/font.ttf" ); print $objFontInfo->getFontName();
Here is the code for the class. A lot of credit goes to this answer provided on StackOverflow. I rewrote the majority of the class, simplifying it and using Hungarian notation (the way to go in PHP!). If you’re not a fan of Hungarian notation, then just grab code from the StackOverflow answer.
FontInfo.class
<?php
/**
* @class
* Retrieves information such as the proper name from a font TTF or OTF font file.
* @source http://stackoverflow.com/questions/5668901/php-how-to-read-title-of-font-from-ttf-file
*/
class FontInfo {
/**
* Contains information in the TTF 'name' table.
*/
private $_arrInfo = null;
/**
* Constructor.
* @param strFontPath Path to the font file.
*/
function __construct( $strFontPath ) {
$this->_arrInfo = $this->getFontInfo( $strFontPath );
}
/**
* Gets the information about the font at the specified path.
* @param strFontPath
* @return
*/
private function getFontInfo( $strFontPath ) {
// Open the file and read its contents.
$obintJFile = fopen( $strFontPath, "r" );
$strText = fread( $obintJFile, filesize( $strFontPath ) );
fclose( $obintJFile );
// Grab information.
$intNumberOfTables = hexdec( $this->dec2ord( $strText[4] ) . $this->dec2ord( $strText[5] ) );
for( $intI = 0; $intI < $intNumberOfTables; $intI++ ) {
$strTag = $strText[ 12 + $intI * 16 ] . $strText[ 12 + $intI * 16 + 1 ] . $strText[ 12 + $intI * 16 + 2 ] . $strText[ 12 + $intI * 16 + 3 ];
if( $strTag == "name" ) {
$intOffset = hexdec(
$this->dec2ord( $strText[ 12 + $intI * 16 + 8 ] ) . $this->dec2ord( $strText[ 12 + $intI * 16 + 8 + 1 ] ) .
$this->dec2ord( $strText[ 12 + $intI * 16 + 8 + 2 ] ) . $this->dec2ord( $strText[ 12 + $intI * 16 + 8 + 3 ] )
);
$intOffsetStorage = hexdec( $this->dec2ord( $strText[ $intOffset + 4 ] ) . $this->dec2ord( $strText[ $intOffset + 5 ] ) );
$intNumberOfNameRecords = hexdec( $this->dec2ord( $strText[ $intOffset + 2 ] ) . $this->dec2ord( $strText[ $intOffset + 3 ] ) );
}
}
$intStorageDecimal = $intOffsetStorage + $intOffset;
$strStorageHexadecimal = strtoupper( dechex( $intStorageDecimal ) );
for( $intJ = 0; $intJ < $intNumberOfNameRecords; $intJ++ ) {
//$platform_id_dec = hexdec( $this->dec2ord( $this->text[$this->ntOffset+6+$intJ*12+0]).$this->dec2ord( $this->text[$this->ntOffset+6+$intJ*12+1]));
$intNameId = hexdec( $this->dec2ord( $strText[ $intOffset + 6 + $intJ * 12 + 6 ] ) . $this->dec2ord( $strText[ $intOffset + 6 + $intJ * 12 + 7 ] ) );
$intStringLength = hexdec( $this->dec2ord( $strText[ $intOffset + 6 + $intJ * 12 + 8 ] ) . $this->dec2ord( $strText[ $intOffset + 6 + $intJ * 12 + 9 ] ) );
$intStringOffset = hexdec( $this->dec2ord( $strText[ $intOffset + 6 + $intJ * 12 + 10 ] ) . $this->dec2ord( $strText[ $intOffset + 6 + $intJ * 12 + 11 ] ) );
if( !empty( $intNameId ) && empty( $arrFontTags[ $intNameId ] ) ) {
for( $intL = 0; $intL < $intStringLength; $intL++ ) {
if( ord( $strText[ $intStorageDecimal + $intStringOffset + $intL ] ) == "0") {
continue;
} else {
$arrFontTags[ $intNameId ] .= $strText[ $intStorageDecimal + $intStringOffset + $intL ];
}
}
}
}
return $arrFontTags;
}
/**
* Converts decimal to hex using the ascii value.
* @param intDecimal
* @return
*/
protected function dec2ord( $intDecimal ) {
return $this->dec2hex( ord( $intDecimal ) );
}
/**
* Performs hexadecimal to decimal conversion with proper padding.
* @param intDecimal
* @return
*/
protected function dec2hex( $intDecimal ) {
return str_repeat( "0", 2 - strlen( ( $strHexadecimal = strtoupper( dechex( $intDecimal ) ) ) ) ) . $strHexadecimal;
}
/**
* Gets the copyright.
* @return
*/
public function getCopyright() {
return $this->_arrInfo[0];
}
/**
* Gets the font family.
* @return
*/
public function getFontFamily() {
return $this->_arrInfo[1];
}
/**
* Gets the sub font family.
* @return
*/
public function getFontSubFamily() {
return $this->_arrInfo[2];
}
/**
* Gets the font id.
* @return
*/
public function getFontId() {
return $this->_arrInfo[3];
}
/**
* Gets the font name.
* @return
*/
public function getFontName() {
return $this->_arrInfo[4];
}
}
Good luck!
This will NOT work for unicode characters in metadata.
Its hows only 4 values.
It needs to get all values form TTF or OTF.
Thanks.
why $intNumberOfTables is give me 0?
this is give me only one name
i want all font family of file.