source: branches/version-2_12-dev/data/class/helper/SC_Helper_FPDI.php @ 21814

Revision 21814, 18.7 KB checked in by Seasoft, 12 years ago (diff)

#1794 (data/module/fpdi/japanese.php を本体ソースに取り込む)
開発者間での動作確認用 (呼び出し元は書き換えていません)

Line 
1<?php
2require DATA_REALDIR . 'module/fpdf/fpdf.php';
3require DATA_REALDIR . 'module/fpdi/fpdi.php';
4
5class SC_Helper_FPDI extends FPDI {
6    public static $SJIS_widths = array(
7        ' ' => 278, '!' => 299, '"' => 353, '#' => 614, '$' => 614, '%' => 721, '&' => 735, '\'' => 216,
8        '(' => 323, ')' => 323, '*' => 449, '+' => 529, ',' => 219, '-' => 306, '.' => 219, '/' => 453, '0' => 614, '1' => 614,
9        '2' => 614, '3' => 614, '4' => 614, '5' => 614, '6' => 614, '7' => 614, '8' => 614, '9' => 614, ':' => 219, ';' => 219,
10        '<' => 529, '=' => 529, '>' => 529, '?' => 486, '@' => 744, 'A' => 646, 'B' => 604, 'C' => 617, 'D' => 681, 'E' => 567,
11        'F' => 537, 'G' => 647, 'H' => 738, 'I' => 320, 'J' => 433, 'K' => 637, 'L' => 566, 'M' => 904, 'N' => 710, 'O' => 716,
12        'P' => 605, 'Q' => 716, 'R' => 623, 'S' => 517, 'T' => 601, 'U' => 690, 'V' => 668, 'W' => 990, 'X' => 681, 'Y' => 634,
13        'Z' => 578, '[' => 316, '\\' => 614, ']' => 316, '^' => 529, '_' => 500, '`' => 387, 'a' => 509, 'b' => 566, 'c' => 478,
14        'd' => 565, 'e' => 503, 'f' => 337, 'g' => 549, 'h' => 580, 'i' => 275, 'j' => 266, 'k' => 544, 'l' => 276, 'm' => 854,
15        'n' => 579, 'o' => 550, 'p' => 578, 'q' => 566, 'r' => 410, 's' => 444, 't' => 340, 'u' => 575, 'v' => 512, 'w' => 760,
16        'x' => 503, 'y' => 529, 'z' => 453, '{' => 326, '|' => 380, '}' => 326, '~' => 387,
17    );
18
19    function AddCIDFont($family, $style, $name, $cw, $CMap, $registry) {
20        $fontkey = strtolower($family).strtoupper($style);
21        if (isset($this->fonts[$fontkey])) {
22            $this->Error("CID font already added: $family $style");
23        }
24        $i = count($this->fonts) + 1;
25        $this->fonts[$fontkey] = array(
26            'i' => $i,
27            'type' => 'Type0',
28            'name' => $name,
29            'up' => -120,
30            'ut' => 40,
31            'cw' => $cw,
32            'CMap' => $CMap,
33            'registry' => $registry,
34        );
35    }
36
37    function AddCIDFonts($family, $name, $cw, $CMap, $registry) {
38        $this->AddCIDFont($family, '', $name, $cw, $CMap, $registry);
39        $this->AddCIDFont($family, 'B', $name . ',Bold', $cw, $CMap, $registry);
40        $this->AddCIDFont($family, 'I', $name . ',Italic', $cw, $CMap, $registry);
41        $this->AddCIDFont($family, 'BI', $name . ',BoldItalic', $cw, $CMap, $registry);
42    }
43
44    function AddSJISFont($family = 'SJIS') {
45        //Add SJIS font with proportional Latin
46        $name = 'KozMinPro-Regular-Acro';
47        $cw = SC_Helper_FPDI_Ex::$SJIS_widths;
48        $CMap = '90msp-RKSJ-H';
49        $registry = array('ordering' => 'Japan1', 'supplement' => 2);
50        $this->AddCIDFonts($family, $name, $cw, $CMap, $registry);
51    }
52
53    function AddSJIShwFont($family = 'SJIS-hw') {
54        //Add SJIS font with half-width Latin
55        $name = 'KozMinPro-Regular-Acro';
56        for ($i = 32; $i <= 126; $i++) {
57            $cw[chr($i)] = 500;
58        }
59        $CMap = '90ms-RKSJ-H';
60        $registry = array('ordering' => 'Japan1', 'supplement' => 2);
61        $this->AddCIDFonts($family, $name, $cw, $CMap, $registry);
62    }
63
64    function GetStringWidth($s) {
65        if ($this->CurrentFont['type']=='Type0') {
66            return $this->GetSJISStringWidth($s);
67        } else {
68            return parent::GetStringWidth($s);
69        }
70    }
71
72    function GetSJISStringWidth($s) {
73        //SJIS version of GetStringWidth()
74        $l = 0;
75        $cw =& $this->CurrentFont['cw'];
76        $nb = strlen($s);
77        $i = 0;
78        while ($i<$nb) {
79            $o = ord($s{$i});
80            if ($o < 128) {
81                //ASCII
82                $l += $cw[$s{$i}];
83                $i++;
84            }
85            elseif($o >= 161 && $o <= 223) {
86                //Half-width katakana
87                $l += 500;
88                $i++;
89            }
90            else {
91                //Full-width character
92                $l += 1000;
93                $i += 2;
94            }
95        }
96        return $l * $this->FontSize / 1000;
97    }
98
99    function MultiCell($w, $h, $txt, $border = 0, $align = 'L', $fill = 0, $ln = 2) {
100        if ($this->CurrentFont['type'] == 'Type0') {
101            $this->SJISMultiCell($w, $h, $txt, $border, $align, $fill, $ln);
102        } else {
103            parent::MultiCell($w, $h, $txt, $border, $align, $fill, $ln);
104        }
105    }
106
107    function SJISMultiCell($w, $h, $txt, $border = 0, $align = 'L', $fill = 0, $ln = 2) {
108        //Output text with automatic or explicit line breaks
109        $cw =& $this->CurrentFont['cw'];
110        if ($w == 0) {
111            $w = $this->w - $this->rMargin - $this->x;
112        }
113        $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
114        $s = str_replace("\r", '', $txt);
115        $nb = strlen($s);
116        if ($nb > 0 && $s[$nb - 1] == "\n") {
117            $nb--;
118        }
119        $b = 0;
120        if ($border) {
121            if ($border == 1) {
122                $border = 'LTRB';
123                $b = 'LRT';
124                $b2 = 'LR';
125            }
126            else {
127                $b2 = '';
128                if(is_int(strpos($border, 'L')))
129                    $b2 .= 'L';
130                if(is_int(strpos($border, 'R')))
131                    $b2 .= 'R';
132                $b = is_int(strpos($border, 'T')) ? $b2.'T' : $b2;
133            }
134        }
135        $sep =- 1;
136        $i = 0;
137        $j = 0;
138        $l = 0;
139        $nl = 1;
140        $this->rise_h = 0; //‚‚³ŒvŽZ—p
141
142        while ($i < $nb) {
143            //Get next character
144            $c = $s{$i};
145            $o = ord($c);
146            if ($o == 10) {
147                //Explicit line break
148                $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill);
149                $i++;
150                $sep = -1;
151                $j = $i;
152                $l = 0;
153                $nl++;
154                $this->rise_h += $h; //‚‚³ŒvŽZ—p
155                if ($border && $nl == 2) {
156                    $b=$b2;
157                }
158                continue;
159            }
160            if ($o < 128) {
161                //ASCII
162                $l += $cw[$c];
163                $n = 1;
164                if ($o == 32) {
165                    $sep=$i;
166                }
167            }
168            elseif($o >= 161 && $o <= 223) {
169                //Half-width katakana
170                $l += 500;
171                $n = 1;
172                $sep = $i;
173            }
174            else {
175                //Full-width character
176                $l += 1000;
177                $n = 2;
178                $sep = $i;
179            }
180            if ($l > $wmax) {
181                //Automatic line break
182                if ($sep == -1 || $i == $j) {
183                    if ($i == $j) {
184                        $i += $n;
185                    }
186                    $this->Cell($w, $h, substr($s, $j, $i - $j), $b, 2, $align, $fill);
187                }
188                else {
189                    $this->Cell($w, $h, substr($s, $j, $sep - $j), $b, 2, $align, $fill);
190                    $i = ($s[$sep] == ' ') ? $sep + 1 : $sep;
191                }
192                $this->rise_h += $h; //‚‚³ŒvŽZ—p
193                $sep = -1;
194                $j = $i;
195                $l = 0;
196                $nl++;
197                if ($border && $nl == 2) {
198                    $b = $b2;
199                }
200            }
201            else {
202                $i += $n;
203                if ($o >= 128) {
204                    $sep = $i;
205                }
206            }
207        }
208        //Last chunk
209        if ($border && is_int(strpos($border, 'B'))) {
210            $b .= 'B';
211        }
212        $this->Cell($w, $h, substr($s, $j, $i - $j), $b, $ln, $align, $fill);
213        $this->rise_h += $h; //‘‰Á•ª‚̍‚‚³‚ðŒvŽZ
214        //‰üs‚È‚µÝ’è‚©‚A‚‚³‚ª‹K’è‚̍‚‚³ˆÈã‚Å‚ ‚ê‚ÎYŽ²‚ðÝ’肵‚È‚¨‚·B
215        if ($ln == 0 && $h < $this->rise_h) {
216          $this->y = $this->y - $this->rise_h + $h;
217        }
218
219        //$this->x = $this->lMargin;
220    }
221
222    function Write($h, $txt, $link = '') {
223        if ($this->CurrentFont['type'] == 'Type0') {
224            $this->SJISWrite($h, $txt, $link);
225        }
226        else {
227            parent::Write($h, $txt, $link);
228        }
229    }
230
231    function SJISWrite($h, $txt, $link) {
232        //SJIS version of Write()
233        $cw =& $this->CurrentFont['cw'];
234        $w = $this->w - $this->rMargin - $this->x;
235        $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
236        $s = str_replace("\r", '', $txt);
237        $nb = strlen($s);
238        $sep = -1;
239        $i = 0;
240        $j = 0;
241        $l = 0;
242        $nl = 1;
243        while($i < $nb) {
244            //Get next character
245            $c = $s[$i];
246            $o = ord($c);
247            if ($o == 10) {
248                //Explicit line break
249                $this->Cell($w, $h, substr($s, $j, $i - $j), 0, 2, '', 0, $link);
250                $i++;
251                $sep = -1;
252                $j = $i;
253                $l = 0;
254                if ($nl == 1) {
255                    //Go to left margin
256                    $this->x = $this->lMargin;
257                    $w = $this->w - $this->rMargin - $this->x;
258                    $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
259                }
260                $nl++;
261                continue;
262            }
263            if ($o < 128) {
264                //ASCII
265                $l += $cw[$c];
266                $n = 1;
267                if ($o == 32) {
268                    $sep = $i;
269                }
270            }
271            elseif($o >= 161 && $o <= 223) {
272                //Half-width katakana
273                $l += 500;
274                $n = 1;
275                $sep = $i;
276            }
277            else {
278                //Full-width character
279                $l += 1000;
280                $n = 2;
281                $sep = $i;
282            }
283            if ($l > $wmax) {
284                //Automatic line break
285                if ($sep == -1 || $i == $j) {
286                    if ($this->x > $this->lMargin) {
287                        //Move to next line
288                        $this->x = $this->lMargin;
289                        $this->y += $h;
290                        $w = $this->w - $this->rMargin - $this->x;
291                        $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
292                        $i += $n;
293                        $nl++;
294                        continue;
295                    }
296                    if($i == $j)
297                        $i += $n;
298                    $this->Cell($w, $h, substr($s, $j, $i - $j), 0, 2, '', 0, $link);
299                }
300                else {
301                    $this->Cell($w, $h, substr($s, $j, $sep - $j), 0, 2, '', 0, $link);
302                    $i = ($s[$sep] == ' ') ? $sep + 1 : $sep;
303                }
304                $sep =- 1;
305                $j = $i;
306                $l = 0;
307                if ($nl == 1) {
308                    $this->x = $this->lMargin;
309                    $w = $this->w - $this->rMargin - $this->x;
310                    $wmax = ($w - 2 * $this->cMargin) * 1000 / $this->FontSize;
311                }
312                $nl++;
313            }
314            else {
315                $i += $n;
316                if ($o >= 128) {
317                    $sep = $i;
318                }
319            }
320        }
321        //Last chunk
322        if ($i != $j) {
323            $this->Cell($l / 1000 * $this->FontSize, $h, substr($s, $j, $i - $j), 0, 0, '', 0, $link);
324        }
325    }
326
327    function _putfonts() {
328        $nf = $this->n;
329        foreach ($this->diffs as $diff) {
330            //Encodings
331            $this->_newobj();
332            $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
333            $this->_out('endobj');
334        }
335        $mqr = get_magic_quotes_runtime();
336        set_magic_quotes_runtime(0);
337        foreach ($this->FontFiles as $file => $info) {
338            //Font file embedding
339            $this->_newobj();
340            $this->FontFiles[$file]['n'] = $this->n;
341            if (defined('FPDF_FONTPATH')) {
342                $file = FPDF_FONTPATH . $file;
343            }
344            $size = filesize($file);
345            if (!$size) {
346                $this->Error('Font file not found');
347            }
348            $this->_out('<</Length '.$size);
349            if (substr($file, -2) == '.z') {
350                $this->_out('/Filter /FlateDecode');
351            }
352            $this->_out('/Length1 '.$info['length1']);
353            if (isset($info['length2'])) {
354                $this->_out('/Length2 '.$info['length2'].' /Length3 0');
355            }
356            $this->_out('>>');
357            $f = fopen($file, 'rb');
358            $this->_putstream(fread($f, $size));
359            fclose($f);
360            $this->_out('endobj');
361        }
362        set_magic_quotes_runtime($mqr);
363        foreach ($this->fonts as $k => $font) {
364            //Font objects
365            $this->_newobj();
366            $this->fonts[$k]['n'] = $this->n;
367            $this->_out('<</Type /Font');
368            if ($font['type'] == 'Type0') {
369                $this->_putType0($font);
370            } else {
371                $name = $font['name'];
372                $this->_out('/BaseFont /'.$name);
373                if ($font['type'] == 'core') {
374                    //Standard font
375                    $this->_out('/Subtype /Type1');
376                    if ($name!='Symbol' && $name!='ZapfDingbats') {
377                        $this->_out('/Encoding /WinAnsiEncoding');
378                    }
379                }
380                else {
381                    //Additional font
382                    $this->_out('/Subtype /'.$font['type']);
383                    $this->_out('/FirstChar 32');
384                    $this->_out('/LastChar 255');
385                    $this->_out('/Widths '.($this->n+1).' 0 R');
386                    $this->_out('/FontDescriptor '.($this->n+2).' 0 R');
387                    if ($font['enc']) {
388                        if (isset($font['diff'])) {
389                            $this->_out('/Encoding '.($nf+$font['diff']).' 0 R');
390                        }
391                        else {
392                            $this->_out('/Encoding /WinAnsiEncoding');
393                        }
394                    }
395                }
396                $this->_out('>>');
397                $this->_out('endobj');
398                if ($font['type'] != 'core') {
399                    //Widths
400                    $this->_newobj();
401                    $cw =& $font['cw'];
402                    $s = '[';
403                    for ($i = 32; $i <= 255 ; $i++) {
404                        $s .= $cw[chr($i)] . ' ';
405                    }
406                    $this->_out($s . ']');
407                    $this->_out('endobj');
408                    //Descriptor
409                    $this->_newobj();
410                    $s = '<</Type /FontDescriptor /FontName /' . $name;
411                    foreach ($font['desc'] as $k => $v) {
412                        $s .= ' /' . $k . ' ' . $v;
413                    }
414                    $file = $font['file'];
415                    if ($file) {
416                        $s .= ' /FontFile' . ($font['type'] == 'Type1' ? '' : '2') . ' ' . $this->FontFiles[$file]['n'] . ' 0 R';
417                    }
418                    $this->_out($s . '>>');
419                    $this->_out('endobj');
420                }
421            }
422        }
423    }
424
425    function _putType0($font) {
426        //Type0
427        $this->_out('/Subtype /Type0');
428        $this->_out('/BaseFont /' . $font['name'] . '-' . $font['CMap']);
429        $this->_out('/Encoding /' . $font['CMap']);
430        $this->_out('/DescendantFonts [' . ($this->n + 1) . ' 0 R]');
431        $this->_out('>>');
432        $this->_out('endobj');
433        //CIDFont
434        $this->_newobj();
435        $this->_out('<</Type /Font');
436        $this->_out('/Subtype /CIDFontType0');
437        $this->_out('/BaseFont /' . $font['name']);
438        $this->_out('/CIDSystemInfo <</Registry (Adobe) /Ordering (' . $font['registry']['ordering'] . ') /Supplement ' . $font['registry']['supplement'] . '>>');
439        $this->_out('/FontDescriptor ' . ($this->n + 1) . ' 0 R');
440        $W = '/W [1 [';
441        foreach ($font['cw'] as $w) {
442            $W .= $w . ' ';
443        }
444        $this->_out($W . '] 231 325 500 631 [500] 326 389 500]');
445        $this->_out('>>');
446        $this->_out('endobj');
447        //Font descriptor
448        $this->_newobj();
449        $this->_out('<</Type /FontDescriptor');
450        $this->_out('/FontName /' . $font['name']);
451        $this->_out('/Flags 6');
452        $this->_out('/FontBBox [0 -200 1000 900]');
453        $this->_out('/ItalicAngle 0');
454        $this->_out('/Ascent 800');
455        $this->_out('/Descent -200');
456        $this->_out('/CapHeight 800');
457        $this->_out('/StemV 60');
458        $this->_out('>>');
459        $this->_out('endobj');
460    }
461
462    //Load data
463    function LoadData($file) {
464        //Read file lines
465        $lines = file($file);
466        $data = array();
467        foreach ($lines as $line)
468            $data[] = explode(';', chop($line));
469        return $data;
470    }
471
472    //Colored table
473    function FancyTable($header, $data, $w) {
474        //Colors, line width and bold font
475        $this->SetFillColor(216, 216, 216);
476        $this->SetTextColor(0);
477        $this->SetDrawColor(0, 0, 0);
478        $this->SetLineWidth(.3);
479        $this->SetFont('', 'B');
480        //Header
481        for ($i = 0; $i < count($header); $i++) {
482            $this->Cell($w[$i], 7, $header[$i], 1, 0, 'C', 1);
483        }
484        $this->Ln();
485        //Color and font restoration
486        $this->SetFillColor(235, 235, 235);
487        $this->SetTextColor(0);
488        $this->SetFont('');
489        //Data
490        $fill = 0;
491        foreach ($data as $row) {
492            $h = 4;
493            $i = 0;
494            $this->Cell(5, $h, '', 0, 0, '', 0, '');
495            foreach ($row as $col) {
496                if ($i > 3) {
497                    $i = 0;
498                }
499                if ($i != 0) {
500                    //$this->MultiCell($w[$i], $h, number_format($col), 1, 'R', $fill, 0);
501                    $this->MultiCell($w[$i], $h, $col, 1, 'R', $fill, 0);
502                } else {
503                    $this->MultiCell($w[$i], $h, $col, 1, 'L', $fill, 0);
504                }
505                $h = $this->rise_h;
506                $i++;
507            }
508            $this->Ln();
509            $fill =! $fill;
510
511        }
512        $this->Cell(5, $h, '', 0, 0, '', 0, '');
513        $this->Cell(array_sum($w), 0, '', 'T');
514    }
515
516    function Footer() {
517        //‰º’[‚©‚ç1.5 cm ‚Ɉړ®
518        $this->SetY(-15);
519        //ƒtƒHƒ“ƒg‚ðÝ’èB Arial italic 8
520        $this->SetFont('Arial', 'I', 8);
521        //Œ»Ý‚̃y[ƒW”ԍ†‚Æ‘ƒy[ƒW”‚ðo—Í
522        #$this->Cell(0, 10, ''.$this->PageNo().' / {nb}', 0, 0, 'C');
523    }
524
525}
Note: See TracBrowser for help on using the repository browser.