missing ;
[platal.git] / include / contacts.pdf.inc.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2004 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
22 define ('FPDF_FONTPATH', dirname(__FILE__).'/fonts/');
23 require_once('/usr/share/fpdf/fpdf.php');
24 require_once('xorg.varstream.inc.php');
25
26 class ContactsPDF extends FPDF
27 {
28 var $col = 0;
29 var $y0;
30
31 var $title = "Mes contacts sur Polytechnique.org";
32 var $broken = false;
33 var $error = false;
34
35 function ContactsPDF()
36 {
37 parent::FPDF();
38 $this->AddFont('Vera Sans', '', 'Vera.php');
39 $this->AddFont('Vera Sans', 'I', 'VeraIt.php');
40 $this->AddFont('Vera Sans', 'B', 'VeraBd.php');
41
42 $this->AddFont('Vera Mono', '', 'VeraMono.php');
43
44 $this->SetTitle($this->title);
45 $this->SetCreator('Site Polytechnique.org');
46 $this->AddPage();
47 }
48
49 function Output()
50 {
51 Header('Pragma: public');
52 parent::Output();
53 }
54
55 function Rotate($angle,$x=-1,$y=-1)
56 {
57 if ($x==-1) {
58 $x = $this->x;
59 }
60 if ($y==-1) {
61 $y=$this->y;
62 }
63 if ($this->angle != 0) {
64 $this->_out('Q');
65 }
66 $this->angle = $angle;
67 if ($angle != 0)
68 {
69 $angle*=M_PI/180;
70 $c = cos($angle);
71 $s = sin($angle);
72 $cx = $x*$this->k;
73 $cy = ($this->h-$y)*$this->k;
74 $this->_out(sprintf('q %.5f %.5f %.5f %.5f %.2f %.2f cm 1 0 0 1 %.2f %.2f cm',$c,$s,-$s,$c,$cx,$cy,-$cx,-$cy));
75 }
76 }
77
78 function Header()
79 {
80
81 $this->SetFont('Vera Sans', 'B', 20);
82 $this->SetTextColor(230);
83 $this->Rotate(45,55,190);
84 $this->Text(55,190,"informations limitées à un usage");
85 $this->Text(40,210,"strictement personnel et non commercial");
86 $this->Rotate(0);
87
88 $this->setLeftMargin(5);
89 $this->setRightMargin(5);
90 $this->SetFont('Vera Sans', 'B', 16);
91 $this->SetY(5);
92 $this->SetTextColor(51,102,153);
93 $this->SetDrawColor(102,153,204);
94 $this->SetLineWidth(0.2);
95 $this->SetFillColor(245, 248, 252);
96 $this->Cell(200, 10, $this->title, 1, 1, 'C', 1);
97 $this->Image(dirname(dirname(__FILE__)).'/htdocs/images/logo.png', 5, 5, 10, 10, 'png', 'https://www.polytechnique.org/');
98
99 $this->Ln(10);
100 $this->y0 = $this->GetY();
101 $this->ColSetup(false);
102 }
103
104 function Footer()
105 {
106 $this->setLeftMargin(5);
107 $this->setRightMargin(5);
108 $this->SetY(-15);
109 $this->SetFont('Vera Sans','I',8);
110 $this->SetTextColor(128);
111 $this->Cell(0, 10, 'Page '.$this->PageNo(), 0, 0, 'C');
112 $this->Cell(0, 10, '(en date du '.strftime('%d %B %Y').')', 0, 0, 'R');
113 }
114
115 function ColSetup($col)
116 {
117 $this->col = $col;
118 $x = 10 + $this->col * 100;
119 $this->SetLeftMargin($x);
120 $this->SetRightMargin(120 - $x);
121 $this->SetX($x);
122 $this->SetY($this->y0);
123 }
124
125 function NextCol()
126 {
127 $this->ColSetup(1 - $this->col);
128 if ($this->col == 0) {
129 $this->AddPage();
130 }
131 }
132
133 function AcceptPageBreak()
134 {
135 $this->broken = true;
136 }
137
138 function Space($w=0.1, $h=0.5)
139 {
140 $x = $this->getX();
141 $y = $this->getY();
142 $this->SetLineWidth($w);
143 $this->Line($x, $y, $x+90, $y);
144 $this->Ln($h);
145 }
146
147 function TableRow($l, $r, $font = 'Sans')
148 {
149 $this->SetFont('Vera Sans', 'B', 8);
150 $y = $this->getY();
151 $x = $this->getX();
152 $this->MultiCell(25, 4, $l, '', 1);
153 $y1 = $this->getY();
154
155 $this->SetFont('Vera '.$font, '', 8);
156 $this->setY($y);
157 $first = 1;
158
159 $this->setX($x+25);
160 $this->MultiCell(65, 4, $r, '', 1);
161
162 $this->setY(max($y1, $this->getY())+0.5);
163 $this->setX($x);
164 }
165
166 function Address($a)
167 {
168 $l = "adresse\n";
169 if ($a['active']) {
170 $l .= 'actuelle';
171 } elseif ($a['secondaire']) {
172 $l .= 'secondaire';
173 } else {
174 $l .= 'principale';
175 }
176
177 $r = '';
178 $r = trim("$r\n".$a['adr1']);
179 $r = trim("$r\n".$a['adr2']);
180 $r = trim("$r\n".$a['adr3']);
181 $r = trim("$r\n".trim($a['postcode'].' '.$a['city']));
182
183 $this->TableRow($l, $r);
184
185 if ($a['tel']) {
186 $this->TableRow('Téléphone', $a['tel'], 'Mono');
187 }
188 if ($a['fax']) {
189 $this->TableRow('Fax', $a['fax'], 'Mono');
190 }
191 }
192
193 function AddressPro($a)
194 {
195 if ($a['entreprise']) {
196 $this->TableRow('Entreprise', $a['entreprise']);
197 }
198
199 if ($a['adr1'] || $a['adr2'] || $a['adr3'] || $a['postcode'] || $a['city']) {
200 $r = '';
201 $r = trim("$r\n".$a['adr1']);
202 $r = trim("$r\n".$a['adr2']);
203 $r = trim("$r\n".$a['adr3']);
204 $r = trim("$r\n".trim($a['postcode'].' '.$a['city']));
205 $this->TableRow('adresse pro', $r);
206 }
207
208 if ($a['tel']) {
209 $this->TableRow('Téléphone', $a['tel'], 'Mono');
210 }
211 if ($a['fax']) {
212 $this->TableRow('Fax', $a['fax'], 'Mono');
213 }
214 }
215
216 function Error()
217 {
218 $this->error = true;
219 }
220
221 function wordwrap($text, $maxwidth = 90) {
222 $text = trim($text);
223 if ($text==='') { return 0; }
224 $space = $this->GetStringWidth(' ');
225 $lines = explode("\n", $text);
226 $text = '';
227 $count = 0;
228
229 foreach ($lines as $line) {
230 $words = preg_split('/ +/', $line);
231 $width = 0;
232
233 foreach ($words as $word) {
234 $wordwidth = $this->GetStringWidth($word);
235 if ($width + $wordwidth <= $maxwidth) {
236 $width += $wordwidth + $space;
237 $text .= $word.' ';
238 } else {
239 $width = $wordwidth + $space;
240 $text = rtrim($text)."\n".$word.' ';
241 $count++;
242 }
243 }
244 $text = rtrim($text)."\n";
245 $count++;
246 }
247 $text = rtrim($text);
248 return $count;
249 }
250
251 function AddContact($x, $wp = true)
252 {
253 global $globals;
254 /* infamous hack :
255 1- we store the current state.
256 2- at the end, we find out if we triggered the page break,
257 -> no ? ok
258 -> yes ? then we have to create a col, and add the contact again.
259 */
260 $old = $this;
261
262 $this->SetFont('Vera Sans', '', 10);
263 $this->SetDrawColor(0);
264 $this->SetFillColor(245, 248, 252);
265 $this->SetLineWidth(0.4);
266
267 $nom = $x['prenom'].' '.($x['nom_usage'] ? "{$x['nom_usage']} ({$x['nom']})" : $x['nom'])." ({$x['promo']})";
268 $ok = false;
269
270 if ($wp) {
271 $res = $globals->xdb->query("SELECT * FROM photo WHERE attachmime IN ('jpeg','png') AND uid={?}", $x['user_id']);
272 if ($i = $res->numRows()) {
273 $old2 = $this;
274 $photo = $res->fetchOneAssoc();
275 $width = $photo['x'] * 20/$photo['y'];
276 $GLOBALS["p{$x['user_id']}"] = $photo['attach'];
277
278 $_x = $this->getX();
279 $_y = $this->getY();
280 $this->Cell(0, 20, '', '', 0, '', 1);
281 $this->Image("var://p{$x['user_id']}", $_x, $_y, $width, 20, $photo['attachmime']);
282
283 if ($this->error) {
284 $this = $old2;
285 } else {
286 $this->setX($_x);
287 $this->Cell($width, 20, '', "T");
288 $h = 20 / $this->wordwrap($nom, 90-$width);
289 $this->MultiCell(0, $h, $nom, 'T', 'C');
290 $ok = true;
291 }
292 }
293 }
294 if (!$ok) {
295 $this->MultiCell(0, 6, $nom, "T", 'C', 1);
296 }
297
298 if ($x['mobile']) {
299 $this->Space();
300 $this->TableRow('mobile', $x['mobile'], 'Mono');
301 }
302
303 foreach ($x['adr'] as $a) {
304 $this->Space();
305 $this->Address($a);
306 }
307
308 foreach ($x['adr_pro'] as $a) {
309 if ( ! ($a['entreprise'] || $a['tel'] || $a['fax']
310 || $a['adr1'] || $a['adr2'] || $a['adr3'] || $a['postcode'] || $a['city']) )
311 {
312 continue;
313 }
314 $this->Space();
315 $this->AddressPro($a);
316 }
317
318 $this->Space(0.4, 5);
319
320 if ($this->broken) {
321 $old->NextCol();
322 $old->AddContact($x, $wp);
323 $this = $old;
324 }
325 }
326
327 }
328
329 ?>