diff -r 5b37998e522e -r 162c1de6545a web/lib/Zend/Pdf/Resource/Font/FontDescriptor.php --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/Zend/Pdf/Resource/Font/FontDescriptor.php Fri Mar 11 15:05:35 2011 +0100 @@ -0,0 +1,204 @@ +Type = new Zend_Pdf_Element_Name('FontDescriptor'); + $fontDescriptor->FontName = new Zend_Pdf_Element_Name($font->getResource()->BaseFont->value); + + /* The font flags value is a bitfield that describes the stylistic + * attributes of the font. We will set as many of the bits as can be + * determined from the font parser. + */ + $flags = 0; + if ($fontParser->isMonospaced) { // bit 1: FixedPitch + $flags |= 1 << 0; + } + if ($fontParser->isSerifFont) { // bit 2: Serif + $flags |= 1 << 1; + } + if (! $fontParser->isAdobeLatinSubset) { // bit 3: Symbolic + $flags |= 1 << 2; + } + if ($fontParser->isScriptFont) { // bit 4: Script + $flags |= 1 << 3; + } + if ($fontParser->isAdobeLatinSubset) { // bit 6: Nonsymbolic + $flags |= 1 << 5; + } + if ($fontParser->isItalic) { // bit 7: Italic + $flags |= 1 << 6; + } + // bits 17-19: AllCap, SmallCap, ForceBold; not available + $fontDescriptor->Flags = new Zend_Pdf_Element_Numeric($flags); + + $fontBBox = array(new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->xMin)), + new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->yMin)), + new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->xMax)), + new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->yMax))); + $fontDescriptor->FontBBox = new Zend_Pdf_Element_Array($fontBBox); + + $fontDescriptor->ItalicAngle = new Zend_Pdf_Element_Numeric($fontParser->italicAngle); + + $fontDescriptor->Ascent = new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->ascent)); + $fontDescriptor->Descent = new Zend_Pdf_Element_Numeric($font->toEmSpace($fontParser->descent)); + + $fontDescriptor->CapHeight = new Zend_Pdf_Element_Numeric($fontParser->capitalHeight); + /** + * The vertical stem width is not yet extracted from the OpenType font + * file. For now, record zero which is interpreted as 'unknown'. + * @todo Calculate value for StemV. + */ + $fontDescriptor->StemV = new Zend_Pdf_Element_Numeric(0); + + $fontDescriptor->MissingWidth = new Zend_Pdf_Element_Numeric($fontParser->glyphWidths[0]); + + /* Set up font embedding. This is where the actual font program itself + * is embedded within the PDF document. + * + * Note that it is not requried that fonts be embedded within the PDF + * document to use them. If the recipient of the PDF has the font + * installed on their computer, they will see the correct fonts in the + * document. If they don't, the PDF viewer will substitute or synthesize + * a replacement. + * + * There are several guidelines for font embedding: + * + * First, the developer might specifically request not to embed the font. + */ + if (!($embeddingOptions & Zend_Pdf_Font::EMBED_DONT_EMBED)) { + + /* Second, the font author may have set copyright bits that prohibit + * the font program from being embedded. Yes this is controversial, + * but it's the rules: + * http://partners.adobe.com/public/developer/en/acrobat/sdk/FontPolicies.pdf + * + * To keep the developer in the loop, and to prevent surprising bug + * reports of "your PDF doesn't have the right fonts," throw an + * exception if the font cannot be embedded. + */ + if (! $fontParser->isEmbeddable) { + /* This exception may be suppressed if the developer decides that + * it's not a big deal that the font program can't be embedded. + */ + if (!($embeddingOptions & Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION)) { + $message = 'This font cannot be embedded in the PDF document. If you would like to use ' + . 'it anyway, you must pass Zend_Pdf_Font::EMBED_SUPPRESS_EMBED_EXCEPTION ' + . 'in the $options parameter of the font constructor.'; + require_once 'Zend/Pdf/Exception.php'; + throw new Zend_Pdf_Exception($message, Zend_Pdf_Exception::FONT_CANT_BE_EMBEDDED); + } + + } else { + /* Otherwise, the default behavior is to embed all custom fonts. + */ + /* This section will change soon to a stream object data + * provider model so that we don't have to keep a copy of the + * entire font in memory. + * + * We also cannot build font subsetting until the data provider + * model is in place. + */ + $fontFile = $fontParser->getDataSource()->readAllBytes(); + $fontFileObject = $font->getFactory()->newStreamObject($fontFile); + $fontFileObject->dictionary->Length1 = new Zend_Pdf_Element_Numeric(strlen($fontFile)); + if (!($embeddingOptions & Zend_Pdf_Font::EMBED_DONT_COMPRESS)) { + /* Compress the font file using Flate. This generally cuts file + * sizes by about half! + */ + $fontFileObject->dictionary->Filter = new Zend_Pdf_Element_Name('FlateDecode'); + } + if ($fontParser instanceof Zend_Pdf_FileParser_Font_OpenType_Type1 /* not implemented now */) { + $fontDescriptor->FontFile = $fontFileObject; + } else if ($fontParser instanceof Zend_Pdf_FileParser_Font_OpenType_TrueType) { + $fontDescriptor->FontFile2 = $fontFileObject; + } else { + $fontDescriptor->FontFile3 = $fontFileObject; + } + } + } + + return $fontDescriptor; + } +}