commiting uncommited changes on live site
[weblabels.fsf.org.git] / crm.fsf.org / 20131203 / files / sites / all / modules-new / civicrm / packages / FPDI / fpdi_bridge.php
1 <?php
2 //
3 // FPDI - Version 1.5
4 //
5 // Copyright 2004-2014 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
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 */
27
28 if (!class_exists('TCPDF', false)) {
29 /**
30 * Class fpdi_bridge
31 */
32 class fpdi_bridge extends FPDF
33 {
34 // empty body
35 }
36
37 } else {
38
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();
50
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";
57
58 /**
59 * Current Object Id.
60 *
61 * @var integer
62 */
63 protected $_currentObjId;
64
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 }
78
79 return $out;
80 }
81
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;
99
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;
109
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]);
114
115 // remake hexstring of encrypted string
116 $value[1] = $this->str2hex($value[1]);
117 }
118 break;
119 }
120 }
121
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];
167
168 if (ord($s[$count+1]) >= ord('0') &&
169 ord($s[$count+1]) <= ord('9')) {
170 $oct .= $s[++$count];
171
172 if (ord($s[$count+1]) >= ord('0') &&
173 ord($s[$count+1]) <= ord('9')) {
174 $oct .= $s[++$count];
175 }
176 }
177
178 $out .= chr(octdec($oct));
179 } else {
180 $out .= $s[$count];
181 }
182 }
183 }
184 }
185 return $out;
186 }
187
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 }
200
201 return pack('H*', $data);
202 }
203
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 }
215 }