Statistiques

Compteur d'affichages des articles
1040040

1 - Introduction

Je recherche depuis longtemps, le moyen de créer des fichiers PDF depuis Joomla.

Mes recherches m'ont amené sur le site pour les développeurs sur Joomla, l'article : Creating PDF views nous explique comment faire cela avec Joomla 2.5.

Suivons cet article dans le détail.

2 - Article CREATING PDF VIEWS sur http://docs.joomla.org

2.1 - Téléchargement de la librairie DomPdf

 Rendez vous sur : https://code.google.com/p/dompdf/downloads/list 

 Téléchargement DomPdf

Vous choisissez la release que vous voulez. Pour ma part j'ai choisi la version 0.6.0 beta3.

Vous la décompressez et enrigistrez le dossier dompdf dans votre arborescence /librairies, pour avoir /librairies/dompdf.

2.2 - Création des classes pour les fichiers PDF

Vous devez créer un répertoire /librairies/joomla/document/pdf

Vous devez créer un fichier nommé: pdf.php

Vous devez coller le code suivant dans /librairies/joomla/document/pdf/pdf.php

<?php
/**
 * @package             Joomla.Framework
 * @subpackage  Document
 * @copyright   Copyright (C) 2005 - 2012 Rob Clayburn
 * @license             GNU/GPL, see LICENSE.php
 * Joomla! is free software. This version may have been modified pursuant
 * to the GNU General Public License, and as distributed it includes or
 * is derivative of works licensed under the GNU General Public License or
 * other free or open source software licenses.
 * See COPYRIGHT.php for copyright notices and details.
 */
 
// Check to ensure this file is within the rest of the framework
defined('JPATH_BASE') or die();
 
require_once(JPATH_LIBRARIES .'/joomla/document/html/html.php');
 
/**
 * DocumentPDF class, provides an easy interface to parse and display a pdf document
 *
 * @package             Joomla.Framework
 * @subpackage  Document
 * @since               1.5
 */
class JDocumentpdf extends JDocumentHTML
{
        private $engine = null;
 
        private $name = 'joomla';
 
        /**
         * Class constructore
         * @param       array   $options Associative array of options
         */
 
        function __construct($options = array())
        {
                parent::__construct($options);
 
                //set mime type
                $this->_mime = 'application/pdf';
 
                //set document type
                $this->_type = 'pdf';
 
                if (!$this->iniDomPdf())
                {
                        JError::raiseError(500, 'No PDF lib found');
                }
        }
 
        protected function iniDomPdf()
        {
                $file = JPATH_LIBRARIES .'/dompdf/dompdf_config.inc.php';
                if (!JFile::exists($file))
                {
                        return false;
                }
                if (!defined('DOMPDF_ENABLE_REMOTE'))
                {
                        define('DOMPDF_ENABLE_REMOTE', true);
                }
                //set the font cache directory to Joomla's tmp directory
                $config = JFactory::getConfig();
                if (!defined('DOMPDF_FONT_CACHE'))
                {
                        define('DOMPDF_FONT_CACHE', $config->get('tmp_path'));
                }
                require_once($file);
                // Default settings are a portrait layout with an A4 configuration using millimeters as units
                $this->engine =new DOMPDF();
                return true;
        }
 
        /**
         * Sets the document name
         * @param   string   $name      Document name
         * @return  void
         */
 
        public function setName($name = 'joomla')
        {
                $this->name = $name;
        }
 
        /**
         * Returns the document name
         * @return      string
         */
 
        public function getName()
        {
                return $this->name;
        }
 
        /**
         * Render the document.
         * @access public
         * @param boolean       $cache          If true, cache the output
         * @param array         $params         Associative array of attributes
         * @return      string
         */
 
        function render($cache = false, $params = array())
        {
                $pdf = $this->engine;
                $data = parent::render();
                $this->fullPaths($data);
                //echo $data;exit;
                $pdf->load_html($data);
                $pdf->render();
                $pdf->stream($this->getName() . '.pdf');
                return '';
        }
 
        /**
         * (non-PHPdoc)
         * @see JDocumentHTML::getBuffer()
         */
 
        public function getBuffer($type = null, $name = null, $attribs = array())
        {
                if ($type == 'head' || $type == 'component')
                {
                        return parent::getBuffer($type, $name, $attribs);
                }
                else
                {
                        return '';
                }
        }
 
 
        /**
         * parse relative images a hrefs and style sheets to full paths
         * @param       string  &$data
         */
 
        private function fullPaths(&$data)
        {
                $data = str_replace('xmlns=', 'ns=', $data);
                libxml_use_internal_errors(true);
                try
                {
                        $ok = new SimpleXMLElement($data);
                        if ($ok)
                        {
                                $uri = JUri::getInstance();
                                $base = $uri->getScheme() . '://' . $uri->getHost();
                                $imgs = $ok->xpath('//img');
                                foreach ($imgs as &$img)
                                {
                                        if (!strstr($img['src'], $base))
                                        {
                                                $img['src'] = $base . $img['src'];
                                        }
                                }
                                //links
                                $as = $ok->xpath('//a');
                                foreach ($as as &$a)
                                {
                                        if (!strstr($a['href'], $base))
                                        {
                                                $a['href'] = $base . $a['href'];
                                        }
                                }
 
                                // css files.
                                $links = $ok->xpath('//link');
                                foreach ($links as &$link)
                                {
                                        if ($link['rel'] == 'stylesheet' && !strstr($link['href'], $base))
                                        {
                                                $link['href'] = $base . $link['href'];
                                        }
                                }
                                $data = $ok->asXML();
                        }
                } catch (Exception $err)
                {
                        //oho malformed html - if we are debugging the site then show the errors
                        // otherwise continue, but it may mean that images/css/links are incorrect
                        $errors = libxml_get_errors();
                        if (JDEBUG)
                        {
                                echo "<pre>";print_r($errors);echo "</pre>";
                                exit;
                        } 
                }
 
        }
 
}

2.3 - Copie du répertoire renderer

Comme le fichier /librairies/joomla/document/pdf.php étends la classe JDocumentHTML, vous devez copier le répertoire, et tout ce qu'il contient,   /librairies/joomla/document/html/renderer dans /librairies/joomla/document/pdf/ pour avoir /librairies/joomla/document/pdf/renderer.

2.4 - Création d'un vue PDF pour les articles

 Il suffit de copier le fichier components/com_content/views/article/view.html.php vers le fichier components/com_content/views/article/view.pdf.php.

Maintenant vous pouvez appeler votre PDF en rajoutant &format=pdf&tmpl=component à la fin de votre url.

Exemples :

 http://localhost/joomla/index.php?option=com_content&view=article&id=2:virtualbox&catid=2&Itemid=101 donne

Affichage Web

 

http://localhost/joomla/index.php?option=com_content&view=article&id=2:virtualbox&catid=2&Itemid=101&format=pdf&tmpl=component ouvre une fenêtre d'enregistrement d'un fichier nommé joomla.pdf.

Fichier PDF

 

Nous avons donc un fichier PDF contenant notre article.

2.5 - Conclusion

Ce fichier PDF n'est pas très "sexy". J'aurais voulu ajouter sur la première page le logo du site mais pas sur les suivantes. 

Nous verrons dans le prochain article que l'on peux faire mieux.