blob: 7dd272c52b5674a01c0e51406aee3fa541f4395f [file] [log] [blame]
<?php
/**
* File containing the ezcDocumentPdf 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//
* @copyright Copyright (C) 2005-2010 eZ Systems AS. All rights reserved.
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
*/
/**
* Document handler for PDF documents.
*
* This document handler can load Docbook documents and generate PDF documents
* from them. It can be configured using its option class
* ezcDocumentPdfOptions. The example below shows the configuration of a
* driver.
*
* <code>
* // Load the docbook document and create a PDF from it
* $pdf = new ezcDocumentPdf();
* $pdf->options->driver = new ezcDocumentPdfHaruDriver();
*
* // Load a custom style sheet
* $pdf->loadStyles( 'custom.css' );
*
* // Add a customized footer
* $pdf->registerPdfPart( new ezcDocumentPdfFooterPdfPart(
* new ezcDocumentPdfFooterOptions( array(
* 'showDocumentTitle' => false,
* 'showDocumentAuthor' => false,
* 'height' => '10mm',
* ) )
* ) );
*
* // Add a customized header
* $pdf->registerPdfPart( new ezcDocumentPdfHeaderPdfPart(
* new ezcDocumentPdfFooterOptions( array(
* 'showPageNumber' => false,
* 'height' => '10mm',
* ) )
* ) );
*
* $pdf->createFromDocbook( $docbook );
* file_put_contents( __FILE__ . '.pdf', $pdf );
* </code>
*
* Like shown in the example, it is possible to load any amount of custom style
* definitions and register additional PDF parts, like headers and footers.
*
* @package Document
* @version //autogen//
* @mainclass
*/
class ezcDocumentPdf extends ezcDocument
{
/**
* Container for style directives.
*
* @var ezcDocumentPcssStyleInferencer
*/
protected $styles;
/**
* The generated PDF
*
* @var string
*/
protected $content;
/**
* List of PDF parts to append to documents
*
* @var array(ezcDocumentPdfPart)
*/
protected $pdfParts = array();
/**
* Construct RST document.
*
* @ignore
* @param ezcDocumentPdfOptions $options
* @return void
*/
public function __construct( ezcDocumentPdfOptions $options = null )
{
parent::__construct( $options === null ?
new ezcDocumentPdfOptions() :
$options );
$this->styles = new ezcDocumentPcssStyleInferencer();
if ( $this->options->driver === null )
{
$this->options->driver = new ezcDocumentPdfHaruDriver();
}
}
/**
* Create document from input string
*
* Create a document of the current type handler class and parse it into a
* usable internal structure.
*
* @param string $string
* @return void
*/
public function loadString( $string )
{
throw new ezcBaseFunctionalityNotSupportedException( 'Reading PDF', 'Not implemented yet.' );
}
/**
* Load style definition file
*
* Parse and load a PCSS file and use the resulting style definitions for
* rendering.
*
* @param string $file
* @return void
*/
public function loadStyles( $file )
{
$parser = new ezcDocumentPcssParser();
$this->styles->appendStyleDirectives(
$parser->parseFile( $file )
);
}
/**
* Append a PDF part
*
* Register additional PDF parts to be included in the rendering process,
* like headers and footers.
*
* @param ezcDocumentPdfPart $part
* @return void
*/
public function registerPdfPart( ezcDocumentPdfPart $part )
{
$this->pdfParts[] = $part;
}
/**
* Return document compiled to the docbook format
*
* The internal document structure is compiled to the docbook format and
* the resulting docbook document is returned.
*
* This method is required for all formats to have one central format, so
* that each format can be compiled into each other format using docbook as
* an intermediate format.
*
* You may of course just call an existing converter for this conversion.
*
* @return ezcDocumentDocbook
*/
public function getAsDocbook()
{
throw new RuntimeException( 'Reading PDF documents is not implemented.' );
}
/**
* Create document from docbook document
*
* A document of the docbook format is provided and the internal document
* structure should be created out of this.
*
* This method is required for all formats to have one central format, so
* that each format can be compiled into each other format using docbook as
* an intermediate format.
*
* You may of course just call an existing converter for this conversion.
*
* @param ezcDocumentDocbook $document
* @return void
*/
public function createFromDocbook( ezcDocumentDocbook $document )
{
if ( $this->options->validate &&
$document->validateString( $document ) !== true )
{
$this->triggerError( E_WARNING, "You try to convert an invalid docbook document. This may lead to invalid output." );
}
$this->path = $document->getPath();
$this->options->driver->setOptions( $this->options );
$renderer = new ezcDocumentPdfMainRenderer(
$this->options->driver,
$this->styles,
$this->options
);
foreach ( $this->pdfParts as $part )
{
$renderer->registerPdfPart( $part );
}
$this->content = $renderer->render( $document, $this->options->hyphenator, $this->options->tokenizer );
// Merge errors from renderer
$this->errors = array_merge(
$this->errors,
$renderer->getErrors()
);
}
/**
* Return document as string
*
* Serialize the document to a string an return it.
*
* @return string
*/
public function save()
{
return $this->content;
}
}
?>