Statistiques

Compteur d'affichages des articles
1093101

5 - Méthode Root Progress avec librairie TcPdf

 5.1 - Pourquoi TcPdf?

J'ai déjà utilisé cette librairie avec le CRM Dolibarr pour générer les devis et factures. On dessine vraiment les pages du PDF.

5.2 - Remise à blanc de pdfcontent

Il faut remettre le fichier original pdfcontent.php afin de continuer ce tutoriel.

5.3 - Téléchargement et installation de TcPdf

Allez sur le ce lien et téléchargez tcpdf_5_9_193.zip.

Extraire les fichiers et copier le répertoire tcpdf et son contenu dans /librairies/ pour avoir /librairies/tcpdf/.

5.4 Première génération de PDF

Nous allons d'abord modifier la fonction construct.

	/**
	 * Construct the plugin
	 */
	function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		if (!$this->iniDomPdf())
		{
			JError::raiseError(500, 'No PDF lib found: download from https://code.google.com/p/dompdf/downloads/list: extract to /libraries/');
		}
	}

devient

	/**
	 * Construct the plugin
	 */
	function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);

		if (!$this->iniTcPdf())
		{
			JError::raiseError(500, 'No PDF lib found: download from http://sourceforge.net/projects/tcpdf/files/: extract to /libraries/');
		}
	}

Puis la fonction iniDomPdf deviendra iniTcPdf

	/**
	 * Check dompdf configuration
	 * @copyright Rob Clayburn http://docs.joomla.org/index.php?title=How_to_create_PDF_views&oldid=70693
	 */
	protected function iniDomPdf()
	{
		//check for dompdf configuration file 
		$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);

		//create new dompdf engine
		$this->engine =new DOMPDF();
		return true;
	}

devient

	/**
	 * Check tcpdf configuration
	 * @copyright Rob Clayburn http://docs.joomla.org/index.php?title=How_to_create_PDF_views&oldid=70693
	 */
	protected function iniTcPdf()
	{
		//check for dompdf configuration file 
		require_once(JPATH_LIBRARIES .'/tcpdf/config/lang/fra.php');
		require_once(JPATH_LIBRARIES .'/tcpdf/tcpdf.php');
		//create new tcpdf engine
		$this->pdf= new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
		return true;
	}

Les lignes suivantes:

				//setup dompdf objects
				$pdf = $this->engine;

deviennent

				//setup dompdf objects
				$pdf = $this->pdf;
				// définition du pdf
				$pos_x="";
				$pos_y="";
				$pdf->SetCreator('PrestaOpen');
				$pdf->SetAuthor('Gilbert Marin');
				$pdf->SetTitle($title);
				$pdf->SetSubject('');
				$pdf->SetKeywords('');
				$pdf->setPageUnit('pt');
				// set default font subsetting mode
				$pdf->setFontSubsetting(true);
				// Set font
				// dejavusans is a UTF-8 Unicode font, if you only need to
				// print standard ASCII chars, you can use core fonts like
				// helvetica or times to reduce file size.
				$pdf->SetFont('dejavusans', '', 10, '', true);
				//set margins
				$pdf->SetMargins(PDF_MARGIN_LEFT, 0, PDF_MARGIN_RIGHT);
				$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
				//set auto page breaks
				$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
				//set image scale factor
				$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
				//set some language-dependent strings
				$pdf->setLanguageArray($l);
				// Add a page
				// This method has several options, check the source code documentation for more information.
				$pdf->AddPage();

Nous avons défini ici les informations nécessaires à la génération du PDF.

Continuons les modifications:

				//create pdf using dompdf engine
				$pdf->load_html($data);
				$pdf->set_paper($this->params->get('size','letter'),$this->params->get('orientation','portrait'));
				$pdf->render();

devient

				//create pdf using dompdf engine
				$pdf->writeHTMLCell($w=0, $h=0, $x=$pdf->getx(), $y=$pdf->gety(), $data, $border=0, $ln=1, $fill=0, $reseth=true, $align='', $autopadding=true);

Les lignes:

				//get and set pdf title to page title
				$this->setName(JFactory::getDocument()->getTitle());
					
				//present pdf to user
				$pdf->stream($this->getName() . '.pdf');
				return '';

deviennent

				// Close and output PDF document
				// This method has several options, check the source code documentation for more information.
				$fileName ="test.pdf";
				$pdf->Output($fileName, "D");
				return '';

Générons un PDF sur un article:

Erreur chemin des images

TcPdf nous signale une erreur dans le chemin des images. Il faut pour cela redéfinir la variable K_PATH_IMAGES.

Dans le fichier de configuration de TcPdf, on change :

	/**
	 *images directory
	 */
	define ('K_PATH_IMAGES', K_PATH_MAIN.'images/');

pour avoir:

	/**
	 *images directory
	 */
	define ('K_PATH_IMAGES', JPATH_BASE."/" );

