source: trunk/data/pdf/decoders/ASCII85Decode.php @ 17232

Revision 17232, 2.9 KB checked in by satou, 16 years ago (diff)

納品書発行機能 by Yammy (merge r17182)

Line 
1<?php
2//
3//  FPDI - Version 1.2
4//
5//    Copyright 2004-2007 Setasign - Jan Slabon
6//
7//  Licensed under the Apache License, Version 2.0 (the "License");
8//  you may not use this file except in compliance with the License.
9//  You may obtain a copy of the License at
10//
11//      http://www.apache.org/licenses/LICENSE-2.0
12//
13//  Unless required by applicable law or agreed to in writing, software
14//  distributed under the License is distributed on an "AS IS" BASIS,
15//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16//  See the License for the specific language governing permissions and
17//  limitations under the License.
18//
19
20if (!defined("ORD_z"))
21    define("ORD_z",ord('z'));
22if (!defined("ORD_exclmark"))
23    define("ORD_exclmark", ord('!'));
24if (!defined("ORD_u")) 
25    define("ORD_u", ord("u"));
26if (!defined("ORD_tilde"))
27    define("ORD_tilde", ord('~'));
28
29class ASCII85Decode {
30
31    function ASCII85Decode(&$fpdi) {
32        $this->fpdi =& $fpdi;
33    }
34
35
36    function decode($in) {
37        $out = "";
38        $state = 0;
39        $chn = null;
40       
41        $l = strlen($in);
42       
43        for ($k = 0; $k < $l; ++$k) {
44            $ch = ord($in[$k]) & 0xff;
45           
46            if ($ch == ORD_tilde) {
47                break;
48            }
49            if (preg_match("/^\s$/",chr($ch))) {
50                continue;
51            }
52            if ($ch == ORD_z && $state == 0) {
53                $out .= chr(0).chr(0).chr(0).chr(0);
54                continue;
55            }
56            if ($ch < ORD_exclmark || $ch > ORD_u) {
57                $this->fpdi->error("Illegal character in ASCII85Decode.");
58            }
59           
60            $chn[$state++] = $ch - ORD_exclmark;
61           
62            if ($state == 5) {
63                $state = 0;
64                $r = 0;
65                for ($j = 0; $j < 5; ++$j)
66                    $r = $r * 85 + $chn[$j];
67                $out .= chr($r >> 24);
68                $out .= chr($r >> 16);
69                $out .= chr($r >> 8);
70                $out .= chr($r);
71            }
72        }
73        $r = 0;
74       
75        if ($state == 1)
76            $this->fpdi->error("Illegal length in ASCII85Decode.");
77        if ($state == 2) {
78            $r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85;
79            $out .= chr($r >> 24);
80        }
81        else if ($state == 3) {
82            $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + ($chn[2]+1) * 85 * 85;
83            $out .= chr($r >> 24);
84            $out .= chr($r >> 16);
85        }
86        else if ($state == 4) {
87            $r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85  + $chn[2] * 85 * 85  + ($chn[3]+1) * 85 ;
88            $out .= chr($r >> 24);
89            $out .= chr($r >> 16);
90            $out .= chr($r >> 8);
91        }
92
93        return $out;
94    }
95}
96
97?>
Note: See TracBrowser for help on using the repository browser.