Example #1
0
 /**
  * Object constructor
  *
  * @param Zend_Pdf_Element_Dictionary $dictionary
  * @param SplObjectStorage            $processedActions  list of already processed action dictionaries, used to avoid cyclic references
  * @throws Zend_Pdf_Exception
  */
 public function __construct(Zend_Pdf_Element $dictionary, SplObjectStorage $processedActions)
 {
     require_once 'Zend/Pdf/Element.php';
     if ($dictionary->getType() != Zend_Pdf_Element::TYPE_DICTIONARY) {
         require_once 'Zend/Pdf/Exception.php';
         throw new Zend_Pdf_Exception('$dictionary mast be a direct or an indirect dictionary object.');
     }
     $this->_actionDictionary = $dictionary;
     if ($dictionary->Next !== null) {
         if ($dictionary->Next instanceof Zend_Pdf_Element_Dictionary) {
             // Check if dictionary object is not already processed
             if (!$processedActions->contains($dictionary->Next)) {
                 $processedActions->attach($dictionary->Next);
                 $this->next[] = Zend_Pdf_Action::load($dictionary->Next, $processedActions);
             }
         } else {
             if ($dictionary->Next instanceof Zend_Pdf_Element_Array) {
                 foreach ($dictionary->Next->items as $chainedActionDictionary) {
                     // Check if dictionary object is not already processed
                     if (!$processedActions->contains($chainedActionDictionary)) {
                         $processedActions->attach($chainedActionDictionary);
                         $this->next[] = Zend_Pdf_Action::load($chainedActionDictionary, $processedActions);
                     }
                 }
             } else {
                 require_once 'Zend/Pdf/Exception.php';
                 throw new Zend_Pdf_Exception('PDF Action dictionary Next entry must be a dictionary or an array.');
             }
         }
     }
     $this->_originalNextList = $this->next;
 }
Example #2
0
 /**
  * Parse resource and return it as an Action or Explicit Destination
  *
  * $param Zend_Pdf_Element $resource
  * @return Zend_Pdf_Destination|
  * @throws Zend_Pdf_Exception
  */
 public static function load(Zend_Pdf_Element $resource)
 {
     require_once 'Zend/Pdf/Element.php';
     if ($resource->getType() == Zend_Pdf_Element::TYPE_DICTIONARY) {
         if (($resource->Type === null || $resource->Type->value == 'Action') && $resource->S !== null) {
             // It's a well-formed action, load it
             require_once 'Zend/Pdf/Action.php';
             return Zend_Pdf_Action::load($resource);
         } else {
             if ($resource->D !== null) {
                 // It's a destination
                 $resource = $resource->D;
             } else {
                 require_once 'Zend/Pdf/Exception.php';
                 throw new Zend_Pdf_Exception('Wrong resource type.');
             }
         }
     }
     if ($resource->getType() == Zend_Pdf_Element::TYPE_ARRAY || $resource->getType() == Zend_Pdf_Element::TYPE_NAME || $resource->getType() == Zend_Pdf_Element::TYPE_STRING) {
         // Resource is an array, just treat it as an explicit destination array
         require_once 'Zend/Pdf/Destination.php';
         return Zend_Pdf_Destination::load($resource);
     } else {
         require_once 'Zend/Pdf/Exception.php';
         throw new Zend_Pdf_Exception('Wrong resource type.');
     }
 }
Example #3
0
 /**
  * Object constructor
  *
  * @param Zend_Pdf_Element_Dictionary $dictionary
  * @param SplObjectStorage            $processedActions  list of already processed action dictionaries, used to avoid cyclic references
  * @throws Zend_Pdf_Exception
  */
 public function __construct(Zend_Pdf_Element $dictionary, SplObjectStorage $processedActions)
 {
     parent::__construct($dictionary, $processedActions);
     if ($dictionary->URI === null) {
         //require_once 'Zend/Pdf/Exception.php';
         throw new Zend_Pdf_Exception('URI action dictionary entry is required');
     }
 }
Example #4
0
 /**
  * Parse resource and return it as an Action or Explicit Destination
  *
  * $param Zend_Pdf_Element $resource
  * @return Zend_Pdf_Destination|
  * @throws Zend_Pdf_Exception
  */
 public static function load(Zend_Pdf_Element $resource)
 {
     if ($resource->getType() == Zend_Pdf_Element::TYPE_DICTIONARY) {
         // Load destination as appropriate action
         return Zend_Pdf_Action::load($resource);
     } else {
         if ($resource->getType() == Zend_Pdf_Element::TYPE_ARRAY || $resource->getType() == Zend_Pdf_Element::TYPE_NAME || $resource->getType() == Zend_Pdf_Element::TYPE_STRING) {
             // Resource is an array, just treat it as an explicit destination array
             return Zend_Pdf_Destination::load($resource);
         } else {
             require_once 'Zend/Pdf/Exception.php';
             throw new Zend_Pdf_Exception('Wrong resource type.');
         }
     }
 }
