Interaktive Features Ziele Ein Ziel definiert eine spezielle Sicht eines Dokuments, bestehend aus den folgenden Elementen: Die Seite des Dokuments das angezeigt werden soll. Der Ort des Dokumenten Fensters auf dieser Seite. Der Zoom Faktor der verwendet werden soll wenn die Seite angezeigt wird. Ziele können mit Outline Elementen ((Document Outline (bookmarks)), Hinweisen (Annotations), oder Aktionen (Actions) verknüpft werden. In jedem Fall spezifiziert das Ziel die Sicht des Dokuments welche dargestellt werden soll wenn das Outline Element oder der Hinweis geöffnet, oder die Aktion durchgeführt werden soll. Zusätzlich kann eine optionale Dokument Öffnungs-Aktion spezifiziert werden. Unterstützte Zieltypen Die folgenden Typen werden von der Zend_Pdf Komponente unterstützt. Zend_Pdf_Destination_Zoom Zeigt die spezifizierte Seite, mit den Koordinaten (Links, Oben) positioniert an der oberen-linken Ecke des Fensters und dem Inhalt der Seite vergrößert auf den Zoom Faktor. Zielobjekte können durch Verwendung der Zend_Pdf_Destination_Zoom::create($page, $left = null, $top = null, $zoom = null) Methode erstellt werden. Wobei: $page eine Zielseite ist (ein Zend_Pdf_Page Objekt oder eine Seitennummer). $left ist die linke Ecke der angezeigten Seite (float). $top ist eine obere Ecke der angezeigten Seite (float). $zoom ist ein Zoom Faktor (float). NULL, wenn es für die $left, $top or $zoom Parameter spezifiziert wird, heißt "aktueller Wert der Viewer Anwendung". Die Zend_Pdf_Destination_Zoom Klasse bietet die folgenden Methoden an: FloatgetLeftEdge(); setLeftEdge(float $left); FloatgetTopEdge(); setTopEdge(float $top); FloatgetZoomFactor(); setZoomFactor(float $zoom); Zend_Pdf_Destination_Fit Zeigt die spezifizierte Seite an, wobei der Inhalt soweit vergrössert wird, dass er auf die komplette Seite passt sowohl Horizontal als auch Vertikal im Fenster. Wenn die benötigten horizontalen und vertikalen Vergrösserungsfaktoren unterschiedlich sind, wird der kleinere der zwei verwendet, und die Seite im Fenster mit der anderen Dimension zentriert. Das Zielobjekt kann erstellt werden indem die Zend_Pdf_Destination_Fit::create($page) Methode verwendet wird. Wobei $page eine Zielseite ist (ein Zend_Pdf_Page Objekt oder eine Seitennummer). Zend_Pdf_Destination_FitHorizontally Zeigt die spezifizierte Seite, mit den vertikalen Koordinaten an der oberen Ecke des Fensters positioniert, an und den Inhalt der Seite gerade genug vergrössert damit die komplette Breite der Seite in das Fenster passt. Das Zielobjekt kann erstellt werden indem die Zend_Pdf_Destination_FitHorizontally::create($page, $top) Methode verwendet wird. Wobei: $page ist eine Zielseite (ein Zend_Pdf_Page Objekt oder eine Seitenzahl). $top ist die obere Ecke der angezeigten Seite (float). Die Klasse Zend_Pdf_Destination_FitHorizontally bietet auch die folgenden Methoden: FloatgetTopEdge(); setTopEdge(float $top); Zend_Pdf_Destination_FitVertically Zeigt die spezifizierte Seite, mit den horizontalen Koordinaten an der oberen Ecke des Fensters positioniert, an und den Inhalt der Seite gerade genug vergrössert damit die komplette Höhe der Seite in das Fenster passt. Das Zielobjekt kann erstellt werden indem die Zend_Pdf_Destination_FitVertically::create($page, $left) Methode verwendet wird. Wobei: $page ist eine Zielseite (ein Zend_Pdf_Page Objekt oder eine Seitenzahl). $left die linke Ecke der angezeigten Seite ist. (float). Die Klasse Zend_Pdf_Destination_FitVertically bietet auch die folgenden Methoden: FloatgetLeftEdge(); setLeftEdge(float $left); Zend_Pdf_Destination_FitRectangle Zeigt die spezifizierte Seite an, wobei der Inhalt gerade genug vergrössert ist damit er komplett in das Rechteck passt das durch die Koordinaten links, unten, rechts und oben spezifiziert wird sowohl horizontal als auch vertikal. Wenn die notwendigen horizontalen und vertikalen Vergrösserungsfaktoren unterschiedlich sind, wird der kleinere der zwei verwendet, wobei das Rechteck im Fenster durch Verwendung der andern Dimension zentriert wird. Das Zielobjekt kann erstellt werden indem die Zend_Pdf_Destination_FitRectangle::create($page, $left, $bottom, $right, $top) Methode verwendet wird. Wobei: $page ist eine Zielseite (ein Zend_Pdf_Page Objekt oder eine Seitenzahl). $left die linke Ecke der angezeigten Seite ist. (float). $bottom die untere Ecke der angezeigten Seite ist (float). $right die rechte Ecke der angezeigten Seite ist (float). $top die obere Ecke der angezeigten Seite ist (float). Die Klasse Zend_Pdf_Destination_FitRectangle bietet auch die folgenden Methoden an: FloatgetLeftEdge(); setLeftEdge(float $left); FloatgetBottomEdge(); setBottomEdge(float $bottom); FloatgetRightEdge(); setRightEdge(float $right); FloatgetTopEdge(); setTopEdge(float $top); Zend_Pdf_Destination_FitBoundingBox Zeigt die spezifizierte Seite an, wobei der Inhalt gerade genug vergrössert ist damit die Zeichenbox komplett in das Fenster passt, sowohl horizontal als auch vertikal. Wenn die notwendigen horizontalen und vertikalen Vergrösserungsfaktoren unterschiedlich sind, wird der kleinere der zwei verwendet, wobei die Zeichenbox im Fenster durch Verwendung der andern Dimension zentriert wird. Das Zielobjekt kann erstellt werden indem die Zend_Pdf_Destination_FitBoundingBox::create($page, $left, $bottom, $right, $top) Methode verwendet wird. Wobei $page eine Zielseite ist (ein Zend_Pdf_Page Objekt oder eine Seitenzahl). Zend_Pdf_Destination_FitBoundingBoxHorizontally Zeigt die spezifizierte Seite, mit den vertikalen Koordinaten an der oberen Ecke des Fensters positioniert, an und den Inhalt der Seite gerade genug vergrössert damit die komplette Breite der Zeichenbox in das Fenster passt. Das Zielobjekt kann erstellt werden indem die Zend_Pdf_Destination_FitBoundingBoxHorizontally::create($page, $top) Methode verwendet wird. Wobei $page eine Zielseite ist (ein Zend_Pdf_Page Objekt oder eine Seitenzahl). $top ist die obere Ecke der angezeigten Seite (float). Die Klasse Zend_Pdf_Destination_FitBoundingBoxHorizontally bietet auch die folgenden Methoden: FloatgetTopEdge(); setTopEdge(float $top); Zend_Pdf_Destination_FitBoundingBoxVertically Zeigt die spezifizierte Seite, mit den horizontalen Koordinaten an der oberen Ecke des Fensters positioniert, an und den Inhalt der Seite gerade genug vergrössert damit die komplette Höhe der Zeichenbox in das Fenster passt. Das Zielobjekt kann erstellt werden indem die Zend_Pdf_Destination_FitBoundingBoxVertically::create($page, $left) Methode verwendet wird. Wobei $page eine Zielseite ist (ein Zend_Pdf_Page Objekt oder eine Seitenzahl). $left ist die linke Ecke der angezeigten Seite (float). Die Klasse Zend_Pdf_Destination_FitBoundingBoxVertically bietet auch die folgenden Methoden: FloatgetLeftEdge(); setLeftEdge(float $left); Zend_Pdf_Destination_Named Alle oben aufgeführten Ziele sind "Explizite Ziele". Zusätzlich dazu können PDF Dokumente ein Verzeichnis solcher Ziele enthalten welche verwendet werden können um nach ausserhalb des PDF's zu referenzieren (z.B. 'http://www.mycompany.com/document.pdf#chapter3'). Zend_Pdf_Destination_Named Objekte erlauben es auf Ziele der benannten Zielverzeichnisse des Dokuments zu referenzieren. Benannte Zielobjekte können erstellt werden indem man die Zend_Pdf_Destination_Named::create(string $name) Methode verwendet. Die Klasse Zend_Pdf_Destination_Named bietet eine einzige zusätzliche Methode: StringgetName(); Verarbeitung von Zielen auf Level des Dokuments Die Klasse Zend_Pdf bietet ein Set von Methoden zur Verarbeitung von Zielen. Jedes Zielobjekt (inklusive benannter Ziele) kann aufgelöst werden indem die Methode resolveDestination($destination) verwendet wird. Sie gibt ein passendes Zend_Pdf_Page Objekt zurück wenn das Zielobjekt gefunden wurde, andernfalls NULL. Die Methode Zend_Pdf::resolveDestination() nimmt auch einen optionalen booleschen Parameter $refreshPageCollectionHashes, der standardmäßig true ist. Er zwingt das Zend_Pdf Objekt die Hashes der internen Kollektion der Seiten neu zu laden da die Liste der Seiten des Dokuments vom Benutzer aktualisiert sein könnte indem die Eigenschaft Zend_Pdf::$pages verwendet wird (Arbeiten mit Seiten). Das kann aus Gründen der Performance ausgeschaltet werden, wenn bekannt ist das die Liste der Seiten des Dokuments seit der letzten Anfragemethode nicht geändert wurde. Die komplette Liste der benannten Ziele kann empfangen werden indem die Methode Zend_Pdf::getNamedDestinations() verwendet wird. Sie gibt ein Array von Zend_Pdf_Target Objekten zurück, welche entweder explizite Ziele oder eine GoTo Aktion sind (Aktionen). Die Methode Zend_Pdf::getNamedDestination(string $name) gibt spezifizierte benannte Ziele zurück (ein explizites Ziel oder eine GoTo Aktion). Das Verzeichnis der benannten Ziele des PDF Dokuments kann mit der Methode Zend_Pdf::setNamedDestination(string $name, $destination) aktualisiert werden, wobei $destination entweder ein explizites Ziel ist (jedes Ziel ausser Zend_Pdf_Destination_Named) oder eine GoTo Aktion. Wenn NULL statt $destination spezifiziert ist, werden die spezifizierten benannten Ziele entfernt. Benannte Ziele die nicht aufgelöst werden können, werden automatisch vom Dokument entfernt wenn das Dokument gespeichert wird. Beispiel für die Verwendung von Zielen newPage(Zend_Pdf_Page::SIZE_A4); $page2 = $pdf->newPage(Zend_Pdf_Page::SIZE_A4); $page3 = $pdf->newPage(Zend_Pdf_Page::SIZE_A4); // Erstellte Seiten, aber nicht in der Seitenliste enthalten $pdf->pages[] = $page1; $pdf->pages[] = $page2; $destination1 = Zend_Pdf_Destination_Fit::create($page2); $destination2 = Zend_Pdf_Destination_Fit::create($page3); // Gibt das $page2 Objekt zurück $page = $pdf->resolveDestination($destination1); // Gibt null zurück, die Seite 3 ist bis jetzt nicht im Dokument enthalten $page = $pdf->resolveDestination($destination2); $pdf->setNamedDestination('Page2', $destination1); $pdf->setNamedDestination('Page3', $destination2); // Gibt $destination2 zurück $destination = $pdf->getNamedDestination('Page3'); // Gibt $destination1 zurück $pdf->resolveDestination(Zend_Pdf_Destination_Named::create('Page2')); // Gibt null zurück, die Seite 3 ist bis jetzt nicht im Dokument enthalten $pdf->resolveDestination(Zend_Pdf_Destination_Named::create('Page3')); ]]> Aktionen Statt einfach zu einem Ziel im Dokument zu springen, kann ein Hinweis oder Outline Element eine Aktion für die Viewer Anwendung spezifizieren die auszuführen ist, wie das starten einer Anwendung, das Abspielen eines Sounds, oder der Änderung der Sichtweise des Hinweis Status. Unterstützte Typen von Aktionen Die folgenden Typen von Aktionen werden beim Laden vom PDF Dokument erkannt: Zend_Pdf_Action_GoTo - geht zu einem Ziel im aktuellen Dokument. Zend_Pdf_Action_GoToR - geht zu einem Ziel in einem anderen Dokument. Zend_Pdf_Action_GoToE - geht zu einem Ziel in einem eingebetteten Dokument. Zend_Pdf_Action_Launch - startet eine Anwendung, öffnet oder druckt ein Dokument. Zend_Pdf_Action_Thread - beginnt einen Artikel Thread zu lesen. Zend_Pdf_Action_URI - löst ein URI auf. Zend_Pdf_Action_Sound - spielt einen Sound. Zend_Pdf_Action_Movie - spielt einen Film. Zend_Pdf_Action_Hide - versteckt oder zeigt einen oder mehrere Hinweise auf dem Bildschirm. Zend_Pdf_Action_Named - führt eine vordefinierte Aktion an der Viewer Anwendung aus: NextPage - Geht zur nächsten Seite des Dokuments. PrevPage - Geht zur vorhergehenden Seite des Dokuments. FirstPage - Geht zur ersten Seite des Dokuments. LastPage - Geht zur letzten Seite des Dokuments. Zend_Pdf_Action_SubmitForm - sendet Daten zu einem eindeutigen Ressourcenziel. Zend_Pdf_Action_ResetForm - setzt Felder mit Ihren Standardwerten. Zend_Pdf_Action_ImportData - importiert Feldwerte von einer Datei. Zend_Pdf_Action_JavaScript - führt ein JavaScript Skript aus. Zend_Pdf_Action_SetOCGState - setzt den Status von einem oder mehreren optionalen Inhaltsgruppen. Zend_Pdf_Action_Rendition - kontrolliert das Abspielen von Multimedia Inhalten (Beginnen, Stoppen, Pausieren oder Fortsetzen des Abspielens). Zend_Pdf_Action_Trans - Aktualisiert das Display eines Dokuments indem ein Übersetzungsverzeichnis verwendet wird. Zend_Pdf_Action_GoTo3DView - setzt die aktuelle Ansicht eines 3D Hinweises. Nur Zend_Pdf_Action_GoTo Aktionen können aktuell von Benutzern erstellt werden. Das kann getan werden indem die Methode Zend_Pdf_Action_GoTo::create($destination) verwendet wird wobei $destination ein Zend_Pdf_Destination Objekt oder String ist der verwendet werden kann um ein benanntes Ziel zu identifizieren. Es unterstützt auch die folgenden Methoden: Actions chaining Actions objects can be chained using Zend_Pdf_Action::$next public property. It's an array of Zend_Pdf_Action objects, which also may have their sub-actions. Zend_Pdf_Action class supports RecursiveIterator interface, so child actions may be iterated recursively: newPage(Zend_Pdf_Page::SIZE_A4); $page2 = $pdf->newPage(Zend_Pdf_Page::SIZE_A4); // Page created, but not included into pages list $page3 = $pdf->newPage(Zend_Pdf_Page::SIZE_A4); $pdf->pages[] = $page1; $pdf->pages[] = $page2; $action1 = Zend_Pdf_Action_GoTo::create( Zend_Pdf_Destination_Fit::create($page2)); $action2 = Zend_Pdf_Action_GoTo::create( Zend_Pdf_Destination_Fit::create($page3)); $action3 = Zend_Pdf_Action_GoTo::create( Zend_Pdf_Destination_Named::create('Chapter1')); $action4 = Zend_Pdf_Action_GoTo::create( Zend_Pdf_Destination_Named::create('Chapter5')); $action2->next[] = $action3; $action2->next[] = $action4; $action1->next[] = $action2; $actionsCount = 1; // Note! Iteration doesn't include top level action and // walks through children only $iterator = new RecursiveIteratorIterator( $action1, RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $chainedAction) { $actionsCount++; } printf("Actions in a tree: %d\n", $actionsCount++); // Prints 'Actions in a tree: 4' ]]> Document Open Action Special open action may be specify a destination to be displayed or an action to be performed when the document is opened. Zend_Pdf_Target Zend_Pdf::getOpenAction() method returns current document open action (or null if open action is not set). setOpenAction(Zend_Pdf_Target $openAction = null) method sets document open action or clean it if $openAction is null. Document Outline (bookmarks) A PDF document may optionally display a document outline on the screen, allowing the user to navigate interactively from one part of the document to another. The outline consists of a tree-structured hierarchy of outline items (sometimes called bookmarks), which serve as a visual table of contents to display the document’s structure to the user. The user can interactively open and close individual items by clicking them with the mouse. When an item is open, its immediate children in the hierarchy become visible on the screen; each child may in turn be open or closed, selectively revealing or hiding further parts of the hierarchy. When an item is closed, all of its descendants in the hierarchy are hidden. Clicking the text of any visible item activates the item, causing the viewer application to jump to a destination or trigger an action associated with the item. Zend_Pdf class provides public property $outlines which is an array of Zend_Pdf_Outline objects. outlines[0]->childOutlines[1]); // Set Outline to be displayed in bold $pdf->outlines[0]->childOutlines[3]->setIsBold(true); // Add outline entry $pdf->outlines[0]->childOutlines[5]->childOutlines[] = Zend_Pdf_Outline::create('Chapter 2', 'chapter_2'); $pdf->save($path, true); ]]> Outline attributes may be retrieved or set using the following methods: string getTitle() - get outline item title. setTitle(string $title) - set outline item title. boolean isOpen() - true if outline is open by default. setIsOpen(boolean $isOpen) - set isOpen state. boolean isItalic() - true if outline item is displayed in italic. setIsItalic(boolean $isItalic) - set isItalic state. boolean isBold() - true if outline item is displayed in bold. setIsBold(boolean $isBold) - set isBold state. Zend_Pdf_Color_Rgb getColor() - get outline text color (null means black). setColor(Zend_Pdf_Color_Rgb $color) - set outline text color (null means black). Zend_Pdf_Target getTarget() - get outline target (action or explicit or named destination object). setTarget(Zend_Pdf_Target|string $target) - set outline target (action or destination). String may be used to identify named destination. Null means 'no target'. array getOptions() - get outline attributes as an array. setOptions(array $options) - set outline options. The following options are recognized: 'title', 'open', 'color', 'italic', 'bold', and 'target'. New outline may be created in two ways: Zend_Pdf_Outline::create(string $title[, Zend_Pdf_Target|string $target]) Zend_Pdf_Outline::create(array $options) Each outline object may have child outline items listed in Zend_Pdf_Outline::$childOutlines public property. It's an array of Zend_Pdf_Outline objects, so outlines are organized in a tree. Zend_Pdf_Outline class implements RecursiveArray interface, so child outlines may be recursively iterated using RecursiveIteratorIterator: outlines as $documentRootOutlineEntry) { $iterator = new RecursiveIteratorIterator($documentRootOutlineEntry, RecursiveIteratorIterator::SELF_FIRST); foreach ($iterator as $childOutlineItem) { $OutlineItemTarget = $childOutlineItem->getTarget(); if ($OutlineItemTarget instanceof Zend_Pdf_Destination) { if ($pdf->resolveDestination($OutlineItemTarget) === null) { // Mark Outline item with unresolvable destination using RED color $childOutlineItem->setColor(new Zend_Pdf_Color_Rgb(1, 0, 0)); } } else if ($OutlineItemTarget instanceof Zend_Pdf_Action_GoTo) { if ($pdf->resolveDestination($OutlineItemTarget->setDestination()) === null) { // Mark Outline item with unresolvable destination using RED color $childOutlineItem->setColor(new Zend_Pdf_Color_Rgb(1, 0, 0)); } } } } $pdf->save($path, true); ]]> All outline items with unresolved destinations (or destinations of GoTo actions) are updated while document saving by setting their targets to null. So document will not be corrupted by removing pages referenced by outlines. Annotations An annotation associates an object such as a note, sound, or movie with a location on a page of a PDF document, or provides a way to interact with the user by means of the mouse and keyboard. All annotations are represented by Zend_Pdf_Annotation abstract class. Annotation may be attached to a page using Zend_Pdf_Page::attachAnnotation(Zend_Pdf_Annotation $annotation) method. Three types of annotations may be created by user now: Zend_Pdf_Annotation_Link::create($x1, $y1, $x2, $y2, $target) where $target is an action object or a destination or string (which may be used in place of named destination object). Zend_Pdf_Annotation_Text::create($x1, $y1, $x2, $y2, $text) Zend_Pdf_Annotation_FileAttachment::create($x1, $y1, $x2, $y2, $fileSpecification) A link annotation represents either a hypertext link to a destination elsewhere in the document or an action to be performed. A text annotation represents a "sticky note" attached to a point in the PDF document. A file attachment annotation contains a reference to a file. The following methods are shared between all annotation types: setLeft(float $left) float getLeft() setRight(float $right) float getRight() setTop(float $top) float getTop() setBottom(float $bottom) float getBottom() setText(string $text) string getText() Text annotation property is a text to be displayed for the annotation or, if this type of annotation does not display text, an alternate description of the annotation’s contents in human-readable form. Link annotation objects also provide two additional methods: setDestination(Zend_Pdf_Target|string $target) Zend_Pdf_Target getDestination()