_resource->Type = new Zend_Pdf_Element_Name('Font'); } /* Object Magic Methods */ /** * Returns the full name of the font in the encoding method of the current * locale. Transliterates any characters that cannot be naturally * represented in that character set. * * @return string */ public function __toString() { return $this->getFontName(Zend_Pdf_Font::NAME_FULL, '', '//TRANSLIT'); } /* Accessors */ /** * Returns the type of font. * * @return integer One of the TYPE_ constants defined in * {@link Zend_Pdf_Font}. */ public function getFontType() { return $this->_fontType; } /** * Returns the specified descriptive name for the font. * * The font name type is usually one of the following: * * * Note that not all names are available for all fonts. In addition, some * fonts may contain additional names, whose indicies are in the range * 256 to 32767 inclusive, which are used for certain font layout features. * * If the preferred language translation is not available, uses the first * available translation for the name, which is usually English. * * If the requested name does not exist, returns null. * * All names are stored internally as Unicode strings, using UTF-16BE * encoding. You may optionally supply a different resulting character set. * * @param integer $nameType Type of name requested. * @param mixed $language Preferred language (string) or array of languages * in preferred order. Use the ISO 639 standard 2-letter language codes. * @param string $characterSet (optional) Desired resulting character set. * You may use any character set supported by {@link iconv()}; * @return string */ public function getFontName($nameType, $language, $characterSet = null) { if (! isset($this->_fontNames[$nameType])) { return null; } $name = null; if (is_array($language)) { foreach ($language as $code) { if (isset($this->_fontNames[$nameType][$code])) { $name = $this->_fontNames[$nameType][$code]; break; } } } else { if (isset($this->_fontNames[$nameType][$language])) { $name = $this->_fontNames[$nameType][$language]; } } /* If the preferred language could not be found, use whatever is first. */ if ($name === null) { $names = $this->_fontNames[$nameType]; $name = reset($names); } /* Convert the character set if requested. */ if (($characterSet !== null) && ($characterSet != 'UTF-16BE') && PHP_OS != 'AIX') { // AIX knows not this charset $name = iconv('UTF-16BE', $characterSet, $name); } return $name; } /** * Returns whole set of font names. * * @return array */ public function getFontNames() { return $this->_fontNames; } /** * Returns true if font is bold. * * @return boolean */ public function isBold() { return $this->_isBold; } /** * Returns true if font is italic. * * @return boolean */ public function isItalic() { return $this->_isItalic; } /** * Returns true if font is monospace. * * @return boolean */ public function isMonospace() { return $this->_isMonospace; } /** * Returns the suggested position below the text baseline of the underline * in glyph units. * * This value is usually negative. * * @return integer */ public function getUnderlinePosition() { return $this->_underlinePosition; } /** * Returns the suggested line thickness of the underline in glyph units. * * @return integer */ public function getUnderlineThickness() { return $this->_underlineThickness; } /** * Returns the suggested position above the text baseline of the * strikethrough in glyph units. * * @return integer */ public function getStrikePosition() { return $this->_strikePosition; } /** * Returns the suggested line thickness of the strikethrough in glyph units. * * @return integer */ public function getStrikeThickness() { return $this->_strikeThickness; } /** * Returns the number of glyph units per em. * * Used to convert glyph space to user space. Frequently used in conjunction * with {@link widthsForGlyphs()} to calculate the with of a run of text. * * @return integer */ public function getUnitsPerEm() { return $this->_unitsPerEm; } /** * Returns the typographic ascent in font glyph units. * * The typographic ascent is the distance from the font's baseline to the * top of the text frame. It is frequently used to locate the initial * baseline for a paragraph of text inside a given rectangle. * * @return integer */ public function getAscent() { return $this->_ascent; } /** * Returns the typographic descent in font glyph units. * * The typographic descent is the distance below the font's baseline to the * bottom of the text frame. It is always negative. * * @return integer */ public function getDescent() { return $this->_descent; } /** * Returns the typographic line gap in font glyph units. * * The typographic line gap is the distance between the bottom of the text * frame of one line to the top of the text frame of the next. It is * typically combined with the typographical ascent and descent to determine * the font's total line height (or leading). * * @return integer */ public function getLineGap() { return $this->_lineGap; } /** * Returns the suggested line height (or leading) in font glyph units. * * This value is determined by adding together the values of the typographic * ascent, descent, and line gap. This value yields the suggested line * spacing as determined by the font developer. * * It should be noted that this is only a guideline; layout engines will * frequently modify this value to achieve special effects such as double- * spacing. * * @return integer */ public function getLineHeight() { return $this->_ascent - $this->_descent + $this->_lineGap; } /* Information and Conversion Methods */ /** * Returns an array of glyph numbers corresponding to the Unicode characters. * * If a particular character doesn't exist in this font, the special 'missing * character glyph' will be substituted. * * See also {@link glyphNumberForCharacter()}. * * @param array $characterCodes Array of Unicode character codes (code points). * @return array Array of glyph numbers. */ abstract public function glyphNumbersForCharacters($characterCodes); /** * Returns the glyph number corresponding to the Unicode character. * * If a particular character doesn't exist in this font, the special 'missing * character glyph' will be substituted. * * See also {@link glyphNumbersForCharacters()} which is optimized for bulk * operations. * * @param integer $characterCode Unicode character code (code point). * @return integer Glyph number. */ abstract public function glyphNumberForCharacter($characterCode); /** * Returns a number between 0 and 1 inclusive that indicates the percentage * of characters in the string which are covered by glyphs in this font. * * Since no one font will contain glyphs for the entire Unicode character * range, this method can be used to help locate a suitable font when the * actual contents of the string are not known. * * Note that some fonts lie about the characters they support. Additionally, * fonts don't usually contain glyphs for control characters such as tabs * and line breaks, so it is rare that you will get back a full 1.0 score. * The resulting value should be considered informational only. * * @param string $string * @param string $charEncoding (optional) Character encoding of source text. * If omitted, uses 'current locale'. * @return float */ abstract public function getCoveredPercentage($string, $charEncoding = ''); /** * Returns the widths of the glyphs. * * The widths are expressed in the font's glyph space. You are responsible * for converting to user space as necessary. See {@link unitsPerEm()}. * * See also {@link widthForGlyph()}. * * @param array $glyphNumbers Array of glyph numbers. * @return array Array of glyph widths (integers). * @throws Zend_Pdf_Exception */ abstract public function widthsForGlyphs($glyphNumbers); /** * Returns the width of the glyph. * * Like {@link widthsForGlyphs()} but used for one glyph at a time. * * @param integer $glyphNumber * @return integer * @throws Zend_Pdf_Exception */ abstract public function widthForGlyph($glyphNumber); /** * Convert string to the font encoding. * * The method is used to prepare string for text drawing operators * * @param string $string * @param string $charEncoding Character encoding of source text. * @return string */ abstract public function encodeString($string, $charEncoding); /** * Convert string from the font encoding. * * The method is used to convert strings retrieved from existing content streams * * @param string $string * @param string $charEncoding Character encoding of resulting text. * @return string */ abstract public function decodeString($string, $charEncoding); /**** Internal Methods ****/ /** * If the font's glyph space is not 1000 units per em, converts the value. * * @internal * @param integer $value * @return integer */ public function toEmSpace($value) { if ($this->_unitsPerEm == 1000) { return $value; } return ceil(($value / $this->_unitsPerEm) * 1000); // always round up } }