PDF_Japanese   F
last analyzed

Complexity

Total Complexity 82

Size/Duplication

Total Lines 447
Duplicated Lines 39.82 %

Coupling/Cohesion

Components 2
Dependencies 1

Importance

Changes 0
Metric Value
dl 178
loc 447
rs 2
c 0
b 0
f 0
wmc 82
lcom 2
cbo 1

12 Methods

Rating   Name   Duplication   Size   Complexity  
A AddCIDFont() 0 8 2
A AddCIDFonts() 7 7 1
A AddSJISFont() 0 9 1
A AddSJIShwFont() 10 10 2
A GetStringWidth() 7 7 2
A GetSJISStringWidth() 0 32 5
A MultiCell() 7 7 2
F SJISMultiCell() 22 109 27
A Write() 7 7 2
D SJISWrite() 22 105 17
F _putfonts() 96 96 19
A _putType0() 0 36 2

How to fix   Duplicated Code    Complexity   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

Complex Class

 Tip:   Before tackling complexity, make sure that you eliminate any duplication first. This often can reduce the size of classes significantly.

Complex classes like PDF_Japanese often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes. You can also have a look at the cohesion graph to spot any un-connected, or weakly-connected components.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use PDF_Japanese, and based on these observations, apply Extract Interface, too.

1
<?php
2
if (!defined('XOOPS_ROOT_PATH')) {
3
  die('XOOPS root path not defined');
4
}
5
6
require('fpdf.php');
7
8
$SJIS_widths=array(' '=>278,'!'=>299,'"'=>353,'#'=>614,'$'=>614,'%'=>721,'&'=>735,'\''=>216,
9
  '('=>323,')'=>323,'*'=>449,'+'=>529,','=>219,'-'=>306,'.'=>219,'/'=>453,'0'=>614,'1'=>614,
10
  '2'=>614,'3'=>614,'4'=>614,'5'=>614,'6'=>614,'7'=>614,'8'=>614,'9'=>614,':'=>219,';'=>219,
11
  '<'=>529,'='=>529,'>'=>529,'?'=>486,'@'=>744,'A'=>646,'B'=>604,'C'=>617,'D'=>681,'E'=>567,
12
  'F'=>537,'G'=>647,'H'=>738,'I'=>320,'J'=>433,'K'=>637,'L'=>566,'M'=>904,'N'=>710,'O'=>716,
13
  'P'=>605,'Q'=>716,'R'=>623,'S'=>517,'T'=>601,'U'=>690,'V'=>668,'W'=>990,'X'=>681,'Y'=>634,
14
  'Z'=>578,'['=>316,'\\'=>614,']'=>316,'^'=>529,'_'=>500,'`'=>387,'a'=>509,'b'=>566,'c'=>478,
15
  'd'=>565,'e'=>503,'f'=>337,'g'=>549,'h'=>580,'i'=>275,'j'=>266,'k'=>544,'l'=>276,'m'=>854,
16
  'n'=>579,'o'=>550,'p'=>578,'q'=>566,'r'=>410,'s'=>444,'t'=>340,'u'=>575,'v'=>512,'w'=>760,
17
  'x'=>503,'y'=>529,'z'=>453,'{'=>326,'|'=>380,'}'=>326,'~'=>387);