La fonction fullpaths n'est plus utile. On peux la supprimer sans problème. La ligne d'appel de la fonction peux aussi être supprimée.

Le PDF est bien généré, mais les images sont collées à gauche, il n'y a pas encore de Header (avec le logo) ni de footer avec le titre du document et le nombre de pages.

Fichier Pdf

 5.5 - Pied de page (footer)

 Pour gérer un footer personnalisé, il faut créer le fichier plugins/system/pdfcontent/custom.php.

Le contenu de ce fichier est :

<?php

// Extend the TCPDF class to create custom Header and Footer
class MYPDF extends TCPDF {

    // Page footer
    public function Footer() {
        
		// Position at 15 mm from bottom
        $this->SetY(-15);
        // Set font
        $this->SetFont('helvetica', 'I', 8);
        // Page number
        $this->Cell(0, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'C', 0, '', 0, false, 'T', 'M');
    }
}

C'est dans ce fichier que l'on peux personnaliser le header.

Il faut maintenant appeler ce fichier depuis pdfcontent.php.

Cela se passe ici :

	protected function iniTcPdf()
	{
		//check for dompdf configuration file 
		require_once(JPATH_LIBRARIES .'/tcpdf/config/lang/fra.php');
		require_once(JPATH_LIBRARIES .'/tcpdf/tcpdf.php');
		//create new tcpdf engine
		$this->pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
		return true;
	}

devient :

	protected function iniTcPdf()
	{
		//check for dompdf configuration file 
		require_once(JPATH_LIBRARIES .'/tcpdf/config/lang/fra.php');
		require_once(JPATH_LIBRARIES .'/tcpdf/tcpdf.php');
		require_once('/custom.php');
		//create new tcpdf engine
		$this->pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
		return true;
	}

Quand nous générons le PDF, les pages sont bien numérotées.

Numérotation des pages

 

Voyons maintenant comment insérer le titre de l'article.

Nous changeons la fonction contruct :

	/**
	 * Construct the plugin
	 */
	function __construct(&$subject, $config)
	{
		parent::__construct($subject, $config);
		$id = JRequest::getInt('id');
		$db = JFactory::getDBO();
		$query = "SELECT * FROM #__content WHERE id = ".$id." LIMIT 1";
		$db->setQuery($query);
		$result = $db->loadObject();
		$title= $result->title;
		define ('PDF_TITLE', $title);

		if (!$this->iniTcPdf($title))
		{
			JError::raiseError(500, 'No PDF lib found: download from https://code.google.com/p/dompdf/downloads/list: extract to /libraries/');
		}
	}

Nous modifions le fichier custom.php :

    public function Footer() {
		// Position at 15 mm from bottom
        $this->SetY(-15);
        // Set font
        $this->SetFont('helvetica', 'I', 8);
        // Page number
        $this->Cell(0, 10,PDF_TITLE. 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'C', 0, '', 0, false, 'T', 'M');
    }

Et voila:

Titre et numérotation

 

 Si nous changeons ici :

				// Close and output PDF document
				// This method has several options, check the source code documentation for more information.
				$fileName =PDF_TITLE.".pdf";
				$pdf->Output($fileName, "D");

Le nom du PDF est changé aussi.

Maintenant je souhaite que le nom du fichier soit à gauche et que la pagination soit à droite.

Il suffit de modifier le fichier custom.php comme ceci :

    // Page footer
    public function Footer() {
		// Position at 15 mm from bottom
        $this->SetY(-15);
        // Set font
        $this->SetFont('helvetica', 'I', 8);
        // Page number
		$width=$this->getPageWidth();
		$cell_width=$width/2;
		$txt='Page '.$this->PageNo().'/'.$this->getAliasNbPages();
		$this->MultiCell($cell_width, 15,PDF_TITLE, 0, 'L', 0, 0, '', '', true);
		$this->MultiCell($cell_width, 15, $txt, 0, 'R', 0, 0, '', '', true);
		$this->Ln(2);
	}

Si l'on modifie encore comme ceci:

    // Page footer
    public function Footer() {
		// Position at 15 mm from bottom
        $this->SetY(-15);
        // Set font
        $this->SetFont('helvetica', 'I', 8);
        // Page number
		$width=$this->getPageWidth();
		$cell_width=($width-20)/2;
		$txt='Page '.$this->PageNo().'/'.$this->getAliasNbPages();
		if ($this->PageNo()%2) {
			$this->MultiCell($cell_width, 15,PDF_TITLE, 0, 'L', 0, 0, '', '', true);
			$this->MultiCell($cell_width, 15, $txt, 0, 'R', 0, 0, '', '', true);
		} else {
			$this->MultiCell($cell_width, 15, $txt, 0, 'L', 0, 0, '', '', true);
			$this->MultiCell($cell_width, 15,PDF_TITLE, 0, 'R', 0, 0, '', '', true);
		}
		$this->Ln(2);
	}

Je vous laisse tester.

Nous verrons comment insérer un header avec logo dans un prochain article.