blob: 6f7d13cb7c5529ce9517c93161f88562604e2da3 [file] [log] [blame]
<?php
/**
* File containing the ezcDocumentPdfFooterPdfPart class
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
* @package Document
* @version //autogen//
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* Basic foot class, which renders a simple page footer including information
* from the document.
*
* Configured using the ezcDocumentPdfFooterOptions options class.
*
* A footer, or any other PDF part, can be registered for rendering in the main
* PDF class using the registerPdfPart() method, like:
*
* <code>
* $pdf = new ezcDocumentPdf();
*
* // Add a customized footer
* $pdf->registerPdfPart( new ezcDocumentPdfFooterPdfPart(
* new ezcDocumentPdfFooterOptions( array(
* 'showDocumentTitle' => false,
* 'showDocumentAuthor' => false,
* 'height' => '10mm',
* ) )
* ) );
*
* $pdf->createFromDocbook( $docbook );
* file_put_contents( __FILE__ . '.pdf', $pdf );
* </code>
*
* @package Document
* @version //autogen//
*/
class ezcDocumentPdfFooterPdfPart extends ezcDocumentPdfPart
{
/**
* Options of footer
*
* @var ezcDocumentPdfFooterOptions
*/
protected $options;
/**
* Reference to rendered document
*
* @var DOMDocument
*/
protected $document;
/**
* Extracted title information
*
* @var mixed
*/
protected $documentTitle;
/**
* Extracted author information
*
* @var mixed
*/
protected $documentAuthor;
/**
* Create a new footer PDF part
*
* @param ezcDocumentPdfFooterOptions $options
*/
public function __construct( ezcDocumentPdfFooterOptions $options = null )
{
$this->options = ( $options === null ?
new ezcDocumentPdfFooterOptions() :
$options );
}
/**
* Hook on page creation
*
* Hook called on page creation, so that certain areas might be reserved or
* it already may render stuff on the frshly created page.
*
* @param ezcDocumentPdfPage $page
* @return void
*/
public function hookPageCreation( ezcDocumentPdfPage $page )
{
// Get default styles from document
$style = $this->styles->inferenceFormattingRules( $this->document );
foreach ( $style as $name => $value )
{
$this->driver->setTextFormatting( $name, $value->value );
}
// Allocate space for footer
if ( ( $space = $page->testFitRectangle(
$page->x,
$this->options->footer ? $page->y + $page->innerHeight - $this->options->height->get() : $page->y,
$page->innerWidth,
$this->options->height->get()
) ) === false )
{
// If we can't allocate the designated space, exit.
return false;
}
// Calculate vertical alignement
$offset = 0;
if ( $this->options->footer )
{
$offset = $space->height - 2.1 * $this->driver->getCurrentLineHeight();
}
// Render document title
if ( $this->documentTitle &&
$this->options->showDocumentTitle )
{
// Inference these settings somehow
$this->driver->setTextFormatting( 'font-weight', 'bold' );
$width = $this->driver->calculateWordWidth( $this->documentTitle );
$this->driver->drawWord(
$space->x + ( $page->innerWidth - $width ) / 2,
$space->y + $offset + $this->driver->getCurrentLineHeight(),
$this->documentTitle
);
$offset += 1.1 * $this->driver->getCurrentLineHeight();
}
// Render document author
if ( $this->documentAuthor &&
$this->options->showDocumentAuthor )
{
// Inference these settings somehow
$this->driver->setTextFormatting( 'font-weight', 'normal' );
$this->driver->setTextFormatting( 'font-style', 'italic' );
$width = $this->driver->calculateWordWidth( $this->documentAuthor );
$this->driver->drawWord(
$space->x + ( $page->innerWidth - $width ) / 2,
$space->y + $offset + $this->driver->getCurrentLineHeight(),
$this->documentAuthor
);
$offset += 1.1 * $this->driver->getCurrentLineHeight();
}
// Render page number
if ( $this->options->showPageNumber )
{
$pageNumber = $page->number + $this->options->pageNumberOffset;
$postion = $pageNumber % 2 ? $space->width - $this->driver->calculateWordWidth( $pageNumber ) : 0;
$this->driver->drawWord(
$space->x + $postion,
$space->y + ( $space->height - $this->driver->getCurrentLineHeight() ) / 2
+ $this->driver->getCurrentLineHeight(),
$pageNumber
);
}
$page->setCovered( $space );
if ( !$this->options->footer )
{
$page->y += $space->height;
}
}
/**
* Hook on document creation
*
* Hook called when a new document is created.
*
* @param ezcDocumentLocateableDomElement $element
* @return void
*/
public function hookDocumentCreation( ezcDocumentLocateableDomElement $element )
{
$this->document = $element;
// Extract title and author information
$xpath = new DOMXPath( $this->document->ownerDocument );
$nodes = $xpath->query( '//*[local-name() = "title"]' );
$this->documentTitle = $nodes->length ? $nodes->item( 0 )->textContent : null;
$nodes = $xpath->query( '//*[local-name() = "author"]' );
$this->documentAuthor = $nodes->length ? $nodes->item( 0 )->textContent : null;
}
}
?>