18
19
class PDF_Japanese extends FPDF
20
{
21
function AddCIDFont($family,$style,$name,$cw,$CMap,$registry)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
22
{
23
  $fontkey=strtolower($family).strtoupper($style);
24
  if(isset($this->fonts[$fontkey]))
25
    $this->Error("CID font already added: $family $style");
26
  $i=count($this->fonts)+1;
27
  $this->fonts[$fontkey]=array('i'=>$i,'type'=>'Type0','name'=>$name,'up'=>-120,'ut'=>40,'cw'=>$cw,'CMap'=>$CMap,'registry'=>$registry);
28
}
29
30 View Code Duplication
function AddCIDFonts($family,$name,$cw,$CMap,$registry)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
31
{
32
  $this->AddCIDFont($family,'',$name,$cw,$CMap,$registry);
33
  $this->AddCIDFont($family,'B',$name.',Bold',$cw,$CMap,$registry);
34
  $this->AddCIDFont($family,'I',$name.',Italic',$cw,$CMap,$registry);
35
  $this->AddCIDFont($family,'BI',$name.',BoldItalic',$cw,$CMap,$registry);
36
}
37
38
function AddSJISFont($family='SJIS')
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
39
{
40
  //Add SJIS font with proportional Latin
41
  $name='KozMinPro-Regular-Acro';
42
  $cw=$GLOBALS['SJIS_widths'];
43
  $CMap='90msp-RKSJ-H';
44
  $registry=array('ordering'=>'Japan1','supplement'=>2);
45
  $this->AddCIDFonts($family,$name,$cw,$CMap,$registry);
46
}
47
48 View Code Duplication
function AddSJIShwFont($family='SJIS-hw')
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
49
{
50
  //Add SJIS font with half-width Latin
51
  $name='KozMinPro-Regular-Acro';
52
  for($i=32;$i<=126;$i++)
53
    $cw[chr($i)]=500;
0 ignored issues
show
Coding Style Comprehensibility introduced by
$cw was never initialized. Although not strictly required by PHP, it is generally a good practice to add $cw = array(); before regardless.

Adding an explicit array definition is generally preferable to implicit array definition as it guarantees a stable state of the code.

Let’s take a look at an example:

foreach ($collection as $item) {
    $myArray['foo'] = $item->getFoo();

    if ($item->hasBar()) {
        $myArray['bar'] = $item->getBar();
    }

    // do something with $myArray
}

As you can see in this example, the array $myArray is initialized the first time when the foreach loop is entered. You can also see that the value of the bar key is only written conditionally; thus, its value might result from a previous iteration.

This might or might not be intended. To make your intention clear, your code more readible and to avoid accidental bugs, we recommend to add an explicit initialization $myArray = array() either outside or inside the foreach loop.

Loading history...
54
  $CMap='90ms-RKSJ-H';
55
  $registry=array('ordering'=>'Japan1','supplement'=>2);
56
  $this->AddCIDFonts($family,$name,$cw,$CMap,$registry);
0 ignored issues
show
Bug introduced by
The variable $cw does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
57
}
58
59 View Code Duplication
function GetStringWidth($s)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
60
{
61
  if($this->CurrentFont['type']=='Type0')
62
    return $this->GetSJISStringWidth($s);
63
  else
64
    return parent::GetStringWidth($s);
65
}
66
67
function GetSJISStringWidth($s)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
68
{
69
  //SJIS version of GetStringWidth()
70
  $l=0;
71
  $cw=&$this->CurrentFont['cw'];
72
  $nb=strlen($s);
73
  $i=0;
74
  while($i<$nb)
75
  {
76
    $o=ord($s{$i});
77
    if($o<128)
78
    {
79
      //ASCII
80
      $l+=$cw[$s{$i}];
81
      $i++;
82
    }
83
    elseif($o>=161 and $o<=223)
84
    {
85
      //Half-width katakana
86
      $l+=500;
87
      $i++;
88
    }
89
    else
90
    {
91
      //Full-width character
92
      $l+=1000;
93
      $i+=2;
94
    }
95
  }
96
97
  return $l*$this->FontSize/1000;
98
}
99
100 View Code Duplication
function MultiCell($w,$h,$txt,$border=0,$align='L',$fill=0)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
101
{
102
  if($this->CurrentFont['type']=='Type0')
103
    $this->SJISMultiCell($w,$h,$txt,$border,$align,$fill);
104
  else
105
    parent::MultiCell($w,$h,$txt,$border,$align,$fill);
106
}
107
108
function SJISMultiCell($w,$h,$txt,$border=0,$align='L',$fill=0)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
109
{
110
  //Output text with automatic or explicit line breaks
111
  $cw=&$this->CurrentFont['cw'];
112
  if($w==0)
113
    $w=$this->w-$this->rMargin-$this->x;
114
  $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
115
  $s=str_replace("\r",'',$txt);
116
  $nb=strlen($s);
117
  if($nb>0 and $s{$nb-1}=="\n")
118
    $nb--;
119
  $b=0;
120
  if($border)
121
  {
122
    if($border==1)
123
    {
124
      $border='LTRB';
125
      $b='LRT';
126
      $b2='LR';
127
    }
128
    else
129
    {
130
      $b2='';
131
      if(is_int(strpos($border,'L')))
132
        $b2.='L';
133
      if(is_int(strpos($border,'R')))
134
        $b2.='R';
135
      $b=is_int(strpos($border,'T')) ? $b2.'T' : $b2;
136
    }
137
  }
138
  $sep=-1;
139
  $i=0;
140
  $j=0;
141
  $l=0;
142
  $nl=1;
143
  while($i<$nb)
144
  {
145
    //Get next character
146
    $c=$s{$i};
147
    $o=ord($c);
148
    if($o==10)
149
    {
150
      //Explicit line break
151
      $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
152
      $i++;
153
      $sep=-1;
154
      $j=$i;
155
      $l=0;
156
      $nl++;
157
      if($border and $nl==2)
158
        $b=$b2;
0 ignored issues
show
Bug introduced by
The variable $b2 does not seem to be defined for all execution paths leading up to this point.

If you define a variable conditionally, it can happen that it is not defined for all execution paths.

Let’s take a look at an example:

function myFunction($a) {
    switch ($a) {
        case 'foo':
            $x = 1;
            break;

        case 'bar':
            $x = 2;
            break;
    }

    // $x is potentially undefined here.
    echo $x;
}

In the above example, the variable $x is defined if you pass “foo” or “bar” as argument for $a. However, since the switch statement has no default case statement, if you pass any other value, the variable $x would be undefined.

Available Fixes

  1. Check for existence of the variable explicitly:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        if (isset($x)) { // Make sure it's always set.
            echo $x;
        }
    }
    
  2. Define a default value for the variable:

    function myFunction($a) {
        $x = ''; // Set a default which gets overridden for certain paths.
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
        }
    
        echo $x;
    }
    
  3. Add a value for the missing path:

    function myFunction($a) {
        switch ($a) {
            case 'foo':
                $x = 1;
                break;
    
            case 'bar':
                $x = 2;
                break;
    
            // We add support for the missing case.
            default:
                $x = '';
                break;
        }
    
        echo $x;
    }
    
Loading history...
159
      continue;
160
    }
161 View Code Duplication
    if($o<128)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
162
    {
163
      //ASCII
164
      $l+=$cw[$c];
165
      $n=1;
166
      if($o==32)
167
        $sep=$i;
168
    }
169
    elseif($o>=161 and $o<=223)
170
    {
171
      //Half-width katakana
172
      $l+=500;
173
      $n=1;
174
      $sep=$i;
175
    }
176
    else
177
    {
178
      //Full-width character
179
      $l+=1000;
180
      $n=2;
181
      $sep=$i;
182
    }
183
    if($l>$wmax)
184
    {
185
      //Automatic line break
186
      if($sep==-1 or $i==$j)
187
      {
188
        if($i==$j)
189
          $i+=$n;
190
        $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
191
      }
192
      else
193
      {
194
        $this->Cell($w,$h,substr($s,$j,$sep-$j),$b,2,$align,$fill);
195
        $i=($s[$sep]==' ') ? $sep+1 : $sep;
196
      }
197
      $sep=-1;
198
      $j=$i;
199
      $l=0;
200
      $nl++;
201
      if($border and $nl==2)
202
        $b=$b2;
203
    }
204
    else
205
    {
206
      $i+=$n;
207
      if($o>=128)
208
        $sep=$i;
209
    }
210
  }
