MDL-49515 libraries: Update FPDI to 1.5.4
[moodle.git] / mod / assign / feedback / editpdf / fpdi / fpdi_bridge.php
1 <?php
2 //
3 //  FPDI - Version 1.5.4
4 //
5 //    Copyright 2004-2015 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 //
20 /**
21  * This file is used as a bridge between TCPDF or FPDF
22  * It will dynamically create the class extending the available
23  * class FPDF or TCPDF.
24  *
25  * This way it is possible to use FPDI for both FPDF and TCPDF with one FPDI version.
26  */
28 if (!class_exists('TCPDF', false)) {
29     /**
30      * Class fpdi_bridge
31      */
32     class fpdi_bridge extends FPDF
33     {
34         // empty body
35     }
37 } else {
39     /**
40      * Class fpdi_bridge
41      */
42     class fpdi_bridge extends TCPDF
43     {
44         /**
45          * Array of Tpl-Data
46          *
47          * @var array
48          */
49         protected $_tpls = array();
51         /**
52          * Name-prefix of Templates used in Resources-Dictionary
53          *
54          * @var string A String defining the Prefix used as Template-Object-Names. Have to begin with an /
55          */
56         public $tplPrefix = "/TPL";
58         /**
59          * Current Object Id.
60          *
61          * @var integer
62          */
63         protected $_currentObjId;
65         /**
66          * Return XObjects Dictionary.
67          *
68          * Overwritten to add additional XObjects to the resources dictionary of TCPDF
69          *
70          * @return string
71          */
72         protected function _getxobjectdict()
73         {
74             $out = parent::_getxobjectdict();
75             foreach ($this->_tpls as $tplIdx => $tpl) {
76                 $out .= sprintf('%s%d %d 0 R', $this->tplPrefix, $tplIdx, $tpl['n']);
77             }
79             return $out;
80         }
82         /**
83          * Writes a PDF value to the resulting document.
84          *
85          * Prepares the value for encryption of imported data by FPDI
86          *
87          * @param array $value
88          */
89         protected function _prepareValue(&$value)
90         {
91             switch ($value[0]) {
92                 case pdf_parser::TYPE_STRING:
93                     if ($this->encrypted) {
94                         $value[1] = $this->_unescape($value[1]);
95                         $value[1] = $this->_encrypt_data($this->_currentObjId, $value[1]);
96                         $value[1] = TCPDF_STATIC::_escape($value[1]);
97                     }
98                     break;
100                 case pdf_parser::TYPE_STREAM:
101                     if ($this->encrypted) {
102                         $value[2][1] = $this->_encrypt_data($this->_currentObjId, $value[2][1]);
103                         $value[1][1]['/Length'] = array(
104                             pdf_parser::TYPE_NUMERIC,
105                             strlen($value[2][1])
106                         );
107                     }
108                     break;
110                 case pdf_parser::TYPE_HEX:
111                     if ($this->encrypted) {
112                         $value[1] = $this->hex2str($value[1]);
113                         $value[1] = $this->_encrypt_data($this->_currentObjId, $value[1]);
115                         // remake hexstring of encrypted string
116                         $value[1] = $this->str2hex($value[1]);
117                     }
118                     break;
119             }
120         }
122         /**
123          * Un-escapes a PDF string
124          *
125          * @param string $s
126          * @return string
127          */
128         protected function _unescape($s)
129         {
130             $out = '';
131             for ($count = 0, $n = strlen($s); $count < $n; $count++) {
132                 if ($s[$count] != '\\' || $count == $n-1) {
133                     $out .= $s[$count];
134                 } else {
135                     switch ($s[++$count]) {
136                         case ')':
137                         case '(':
138                         case '\\':
139                             $out .= $s[$count];
140                             break;
141                         case 'f':
142                             $out .= chr(0x0C);
143                             break;
144                         case 'b':
145                             $out .= chr(0x08);
146                             break;
147                         case 't':
148                             $out .= chr(0x09);
149                             break;
150                         case 'r':
151                             $out .= chr(0x0D);
152                             break;
153                         case 'n':
154                             $out .= chr(0x0A);
155                             break;
156                         case "\r":
157                             if ($count != $n-1 && $s[$count+1] == "\n")
158                                 $count++;
159                             break;
160                         case "\n":
161                             break;
162                         default:
163                             // Octal-Values
164                             if (ord($s[$count]) >= ord('0') &&
165                                 ord($s[$count]) <= ord('9')) {
166                                 $oct = ''. $s[$count];
168                                 if (ord($s[$count+1]) >= ord('0') &&
169                                     ord($s[$count+1]) <= ord('9')) {
170                                     $oct .= $s[++$count];
172                                     if (ord($s[$count+1]) >= ord('0') &&
173                                         ord($s[$count+1]) <= ord('9')) {
174                                         $oct .= $s[++$count];
175                                     }
176                                 }
178                                 $out .= chr(octdec($oct));
179                             } else {
180                                 $out .= $s[$count];
181                             }
182                     }
183                 }
184             }
185             return $out;
186         }
188         /**
189          * Hexadecimal to string
190          *
191          * @param string $data
192          * @return string
193          */
194         public function hex2str($data)
195         {
196             $data = preg_replace('/[^0-9A-Fa-f]/', '', rtrim($data, '>'));
197             if ((strlen($data) % 2) == 1) {
198                 $data .= '0';
199             }
201             return pack('H*', $data);
202         }
204         /**
205          * String to hexadecimal
206          *
207          * @param string $str
208          * @return string
209          */
210         public function str2hex($str)
211         {
212             return current(unpack('H*', $str));
213         }
214     }