2 /**********************************************************************
3 Copyright (C) FrontAccounting, LLC.
4 Released under the terms of the GNU General Public License, GPL,
5 as published by the Free Software Foundation, either version 3
6 of the License, or (at your option) any later version.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
10 See the License here <http://www.gnu.org/licenses/gpl-3.0.html>.
11 ***********************************************************************/
13 This class is an extension to the tcpdf class using a syntax that the original reports were written in
14 (the R &OS pdf.php class) - due to easily portation this wrapper class
15 was written to allow the same code base to use the more functional tcpdf.class by Nicola Asuni
17 * Wrapper for use R&OSpdf API with tcpdf.org class
18 * Joe Hunt <joe.hunt.consulting@gmail.com> and Janusz Dobrowolski <janusz@iron.from.pl>
21 define("K_RE_PATTERN_RTL", "/(
23 | \xD7[\x80\x83\x86\x90-\xAA\xB0-\xB4] # R
24 | \xDF[\x80-\xAA\xB4\xB5\xBA] # R
26 | \xEF\xAC[\x9D\x9F\xA0-\xA8\xAA-\xB6\xB8-\xBC\xBE] # R
27 | \xEF\xAD[\x80\x81\x83\x84\x86-\x8F] # R
28 | \xF0\x90\xA0[\x80-\x85\x88\x8A-\xB5\xB7\xB8\xBC\xBF] # R
29 | \xF0\x90\xA4[\x80-\x99] # R
30 | \xF0\x90\xA8[\x80\x90-\x93\x95-\x97\x99-\xB3] # R
31 | \xF0\x90\xA9[\x80-\x87\x90-\x98] # R
32 | \xE2\x80[\xAB\xAE] # RLE & RLO
36 * Pattern to test Arabic strings using regular expressions.
37 * source: http://www.w3.org/International/questions/qa-forms-utf-8
39 define("K_RE_PATTERN_ARABIC", "/(
40 \xD8[\x80-\x83\x8B\x8D\x9B\x9E\x9F\xA1-\xBA] # AL
41 | \xD9[\x80-\x8A\xAD-\xAF\xB1-\xBF] # AL
42 | \xDA[\x80-\xBF] # AL
43 | \xDB[\x80-\x95\x9D\xA5\xA6\xAE\xAF\xBA-\xBF] # AL
44 | \xDC[\x80-\x8D\x90\x92-\xAF] # AL
45 | \xDD[\x8D-\xAD] # AL
46 | \xDE[\x80-\xA5\xB1] # AL
47 | \xEF\xAD[\x90-\xBF] # AL
48 | \xEF\xAE[\x80-\xB1] # AL
49 | \xEF\xAF[\x93-\xBF] # AL
50 | \xEF[\xB0-\xB3][\x80-\xBF] # AL
51 | \xEF\xB4[\x80-\xBD] # AL
52 | \xEF\xB5[\x90-\xBF] # AL
53 | \xEF\xB6[\x80-\x8F\x92-\xBF] # AL
54 | \xEF\xB7[\x80-\x87\xB0-\xBC] # AL
55 | \xEF\xB9[\xB0-\xB4\xB6-\xBF] # AL
56 | \xEF\xBA[\x80-\xBF] # AL
57 | \xEF\xBB[\x80-\xBC] # AL
58 | \xD9[\xA0-\xA9\xAB\xAC] # AN
61 include_once (dirname(__FILE__).'/tcpdf.php');
62 include_once (dirname(__FILE__).'/fpdi/fpdi.php');
64 class Cpdf extends FPDI {
66 function Cpdf($pageSize='A4', $lang=null, $pageOrientation='P')
68 $this->TCPDF($pageOrientation, 'pt', $pageSize);//, $uni, $enc);
69 $this->SetLang($lang);
70 $this->setPrintHeader(false);
71 $this->setPrintFooter(false);
72 $this->setPDFVersion("1.3");
73 $this->setAutoPageBreak(0);
74 $this->SetLineWidth(1);
78 Set lamguage for next report
80 function SetLang($code=null)
82 global $installed_languages, $dflt_lang, $path_to_root;
87 $lang = array_search_value($code, $installed_languages, 'code');
88 $_SESSION['get_text']->set_language($lang['code'], strtoupper($lang['encoding']));
89 $_SESSION['get_text']->add_domain($lang['code'], $path_to_root . "/lang");
91 // re-read translated sys names.
92 include($path_to_root.'/includes/sysnames.inc');
94 $l = array('a_meta_charset' => strtoupper($lang['encoding']),
95 'a_meta_dir' => @$lang['rtl'] ? 'rtl' : 'ltr',
96 'a_meta_language' => $code, 'w_page' => 'page');
98 if (!isset($l['a_meta_charset']))
99 $l = array('a_meta_charset' => 'ISO-8859-1', 'a_meta_dir' => 'ltr', 'a_meta_language' => 'en_GB', 'w_page' => 'page');
100 $enc = $l['a_meta_charset'];
101 $uni = ($enc == 'UTF-8' || $enc == 'GB2312' ? true : false);
103 ini_set("memory_limit", "48M");
105 $this->isunicode = $uni;
106 $this->setLanguageArray($l);
109 global $unicode, $unicode_mirror, $unicode_arlet, $laa_array, $diacritics;
110 include_once(dirname(__FILE__)."/unicode_data2.php");
112 $this->encoding = strtoupper($lang['encoding']);
114 $this->FontFamily = 'helvetica';
115 $this->FontStyle = '';
116 $this->FontSizePt = 12;
117 // $this->utf8Bidi(array(""));
121 // $fontname should be a standard PDF font (like 'times', 'helvetica' or 'courier')
122 // or one that's been installed on your system. An empty string can also be used
123 // which will retain the font currently in use.
125 // * a special case string:
128 // * or a case-insensitive string where each char represents a style choice
129 // and you can use more than one or none at all. Possible choices:
130 // * empty string: regular
134 // * D: line trough (aka "strike through")
135 function selectFont($fontname, $style = '')
137 // Parse the style - check for special cases, otherwise leave as-is
138 if ($style == 'italic')
140 elseif ($style == 'bold')
143 // Parse the fontname
145 $fontname = basename($fontname);
148 if ($this->isunicode)
150 switch ($this->l['a_meta_language'])
152 case "ar_EG" : $fontname = "ae_tholoth"; break;
153 case "zh_CN" : $fontname = "gbsn00lp"; break;
154 case "zh_TW" : $fontname = "chinese_traditional_cid0"; break;
155 default : $fontname = "dejavu"; break;
158 elseif ($this->encoding === "ISO-8859-2")
160 switch ($this->l['a_meta_language'])
162 default : $fontname = "freesans"; break;
165 elseif ($this->encoding === "ISO-8859-5")
167 switch ($this->l['a_meta_language'])
169 default : $fontname = "freesans5"; break;
172 // else use built-in adobe fonts helvetica.
174 $this->SetFont($fontname, $style);
190 function line($x1,$y1,$x2,$y2, $style = array())
192 parent::Line($x1, $this->h-$y1, $x2, $this->h-$y2, $style);
195 function rectangle($x, $y, $w, $h, $style='', $border_style=array(), $fill_color=array())
197 parent::Rect($x, $this->h-$y, $w, $h, $style, $border_style, $fill_color);
201 function addText($xb,$yb,$size,$txt)//,$angle=0,$wordSpaceAdjust=0)
203 if ($this->isunicode && $this->encoding != "UTF-8")
204 $txt = iconv($this->encoding, "UTF-8", $txt);
205 $this->SetFontSize($size);
206 $this->Text($xb, $this->h-$yb, $txt);
209 function addInfo($label,$value)
211 if (in_array($label, array( 'Title', 'Subject', 'Author', 'Creator'))) {
212 $seter = "Set{$label}";
213 $this->$seter($value);
217 function addJpegFromFile($img,$x,$y,$w=0,$h=0)
219 $this->Image($img, $x, $this->h-$y-$h, $w, $h);
222 function addPngFromFile($img,$x,$y,$w=0,$h=0)
224 $this->Image($img, $x, $this->h-$y-$h, $w, $h);
227 * Next Two functions are adopted from R&OS pdf class
231 * draw a part of an ellipse
233 function partEllipse($x0,$y0,$astart,$afinish,$r1,$r2=0,$angle=0,$nSeg=8)
235 $this->ellipse($x0,$y0,$r1,$r2,$angle,$nSeg,$astart,$afinish,0);
240 * note that the part and filled ellipse are just special cases of this function
242 * draws an ellipse in the current line style
243 * centered at $x0,$y0, radii $r1,$r2
244 * if $r2 is not set, then a circle is drawn
245 * nSeg is not allowed to be less than 2, as this will simply draw a line (and will even draw a
246 * pretty crappy shape at 2, as we are approximating with bezier curves.
248 function ellipse($x0,$y0,$r1,$r2=0,$angle=0,$nSeg=8,$astart=0,$afinish=360,$close=1,$fill=0)
250 parent::Ellipse($x0, $y0, $r1, $r2, $angle, $astart. $afinish, ($close?'C':''), "", "", $nSeg);
253 function Stream($fname='')
255 parent::Output($fname, 'I');
258 function calcTextWrap($txt, $width, $spacebreak=false)
262 $w = $this->GetStringWidth($txt);
263 if ($w > $width && $w > 0 && $width != 0)
266 $k = intval($n * $width / $w);
267 if ($k > 0 && $k < $n)
269 $txt2 = substr($txt, 0, $k);
270 if ($spacebreak && (($pos = strrpos($txt2, " ")) !== false))
272 $txt2 = substr($txt2, 0, $pos);
273 $ret = substr($txt, $pos+1);
276 $ret = substr($txt, $k);
279 return array($txt2, $ret);
282 function addTextWrap($xb, $yb, $w, $h, $txt, $align='left', $border=0, $fill=0, $link = NULL, $stretch = 1, $spacebreak=false)
287 if ($align == 'right')
289 elseif ($align == 'left')
291 elseif ($align == 'center')
293 elseif ($align == 'justify')
299 // If horizontal scaling was requested, check to see if we're trying to scale
300 // too much. If so, cut back string first and then scale it.
301 $maxScaleFactor = 1.4;
302 if ($stretch == 1 || $stretch == 2)
303 $txt = $this->calcTextWrap($txt, $w * $maxScaleFactor, $spacebreak);
304 // Wrap text if stretching isn't turned on
306 $txt = $this->calcTextWrap($txt, $w, $spacebreak);
309 $this->SetXY($xb, $this->h - $yb - $h);
310 $txt = parent::unhtmlentities($txt);
311 if ($this->isunicode && $this->encoding != "UTF-8")
312 $txt = iconv($this->encoding, "UTF-8", $txt);
313 $this->Cell($w, $h, $txt, $border, 0, $align, $fill, $link, $stretch);
317 function Text($x, $y, $txt, $stroke=0, $clip=false)
319 parent::Text($x,$y, parent::unhtmlentities($txt), $stroke, $clip);