211
  //Last chunk
212
  if($border and is_int(strpos($border,'B')))
213
    $b.='B';
214
  $this->Cell($w,$h,substr($s,$j,$i-$j),$b,2,$align,$fill);
215
  $this->x=$this->lMargin;
216
}
217
218 View Code Duplication
function Write($h,$txt,$link='')
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
219
{
220
  if($this->CurrentFont['type']=='Type0')
221
    $this->SJISWrite($h,$txt,$link);
222
  else
223
    parent::Write($h,$txt,$link);
224
}
225
226
function SJISWrite($h,$txt,$link)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
227
{
228
  //SJIS version of Write()
229
  $cw=&$this->CurrentFont['cw'];
230
  $w=$this->w-$this->rMargin-$this->x;
231
  $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
232
  $s=str_replace("\r",'',$txt);
233
  $nb=strlen($s);
234
  $sep=-1;
235
  $i=0;
236
  $j=0;
237
  $l=0;
238
  $nl=1;
239
  while($i<$nb)
240
  {
241
    //Get next character
242
    $c=$s{$i};
243
    $o=ord($c);
244
    if($o==10)
245
    {
246
      //Explicit line break
247
      $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
248
      $i++;
249
      $sep=-1;
250
      $j=$i;
251
      $l=0;
252
      if($nl==1)
253
      {
254
        //Go to left margin
255
        $this->x=$this->lMargin;
256
        $w=$this->w-$this->rMargin-$this->x;
257
        $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
258
      }
259
      $nl++;
260
      continue;
261
    }
262 View Code Duplication
    if($o<128)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
263
    {
264
      //ASCII
265
      $l+=$cw[$c];
266
      $n=1;
267
      if($o==32)
268
        $sep=$i;
269
    }
270
    elseif($o>=161 and $o<=223)
271
    {
272
      //Half-width katakana
273
      $l+=500;
274
      $n=1;
275
      $sep=$i;
276
    }
277
    else
278
    {
279
      //Full-width character
280
      $l+=1000;
281
      $n=2;
282
      $sep=$i;
283
    }
284
    if($l>$wmax)
285
    {
286
      //Automatic line break
287
      if($sep==-1 or $i==$j)
288
      {
289
        if($this->x>$this->lMargin)
290
        {
291
          //Move to next line
292
          $this->x=$this->lMargin;
293
          $this->y+=$h;
294
          $w=$this->w-$this->rMargin-$this->x;
295
          $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
296
          $i+=$n;
297
          $nl++;
298
          continue;
299
        }
300
        if($i==$j)
301
          $i+=$n;
302
        $this->Cell($w,$h,substr($s,$j,$i-$j),0,2,'',0,$link);
303
      }
304
      else
305
      {
306
        $this->Cell($w,$h,substr($s,$j,$sep-$j),0,2,'',0,$link);
307
        $i=($s[$sep]==' ') ? $sep+1 : $sep;
308
      }
309
      $sep=-1;
310
      $j=$i;
311
      $l=0;
312
      if($nl==1)
313
      {
314
        $this->x=$this->lMargin;
315
        $w=$this->w-$this->rMargin-$this->x;
316
        $wmax=($w-2*$this->cMargin)*1000/$this->FontSize;
317
      }
318
      $nl++;
319
    }
320
    else
321
    {
322
      $i+=$n;
323
      if($o>=128)
324
        $sep=$i;
325
    }
326
  }
327
  //Last chunk
328
  if($i!=$j)
329
    $this->Cell($l/1000*$this->FontSize,$h,substr($s,$j,$i-$j),0,0,'',0,$link);
330
}
331
332 View Code Duplication
function _putfonts()
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
333
{
334
  $nf=$this->n;
335
  foreach($this->diffs as $diff)
336
  {
337
    //Encodings
338
    $this->_newobj();
339
    $this->_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['.$diff.']>>');
340
    $this->_out('endobj');
341
  }
342
  $mqr=get_magic_quotes_runtime();
343
  set_magic_quotes_runtime(0);
344
  foreach($this->FontFiles as $file=>$info)
345
  {
346
    //Font file embedding
347
    $this->_newobj();
348
    $this->FontFiles[$file]['n']=$this->n;
349
    if(defined('FPDF_FONTPATH'))
350
      $file=FPDF_FONTPATH.$file;
351
    $size=filesize($file);
352
    if(!$size)
353
      $this->Error('Font file not found');
354
    $this->_out('<</Length '.$size);
355
    if(substr($file,-2)=='.z')
356
      $this->_out('/Filter /FlateDecode');
357
    $this->_out('/Length1 '.$info['length1']);
358
    if(isset($info['length2']))
359
      $this->_out('/Length2 '.$info['length2'].' /Length3 0');
360
    $this->_out('>>');
361
    $f=fopen($file,'rb');
362
    $this->_putstream(fread($f,$size));
363
    fclose($f);
364
    $this->_out('endobj');
365
  }
366
  set_magic_quotes_runtime($mqr);
367
  foreach($this->fonts as $k=>$font)
368
  {
369
    //Font objects
370
    $this->_newobj();
371
    $this->fonts[$k]['n']=$this->n;
372
    $this->_out('<</Type /Font');
373
    if($font['type']=='Type0')
374
      $this->_putType0($font);
375
    else
376
    {
377
      $name=$font['name'];
378
      $this->_out('/BaseFont /'.$name);
379
      if($font['type']=='core')
380
      {
381
        //Standard font
382
        $this->_out('/Subtype /Type1');
383
        if($name!='Symbol' and $name!='ZapfDingbats')
384
          $this->_out('/Encoding /WinAnsiEncoding');
385
      }
386
      else
387
      {
388
        //Additional font
389
        $this->_out('/Subtype /'.$font['type']);
390
        $this->_out('/FirstChar 32');
391
        $this->_out('/LastChar 255');
392
        $this->_out('/Widths '.($this->n+1).' 0 R');
393
        $this->_out('/FontDescriptor '.($this->n+2).' 0 R');
394
        if($font['enc'])
395
        {
396
          if(isset($font['diff']))
397
            $this->_out('/Encoding '.($nf+$font['diff']).' 0 R');
398
          else
399
            $this->_out('/Encoding /WinAnsiEncoding');
400
        }
401
      }
402
      $this->_out('>>');
403
      $this->_out('endobj');
404
      if($font['type']!='core')
405
      {
406
        //Widths
407
        $this->_newobj();
408
        $cw=&$font['cw'];
409
        $s='[';
410
        for($i=32;$i<=255;$i++)
411
          $s.=$cw[chr($i)].' ';
412
        $this->_out($s.']');
413
        $this->_out('endobj');
414
        //Descriptor
415
        $this->_newobj();
416
        $s='<</Type /FontDescriptor /FontName /'.$name;
417
        foreach($font['desc'] as $k=>$v)
418
          $s.=' /'.$k.' '.$v;
419
        $file=$font['file'];
420
        if($file)
421
          $s.=' /FontFile'.($font['type']=='Type1' ? '' : '2').' '.$this->FontFiles[$file]['n'].' 0 R';
422
        $this->_out($s.'>>');
423
        $this->_out('endobj');
424
      }
425
    }
426
  }
427
}
428
429
function _putType0($font)
0 ignored issues
show
Best Practice introduced by
It is generally recommended to explicitly declare the visibility for methods.