Example #5
0
 /**
  * Object constructor
  *
  * @param Zend_Pdf_Element_Dictionary $dictionary
  * @param SplObjectStorage            $processedActions  list of already processed action dictionaries, used to avoid cyclic references
  */
 public function __construct(Zend_Pdf_Element $dictionary, SplObjectStorage $processedActions)
 {
     parent::__construct($dictionary, $processedActions);
     $this->_destination = Zend_Pdf_Destination::load($dictionary->D);
 }
Example #6
0
 /**
  * Get outline target.
  *
  * @return Zend_Pdf_Target
  * @throws Zend_Pdf_Exception
  */
 public function getTarget()
 {
     if ($this->_outlineDictionary->Dest !== null) {
         if ($this->_outlineDictionary->A !== null) {
             require_once 'Zend/Pdf/Exception.php';
             throw new Zend_Pdf_Exception('Outline dictionary may contain Dest or A entry, but not both.');
         }
         require_once 'Zend/Pdf/Destination.php';
         return Zend_Pdf_Destination::load($this->_outlineDictionary->Dest);
     } else {
         if ($this->_outlineDictionary->A !== null) {
             require_once 'Zend/Pdf/Action.php';
             return Zend_Pdf_Action::load($this->_outlineDictionary->A);
         }
     }
     return null;
 }
Example #7
0
    /**
     * Walk through action and its chained actions tree and remove nodes
     * if they are GoTo actions with an unresolved target.
     *
     * Returns null if root node is deleted or updated action overwise.
     *
     * @todo Give appropriate name and make method public
     *
     * @param Zend_Pdf_Action $action
     * @param boolean $refreshPagesHash  Refresh page collection hashes before processing
     * @return Zend_Pdf_Action|null
     */
    protected function _cleanUpAction(Zend_Pdf_Action $action, $refreshPageCollectionHashes = true)
    {
        if ($this->_pageReferences === null  ||  $refreshPageCollectionHashes) {
            $this->_refreshPagesHash();
        }

        // Named target is an action
        if ($action instanceof Zend_Pdf_Action_GoTo  &&
            $this->resolveDestination($action->getDestination(), false) === null) {
            // Action itself is a GoTo action with an unresolved destination
            return null;
        }

        // Walk through child actions
        $iterator = new RecursiveIteratorIterator($action, RecursiveIteratorIterator::SELF_FIRST);

        $actionsToClean        = array();
        $deletionCandidateKeys = array();
        foreach ($iterator as $chainedAction) {
            if ($chainedAction instanceof Zend_Pdf_Action_GoTo  &&
                $this->resolveDestination($chainedAction->getDestination(), false) === null) {
                // Some child action is a GoTo action with an unresolved destination
                // Mark it as a candidate for deletion
                $actionsToClean[]        = $iterator->getSubIterator();
                $deletionCandidateKeys[] = $iterator->getSubIterator()->key();
            }
        }
        foreach ($actionsToClean as $id => $action) {
            unset($action->next[$deletionCandidateKeys[$id]]);
        }

        return $action;
    }
 /**
  * Get link annotation destination
  *
  * @return Zend_Pdf_Target|null
  */
 public function getDestination()
 {
     if ($this->_annotationDictionary->Dest === null && $this->_annotationDictionary->A === null) {
         return null;
     }
     if ($this->_annotationDictionary->Dest !== null) {
         #require_once 'Zend/Pdf/Destination.php';
         return Zend_Pdf_Destination::load($this->_annotationDictionary->Dest);
     } else {
         #require_once 'Zend/Pdf/Action.php';
         return Zend_Pdf_Action::load($this->_annotationDictionary->A);
     }
 }
Example #9
0
 public function testActionURILoad2()
 {
     $dictionary = new Zend_Pdf_Element_Dictionary();
     $dictionary->Type = new Zend_Pdf_Element_Name('Action');
     $dictionary->S = new Zend_Pdf_Element_Name('URI');
     try {
         $action = Zend_Pdf_Action::load($dictionary);
         $this->fail("exception expected");
     } catch (Zend_Pdf_Exception $e) {
         $this->assertContains('URI action dictionary entry is required', $e->getMessage());
     }
 }
Example #10
0
 /**
  * Get link annotation destination
  *
  * @return Zend_Pdf_Target|null
  */
 public function getDestination()
 {
     if ($this->_annotationDictionary->Dest === null && $this->_annotationDictionary->A === null) {
         return null;
     }
     if ($this->_annotationDictionary->Dest !== null) {
         return Zend_Pdf_Destination::load($this->_annotationDictionary->Dest);
     } else {
         return Zend_Pdf_Action::load($this->_annotationDictionary->A);
     }
 }