Files
crm.clientright.ru/modules/PDFMaker/resources/classes/ttfInfo.class.php

306 lines
9.3 KiB
PHP
Executable File

<?php
/**
* ttfInfo class
* Retrieve data stored in a TTF files 'name' table
*
* @original author Unknown
* found at http://www.phpclasses.org/browse/package/2144.html
*
* @ported for used on http://www.nufont.com
* @author Jason Arencibia
* @version 0.2
* @copyright (c) 2006 GrayTap Media
* @website http://www.graytap.com
* @license GPL 2.0
* @access public
*
* @todo: Make it Retrieve additional information from other tables
*
*/
class ttfInfo
{
/**
* variable $_dirRestriction
* Restrict the resource pointer to this directory and above.
* Change to 1 for to allow the class to look outside of it current directory
* @protected
* @var int
*/
protected $_dirRestriction = 1;
/**
* variable $_dirRestriction
* Restrict the resource pointer to this directory and above.
* Change to 1 for nested directories
* @protected
* @var int
*/
protected $_recursive = 0;
/**
* variable $fontsdir
* This is to declare this variable as protected
* don't edit this!!!
* @protected
*/
protected $fontsdir;
/**
* variable $filename
* This is to declare this varable as protected
* don't edit this!!!
* @protected
*/
protected $filename;
/**
* function readFontsDir()
* @public
* @return information contained in the TTF 'name' table of all fonts in a directory.
*/
public function readFontsDir()
{
if (empty($this->fontsdir)) {
$this->exitClass('Error: Fonts Directory has not been set with setFontsDir().');
}
if (empty($this->backupDir)) {
$this->backupDir = $this->fontsdir;
}
$this->array = array();
$d = dir($this->fontsdir);
while (false !== ($e = $d->read())) {
if ($e != '.' && $e != '..') {
$e = $this->fontsdir . $e;
if ($this->_recursive && is_dir($e)) {
$this->setFontsDir($e);
$this->array = array_merge($this->array, readFontsDir());
} else {
if ($this->is_ttf($e) === true) {
$this->setFontFile($e);
$this->array[$e] = $this->getFontInfo();
}
}
}
}
if (!empty($this->backupDir)) {
$this->fontsdir = $this->backupDir;
}
$d->close();
return $this;
} // public function setFontFile
/**
* function dec2hex()
* private function to perform Hexadecimal to decimal with proper padding.
* @protected
* @return object
*/
protected function exitClass($message)
{
echo $message;
exit;
} // public function setFontsDir
/**
* function setFontsDir()
* set the Font Directory
* @public
* @param string $data the new value
* @return object referrence to this
*/
public function setFontsDir($data)
{
if ($this->_dirRestriction && preg_match('[\.\/|\.\.\/]', $data)) {
$this->exitClass('Error: Directory restriction is enforced!');
}
$this->fontsdir = $data;
return $this;
} // public function readFontsDir
/**
* function setProtectedVar()
* @public
* @param string $var the new variable
* @param string $data the new value
* @return object reference to this
* DISABLED, NO REAL USE YET
*
* public function setProtectedVar($var, $data)
* {
* if ($var == 'filename')
* {
* $this->setFontFile($data);
* } else {
* //if (isset($var) && !empty($data))
* $this->$var = $data;
* }
* return $this;
* }
*/
/**
* function dec2hex()
* private helper function to test in the file in question is a ttf.
* @protected
* @return object
*/
protected function is_ttf($file)
{
$ext = explode('.', $file);
$ext = $ext[count($ext) - 1];
return preg_match("/ttf$/i", $ext) ? true : false;
} // public function getFontInfo
/**
* function setFontFile()
* set the filename
* @public
* @param string $data the new value
* @return object reference to this
*/
public function setFontFile($data)
{
if ($this->_dirRestriction && preg_match('[\.\/|\.\.\/]', $data)) {
$this->exitClass('Error: Directory restriction is enforced!');
}
$this->filename = $data;
return $this;
} // public function getCopyright
/**
* function getFontInfo()
* @public
* @return information contained in the TTF 'name' table.
*/
public function getFontInfo()
{
$fd = fopen($this->filename, "r");
$this->text = fread($fd, filesize($this->filename));
fclose($fd);
$number_of_tables = hexdec($this->dec2ord($this->text[4]) . $this->dec2ord($this->text[5]));
for ($i = 0; $i < $number_of_tables; $i++) {
$tag = $this->text[12 + $i * 16] . $this->text[12 + $i * 16 + 1] . $this->text[12 + $i * 16 + 2] . $this->text[12 + $i * 16 + 3];
if ($tag == 'name') {
$this->ntOffset = hexdec(
$this->dec2ord($this->text[12 + $i * 16 + 8]) . $this->dec2ord($this->text[12 + $i * 16 + 8 + 1]) .
$this->dec2ord($this->text[12 + $i * 16 + 8 + 2]) . $this->dec2ord($this->text[12 + $i * 16 + 8 + 3]));
$offset_storage_dec = hexdec($this->dec2ord($this->text[$this->ntOffset + 4]) . $this->dec2ord($this->text[$this->ntOffset + 5]));
$number_name_records_dec = hexdec($this->dec2ord($this->text[$this->ntOffset + 2]) . $this->dec2ord($this->text[$this->ntOffset + 3]));
}
}
$storage_dec = $offset_storage_dec + $this->ntOffset;
$storage_hex = strtoupper(dechex($storage_dec));
for ($j = 0; $j < $number_name_records_dec; $j++) {
$platform_id_dec = hexdec($this->dec2ord($this->text[$this->ntOffset + 6 + $j * 12 + 0]) . $this->dec2ord($this->text[$this->ntOffset + 6 + $j * 12 + 1]));
$name_id_dec = hexdec($this->dec2ord($this->text[$this->ntOffset + 6 + $j * 12 + 6]) . $this->dec2ord($this->text[$this->ntOffset + 6 + $j * 12 + 7]));
$string_length_dec = hexdec($this->dec2ord($this->text[$this->ntOffset + 6 + $j * 12 + 8]) . $this->dec2ord($this->text[$this->ntOffset + 6 + $j * 12 + 9]));
$string_offset_dec = hexdec($this->dec2ord($this->text[$this->ntOffset + 6 + $j * 12 + 10]) . $this->dec2ord($this->text[$this->ntOffset + 6 + $j * 12 + 11]));
if (!empty($name_id_dec) and empty($font_tags[$name_id_dec])) {
for ($l = 0; $l < $string_length_dec; $l++) {
if (ord($this->text[$storage_dec + $string_offset_dec + $l]) == '0') {
continue;
} else {
$font_tags[$name_id_dec] .= ($this->text[$storage_dec + $string_offset_dec + $l]);
}
}
}
}
return $font_tags;
} // public function getFontFamily
/**
* function dec2ord()
* Used to lessen redundant calls to multiple functions.
* @protected
* @return object
*/
protected function dec2ord($dec)
{
return $this->dec2hex(ord($dec));
} // public function getFontSubFamily
/**
* function dec2hex()
* private function to perform Hexadecimal to decimal with proper padding.
* @protected
* @return object
*/
protected function dec2hex($dec)
{
return str_repeat('0', 2 - strlen(($hex = strtoupper(dechex($dec))))) . $hex;
} // public function getFontId
/**
* function getCopyright()
* @public
* @return 'Copyright notice' contained in the TTF 'name' table at index 0
*/
public function getCopyright()
{
$this->info = $this->getFontInfo();
return $this->info[0];
} // public function getFullFontName
/**
* function getFontFamily()
* @public
* @return 'Font Family name' contained in the TTF 'name' table at index 1
*/
public function getFontFamily()
{
$this->info = $this->getFontInfo();
return $this->info[1];
} // protected function dec2ord
/**
* function getFontSubFamily()
* @public
* @return 'Font Subfamily name' contained in the TTF 'name' table at index 2
*/
public function getFontSubFamily()
{
$this->info = $this->getFontInfo();
return $this->info[2];
} // protected function dec2hex
/**
* function getFontId()
* @public
* @return 'Unique font identifier' contained in the TTF 'name' table at index 3
*/
public function getFontId()
{
$this->info = $this->getFontInfo();
return $this->info[3];
} // protected function dec2hex
/**
* function getFullFontName()
* @public
* @return 'Full font name' contained in the TTF 'name' table at index 4
*/
public function getFullFontName()
{
$this->info = $this->getFontInfo();
return $this->info[4];
} // protected function is_ttf
} // class ttfInfo
function getFontInfo($resource)
{
$ttfInfo = new ttfInfo();
$ttfInfo->setFontFile($resource);
return $ttfInfo->getFontInfo();
}