Adding explicit visibility (private, protected, or public) is generally recommend to communicate to other developers how, and from where this method is intended to be used.

Loading history...
430
{
431
  //Type0
432
  $this->_out('/Subtype /Type0');
433
  $this->_out('/BaseFont /'.$font['name'].'-'.$font['CMap']);
434
  $this->_out('/Encoding /'.$font['CMap']);
435
  $this->_out('/DescendantFonts ['.($this->n+1).' 0 R]');
436
  $this->_out('>>');
437
  $this->_out('endobj');
438
  //CIDFont
439
  $this->_newobj();
440
  $this->_out('<</Type /Font');
441
  $this->_out('/Subtype /CIDFontType0');
442
  $this->_out('/BaseFont /'.$font['name']);
443
  $this->_out('/CIDSystemInfo <</Registry (Adobe) /Ordering ('.$font['registry']['ordering'].') /Supplement '.$font['registry']['supplement'].'>>');
444
  $this->_out('/FontDescriptor '.($this->n+1).' 0 R');
445
  $W='/W [1 [';
446
  foreach($font['cw'] as $w)
447
    $W.=$w.' ';
448
  $this->_out($W.'] 231 325 500 631 [500] 326 389 500]');
449
  $this->_out('>>');
450
  $this->_out('endobj');
451
  //Font descriptor
452
  $this->_newobj();
453
  $this->_out('<</Type /FontDescriptor');
454
  $this->_out('/FontName /'.$font['name']);
455
  $this->_out('/Flags 6');
456
  $this->_out('/FontBBox [0 -200 1000 900]');
457
  $this->_out('/ItalicAngle 0');
458
  $this->_out('/Ascent 800');
459
  $this->_out('/Descent -200');
460
  $this->_out('/CapHeight 800');
461
  $this->_out('/StemV 60');
462
  $this->_out('>>');
463
  $this->_out('endobj');
464
}
465
}
466