⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 elementfactory.php

📁 Bug tracker, and reporter.
💻 PHP
字号:
<?php/** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. * * @package    Zend_Pdf * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License *//** Zend_Pdf_ElementFactory_Interface */require_once 'Zend/Pdf/ElementFactory/Interface.php';/** Zend_Pdf_ElementFactory_Proxy */require_once 'Zend/Pdf/ElementFactory/Proxy.php';/** Zend_Pdf_Element */require_once 'Zend/Pdf/Element.php';/** Zend_Pdf_Element_Array */require_once 'Zend/Pdf/Element/Array.php';/** Zend_Pdf_Element_String_Binary */require_once 'Zend/Pdf/Element/String/Binary.php';/** Zend_Pdf_Element_Boolean */require_once 'Zend/Pdf/Element/Boolean.php';/** Zend_Pdf_Element_Dictionary */require_once 'Zend/Pdf/Element/Dictionary.php';/** Zend_Pdf_Element_Name */require_once 'Zend/Pdf/Element/Name.php';/** Zend_Pdf_Element_Numeric */require_once 'Zend/Pdf/Element/Numeric.php';/** Zend_Pdf_Element_Object */require_once 'Zend/Pdf/Element/Object.php';/** Zend_Pdf_Element_Reference */require_once 'Zend/Pdf/Element/Reference.php';/** Zend_Pdf_Element_Object_Stream */require_once 'Zend/Pdf/Element/Object/Stream.php';/** Zend_Pdf_Element_String */require_once 'Zend/Pdf/Element/String.php';/** Zend_Pdf_Element_Null */require_once 'Zend/Pdf/Element/Null.php';/** Zend_Pdf_UpdateInfoContainer */require_once 'Zend/Pdf/UpdateInfoContainer.php';/** * PDF element factory. * Responsibility is to log PDF changes * * @package    Zend_Pdf * @copyright  Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License */class Zend_Pdf_ElementFactory implements Zend_Pdf_ElementFactory_Interface{    /**     * List of the modified objects.     * Also contains new and removed objects     *     * Array: ojbectNumber => Zend_Pdf_Element_Object     *     * @var array     */    private $_modifiedObjects = array();    /**     * List of the removed objects     *     * Array: ojbectNumber => Zend_Pdf_Element_Object     *     * @var array     */    private $_removedObjects = array();    /**     * List of registered objects.     * Used for resources clean up when factory is destroyed.     *     * Array of Zend_Pdf_Element objects     *     * @var array     */    private $_registeredObjects = array();    /**     * PDF object counter.     * Actually it's an object number for new PDF object     *     * @var integer     */    private $_objectCount;    /**     * List of the attached object factories.     * Array of Zend_Pdf_ElementFactory_Interface objects     *     * @var array     */    private $_attachedFactories = array();    /**     * Factory internal id     *     * @var integer     */    private $_factoryId;    /**     * Identity, used for factory id generation     *     * @var integer     */    private static $_identity = 0;    /**     * Internal cache to save calculated shifts     *     * @var array     */    private $_shiftCalculationCache = array();    /**     * Object constructor     *     * @param integer $objCount     */    public function __construct($objCount)    {        $this->_objectCount       = (int)$objCount;        $this->_factoryId         = self::$_identity++;    }    /**     * Factory generator     *     * @param integer $objCount     * @return Zend_Pdf_ElementFactory_Interface     */    static public function createFactory($objCount)    {        return new Zend_Pdf_ElementFactory_Proxy(new Zend_Pdf_ElementFactory($objCount));    }    /**     * Close factory and clean-up resources     *     * @internal     */    public function close()    {        $this->_modifiedObjects   = null;        $this->_removedObjects    = null;        $this->_attachedFactories = null;        foreach ($this->_registeredObjects as $obj) {            $obj->cleanUp();        }        $this->_registeredObjects = null;    }    /**     * Get source factory object     *     * @return Zend_Pdf_ElementFactory     */    public function resolve()    {        return $this;    }    /**     * Get factory ID     *     * @return integer     */    public function getId()    {        return $this->_factoryId;    }    /**     * Set object counter     *     * @param integer $objCount     */    public function setObjectCount($objCount)    {        $this->_objectCount = (int)$objCount;    }    /**     * Get object counter     *     * @return integer     */    public function getObjectCount()    {        $count = $this->_objectCount;        foreach ($this->_attachedFactories as $attached) {            $count += $attached->getObjectCount() - 1; // -1 as "0" object is a special case and shared between factories        }        return $count;    }    /**     * Attach factory to the current;     *     * @param Zend_Pdf_ElementFactory_Interface $factory     */    public function attach(Zend_Pdf_ElementFactory_Interface $factory)    {        if ( $factory === $this || isset($this->_attachedFactories[$factory->getId()])) {            /**             * Don't attach factory twice.             * We do not check recusively because of nature of attach operation             * (Pages are always attached to the Documents, Fonts are always attached             * to the pages even if pages already use Document level object factory and so on)             */            return;        }        $this->_attachedFactories[$factory->getId()] = $factory;    }    /**     * Calculate object enumeration shift.     *     * @internal     * @param Zend_Pdf_ElementFactory_Interface $factory     * @return integer     */    public function calculateShift(Zend_Pdf_ElementFactory_Interface $factory)    {        if ($factory === $this) {            return 0;        }        if (isset($this->_shiftCalculationCache[$factory->_factoryId])) {            return $this->_shiftCalculationCache[$factory->_factoryId];        }        $shift = $this->_objectCount - 1;        foreach ($this->_attachedFactories as $subFactory) {            $subFactoryShift = $subFactory->calculateShift($factory);            if ($subFactoryShift != -1) {                // context found                $this->_shiftCalculationCache[$factory->_factoryId] = $shift + $subFactoryShift;                return $shift + $subFactoryShift;            } else {                $shift += $subFactory->getObjectCount()-1;            }        }        $this->_shiftCalculationCache[$factory->_factoryId] = -1;        return -1;    }    /**     * Retrive object enumeration shift.     *     * @param Zend_Pdf_ElementFactory_Interface $factory     * @return integer     * @throws Zend_Pdf_Exception     */    public function getEnumerationShift(Zend_Pdf_ElementFactory_Interface $factory)    {        if (($shift = $this->calculateShift($factory)) == -1) {            throw new Zend_Pdf_Exception('Wrong object context');        }        return $shift;    }    /**     * Mark object as modified in context of current factory.     *     * @param Zend_Pdf_Element_Object $obj     * @throws Zend_Pdf_Exception     */    public function markAsModified(Zend_Pdf_Element_Object $obj)    {        if ($obj->getFactory() !== $this) {            throw new Zend_Pdf_Exception('Object is not generated by this factory');        }        $this->_modifiedObjects[$obj->getObjNum()] = $obj;    }    /**     * Remove object in context of current factory.     *     * @param Zend_Pdf_Element_Object $obj     * @throws Zend_Pdf_Exception     */    public function remove(Zend_Pdf_Element_Object $obj)    {        if (!$obj->compareFactory($this)) {            throw new Zend_Pdf_Exception('Object is not generated by this factory');        }        $this->_modifiedObjects[$obj->getObjNum()] = $obj;        $this-> _removedObjects[$obj->getObjNum()] = $obj;    }    /**     * Generate new Zend_Pdf_Element_Object     *     * @todo Reusage of the freed object. It's not a support of new feature, but only improvement.     *     * @param Zend_Pdf_Element $objectValue     * @return Zend_Pdf_Element_Object     */    public function newObject(Zend_Pdf_Element $objectValue)    {        $obj = new Zend_Pdf_Element_Object($objectValue, $this->_objectCount++, 0, $this);        $this->_modifiedObjects[$obj->getObjNum()] = $obj;        return $obj;    }    /**     * Generate new Zend_Pdf_Element_Object_Stream     *     * @todo Reusage of the freed object. It's not a support of new feature, but only improvement.     *     * @param mixed $objectValue     * @return Zend_Pdf_Element_Object_Stream     */    public function newStreamObject($streamValue)    {        $obj = new Zend_Pdf_Element_Object_Stream($streamValue, $this->_objectCount++, 0, $this);        $this->_modifiedObjects[$obj->getObjNum()] = $obj;        return $obj;    }    /**     * Enumerate modified objects.     * Returns array of Zend_Pdf_UpdateInfoContainer     *     * @param Zend_Pdf_ElementFactory_Interface $rootFactory     * @return array     */    public function listModifiedObjects($rootFactory = null)    {        if ($rootFactory == null) {            $rootFactory = $this;            $shift = 0;        } else {            $shift = $rootFactory->getEnumerationShift($this);        }        ksort($this->_modifiedObjects);        $result = array();        foreach ($this->_modifiedObjects as $objNum => $obj) {            if (key_exists($objNum, $this->_removedObjects)) {                $result[$objNum+$shift] = new Zend_Pdf_UpdateInfoContainer($objNum + $shift,                                                                           $obj->getGenNum()+1,                                                                           true);            } else {                $result[$objNum+$shift] = new Zend_Pdf_UpdateInfoContainer($objNum + $shift,                                                                           $obj->getGenNum(),                                                                           false,                                                                           $obj->dump($rootFactory));            }        }        foreach ($this->_attachedFactories as $factory) {            $result += $factory->listModifiedObjects($rootFactory);        }        return $result;    }    /**     * Register object in the factory     *     * It's used to clear "parent object" referencies when factory is closed and clean up resources     *     * @param Zend_Pdf_Element_Object $obj     */    public function registerObject($obj)    {        $this->_registeredObjects[] = $obj;    }    /**     * Check if PDF file was modified     *     * @return boolean     */    public function isModified()    {        if (count($this->_modifiedObjects) != 0) {            return true;        }        foreach ($this->_attachedFactories as $subFactory) {            if ($subFactory->isModified()) {                return true;            }        }        return false;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -