]>
git.agnieray.net Git - galette.git/blob - galette/lib/Galette/IO/Pdf.php
7d7a432bb27814f76277fac04180888333af8ffa
3 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
6 * PDF class for galette
7 * Traps tcpdf errors by overloading tcpdf::error method
8 * Adds convenient method to convert color html codes
9 * Adds a _parsegif function to convert gif to png
13 * Copyright © 2007-2014 The Galette Team
15 * This file is part of Galette (http://galette.tuxfamily.org).
17 * Galette is free software: you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation, either version 3 of the License, or
20 * (at your option) any later version.
22 * Galette is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
25 * GNU General Public License for more details.
27 * You should have received a copy of the GNU General Public License
28 * along with Galette. If not, see <http://www.gnu.org/licenses/>.
33 * @author John Perr <johnperr@abul.org>
34 * @author Johan Cwiklinski <johan@x-tnd.be>
35 * @copyright 2007-2014 The Galette Team
36 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
38 * @link http://galette.tuxfamily.org
39 * @since Available since 0.7dev - 2007-07-21
44 use Galette\Core\Preferences
;
45 use Galette\Entity\PdfModel
;
49 * TCPDF configuration file for Galette
51 require_once GALETTE_CONFIG_PATH
. 'galette_tcpdf_config.php';
56 require_once GALETTE_TCPDF_PATH
. '/tcpdf.php';
59 * PDF class for galette
64 * @abstract Class for expanding TCPDF.
65 * @author John Perr <johnperr@abul.org>
66 * @author Johan Cwiklinski <johan@x-tnd.be>
67 * @copyright 2007-2014 The Galette Team
68 * @license http://www.gnu.org/licenses/gpl-3.0.html GPL License 3.0 or (at your option) any later version
69 * @link http://galette.tuxfamily.org
70 * @since Available since 0.7dev - 2007-07-21
73 class Pdf
extends \TCPDF
76 const FONT
= 'DejaVuSans';
79 protected $preferences;
81 private $paginated = false;
85 * Main constructor, set creator and author
87 * @param Preferences $prefs Preferences
88 * @param PdfModel $model Related model
90 public function __construct(Preferences
$prefs, $model = null)
92 $this->preferences
= $prefs;
93 parent
::__construct('P', 'mm', 'A4', true, 'UTF-8');
95 $this->SetCreator(PDF_CREATOR
);
96 $this->SetFont(self
::FONT
, '', self
::FONT_SIZE
);
99 $this->preferences
->pref_nom
,
103 $name . ' (using Galette ' . GALETTE_VERSION
.
104 'and TCPDF ' . TCPDF_VERSION
. ')'
107 if ($model !== null) {
108 if ($model instanceof PdfModel
) {
109 $this->model
= $model;
110 $this->SetTitle($this->model
->htitle
);
112 throw new \
UnexpectedValueException(
113 'Provided model must be an instance of PdfModel!'
120 * Set show pagination
124 public function showPagination()
126 $this->paginated
= true;
132 public function __destruct()
134 parent
::__destruct();
138 * This method is automatically called in case of fatal error;
139 * it simply outputs the message and halts the execution.
140 * An inherited class may override it to customize the error
141 * handling but should always halt the script, or the resulting
142 * document would probably be invalid.
143 * 2004-06-11 :: Nicola Asuni : changed bold tag with strong
144 * 2007-07-21 :: John Perr : changed function to return error to session
145 * 2017-02-14 :: Johan Cwiklinski : use slim's flash message; do not rely on session for redirect
147 * @param string $msg The error message
153 public function Error($msg) // phpcs:ignore PSR1.Methods.CamelCapsMethodName
162 $container->get('flash')->addMessage(
167 $redirect = (isset($_SERVER['HTTP_REFERER']) ?
168 $_SERVER['HTTP_REFERER'] :
169 $container->get('router')->pathFor('slash'));
170 header('Location: ' . $redirect);
175 * Converts color from HTML format #RRVVBB
176 * to RGB 3 colors array.
178 * @param string $hex6 7 chars string #RRVVBB
182 public function colorHex2Dec($hex6)
185 "R" => hexdec(substr($hex6, 1, 2)),
186 "G" => hexdec(substr($hex6, 3, 2)),
187 "B" => hexdec(substr($hex6, 5, 2))
192 /** FIXME: is this function used somewhere? */
194 * Extract info from a GIF file
195 * (In fact: converts gif image to png and feeds it to _parsepng)
197 * @param string $file path to the gif file
202 protected function parsegif($file)
204 $a=GetImageSize($file);
206 $this->Error(_T("Missing or incorrect image file ") . $file);
209 $this->Error(_T("Not a GIF file ") . $file);
212 // Tentative d'ouverture du fichier
213 if (function_exists('gd_info')) {
214 $data = @imagecreatefromgif
($file);
216 // Test d'échec & Affichage d'un message d'erreur
218 $this->Error(_T("Error loading ").$file);
220 if (imagepng($data, GALETTE_ROOT
. 'tempimages/gif2png.png')) {
221 return $this->_parsepng(GALETTE_ROOT
. 'tempimages/gif2png.png');
223 $this->Error(_T("Error creating temporary png file from ").$file);
226 $this->Error(_T("Unable to convert GIF file ").$file);
231 * Draws PDF page Header
235 public function Header() // phpcs:ignore PSR1.Methods.CamelCapsMethodName
237 //just ovverride default header to prevent black line at top
241 * Draws PDF page footer
245 public function Footer() // phpcs:ignore PSR1.Methods.CamelCapsMethodName
248 if (isset($this->model
)) {
250 if (trim($this->model
->hstyles
) !== '') {
251 $hfooter .= "<style>\n" . $this->model
->hstyles
. "\n</style>\n\n";
253 $hfooter .= $this->model
->hfooter
;
254 $this->writeHtml($hfooter);
256 $this->SetFont(self
::FONT
, '', self
::FONT_SIZE
);
257 $this->SetTextColor(0, 0, 0);
259 $name = preg_replace(
261 $this->preferences
->pref_nom
,
265 /** FIXME: get configured postal address */
266 $coordonnees_line1 = $name . ' - ' . $this->preferences
->pref_adresse
;
267 /** FIXME: pref_adresse2 should be removed */
268 if (trim($this->preferences
->pref_adresse2
) != '') {
269 $coordonnees_line1 .= ', ' . $this->preferences
->pref_adresse2
;
271 $coordonnees_line2 = $this->preferences
->pref_cp
. ' ' .
272 $this->preferences
->pref_ville
;
282 $this->preferences
->pref_website
292 $this->preferences
->pref_website
295 if ($this->paginated
) {
296 $this->SetFont(self
::FONT
, '', self
::FONT_SIZE
- 3);
301 $this->getAliasRightShift() . $this->PageNo() .
302 '/' . $this->getAliasNbPages(),
312 * Draws PDF page header
314 * @param string $title Additionnal title to display just after logo
318 public function PageHeader($title = null) // phpcs:ignore PSR1.Methods.CamelCapsMethodName
320 if (isset($this->model
)) {
322 if (trim($this->model
->hstyles
) !== '') {
323 $html .= "<style>\n" . $this->model
->hstyles
. "\n</style>\n\n";
325 $html .= $this->model
->hheader
;
326 $this->writeHtml($html, true, false, true, false, '');
327 if (trim($this->model
->title
) !== '') {
329 if (trim($this->model
->hstyles
) !== '') {
330 $htitle .= "<style>\n" . $this->model
->hstyles
.
333 $htitle .= '<div id="pdf_title">' . $this->model
->htitle
. '</div>';
334 $this->writeHtml($htitle);
336 if (trim($this->model
->subtitle
) !== '') {
338 if (trim($this->model
->hstyles
) !== '') {
339 $hsubtitle .= "<style>\n" . $this->model
->hstyles
.
342 $hsubtitle .= '<div id="pdf_subtitle">' . $this->model
->hsubtitle
.
344 $this->writeHtml($hsubtitle);
346 if (trim($this->model
->title
) !== ''
347 ||
trim($this->model
->subtitle
) !== ''
353 $print_logo = new \Galette\Core\
PrintLogo();
354 $logofile = $print_logo->getPath();
356 // Set logo size to max width 30 mm or max height 25 mm
357 $ratio = $print_logo->getWidth()/$print_logo->getHeight();
359 if ($print_logo->getHeight() > 16) {
362 $hlogo = $print_logo->getHeight();
364 $wlogo = round($hlogo*$ratio);
366 if ($print_logo->getWidth() > 16) {
369 $wlogo = $print_logo->getWidth();
371 $hlogo = round($wlogo/$ratio);
374 $this->SetFont(self
::FONT
, 'B', self
::FONT_SIZE +
4);
375 $this->SetTextColor(0, 0, 0);
379 $ystart = $this->GetY();
384 $this->preferences
->pref_nom
,
389 $this->preferences
->pref_website
391 $this->SetFont(self
::FONT
, 'B', self
::FONT_SIZE +
2);
393 if ($title !== null) {
394 $this->Cell(0, 6, $title, 0, 1, 'L', 0);
396 $yend = $this->getY();//store position at the end of the text
398 $this->SetY($ystart);
399 $x = 190 - $wlogo; //right align
400 $this->Image($logofile, $x, $this->GetY(), $wlogo, $hlogo);
401 $this->y +
= $hlogo +
3;
402 //if position after logo is < than position after text,
403 //we have to change y
404 if ($this->getY() < $yend) {
411 * Draws body from model
415 public function PageBody() // phpcs:ignore PSR1.Methods.CamelCapsMethodName
418 if (trim($this->model
->hstyles
) !== '') {
419 $hbody .= "<style>\n" . $this->model
->hstyles
. "\n</style>\n\n";
421 $hbody .= $this->model
->hbody
;
422 $this->writeHtml($hbody);
428 * @param string $text Text content
429 * @param integer $maxsize Maximal size
430 * @param integer $fontsize Font size
431 * @param string $fontstyle Font style (defaults to '')
432 * @param string $fontname Font name (defaults to static::FONT)
436 protected function fixSize($text, $maxsize, $fontsize, $fontstyle = '', $fontname = null)
438 if ($fontname === null) {
439 $fontname = static::FONT
;
441 $this->SetFontSize($fontsize);
442 while ($this->GetStringWidth($text, $fontname, $fontstyle, $fontsize) > $maxsize) {
444 $this->SetFontSize($fontsize);
451 * @param string $str Original string
452 * @param integer $length Max length
456 protected function cut($str, $length)
458 $length = $length -2; //keep a margin
459 if ($this->GetStringWidth($str) > $length) {
460 while ($this->GetStringWidth($str . '...') > $length) {
461 $str = mb_substr($str, 0, -1, 'UTF-8');
469 * Stretch a header string
471 * @param string $str Original string
472 * @param integer $length Max length
476 protected function stretchHead($str, $length)
478 $this->SetFont(self
::FONT
, 'B', self
::LIST_FONT
);
480 if ($this->GetStringWidth($str) > $length) {
481 while ($this->GetStringWidth($str) > $length) {
482 $this->setFontStretching(--$stretch);
493 public function getFilename()
495 return $this->filename
;
499 * Download PDF from browser
503 public function download()
505 $this->Output($this->filename
, 'D');