Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 1441
Línea 1... Línea 1...
1
<?php
1
<?php
2
//============================================================+
2
//============================================================+
3
// File name   : tcpdf_fonts.php
3
// File name   : tcpdf_fonts.php
4
// Version     : 1.1.0
4
// Version     : 1.1.1
5
// Begin       : 2008-01-01
5
// Begin       : 2008-01-01
6
// Last Update : 2014-12-10
6
// Last Update : 2024-12-23
7
// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
7
// Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
8
// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
8
// License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
9
// -------------------------------------------------------------------
9
// -------------------------------------------------------------------
10
// Copyright (C) 2008-2014 Nicola Asuni - Tecnick.com LTD
10
// Copyright (C) 2008-2025 Nicola Asuni - Tecnick.com LTD
11
//
11
//
12
// This file is part of TCPDF software library.
12
// This file is part of TCPDF software library.
13
//
13
//
14
// TCPDF is free software: you can redistribute it and/or modify it
14
// TCPDF is free software: you can redistribute it and/or modify it
15
// under the terms of the GNU Lesser General Public License as
15
// under the terms of the GNU Lesser General Public License as
Línea 40... Línea 40...
40
 
40
 
41
/**
41
/**
42
 * @class TCPDF_FONTS
42
 * @class TCPDF_FONTS
43
 * Font methods for TCPDF library.
43
 * Font methods for TCPDF library.
44
 * @package com.tecnick.tcpdf
44
 * @package com.tecnick.tcpdf
45
 * @version 1.1.0
45
 * @version 1.1.1
46
 * @author Nicola Asuni - info@tecnick.com
46
 * @author Nicola Asuni - info@tecnick.com
47
 */
47
 */
Línea 48... Línea 48...
48
class TCPDF_FONTS {
48
class TCPDF_FONTS {
Línea 189... Línea 189...
189
			$fp = TCPDF_STATIC::fopenLocal($outpath.$fmetric['file'], 'wb');
189
			$fp = TCPDF_STATIC::fopenLocal($outpath.$fmetric['file'], 'wb');
190
			fwrite($fp, gzcompress($data));
190
			fwrite($fp, gzcompress($data));
191
			fclose($fp);
191
			fclose($fp);
192
			// get font info
192
			// get font info
193
			$fmetric['Flags'] = $flags;
193
			$fmetric['Flags'] = $flags;
194
			preg_match ('#/FullName[\s]*\(([^\)]*)#', $font, $matches);
194
			preg_match ('#/FullName[\s]*+\(([^\)]*+)#', $font, $matches);
195
			$fmetric['name'] = preg_replace('/[^a-zA-Z0-9_\-]/', '', $matches[1]);
195
			$fmetric['name'] = preg_replace('/[^a-zA-Z0-9_\-]/', '', $matches[1]);
196
			preg_match('#/FontBBox[\s]*{([^}]*)#', $font, $matches);
196
			preg_match('#/FontBBox[\s]*+{([^}]*+)#', $font, $matches);
197
			$fmetric['bbox'] = trim($matches[1]);
197
			$rawbvl = explode(' ', trim($matches[1]));
-
 
198
			$bvl = [(int) $rawbvl[0], (int) $rawbvl[1], (int) $rawbvl[2], (int) $rawbvl[3]];
198
			$bv = explode(' ', $fmetric['bbox']);
199
			$fmetric['bbox'] = implode(' ', $bvl);
199
			$fmetric['Ascent'] = intval($bv[3]);
200
			$fmetric['Ascent'] = $bvl[3];
200
			$fmetric['Descent'] = intval($bv[1]);
201
			$fmetric['Descent'] = $bvl[1];
201
			preg_match('#/ItalicAngle[\s]*([0-9\+\-]*)#', $font, $matches);
202
			preg_match('#/ItalicAngle[\s]*+([0-9\+\-]*+)#', $font, $matches);
202
			$fmetric['italicAngle'] = intval($matches[1]);
203
			$fmetric['italicAngle'] = intval($matches[1]);
203
			if ($fmetric['italicAngle'] != 0) {
204
			if ($fmetric['italicAngle'] != 0) {
204
				$fmetric['Flags'] |= 64;
205
				$fmetric['Flags'] |= 64;
205
			}
206
			}
206
			preg_match('#/UnderlinePosition[\s]*([0-9\+\-]*)#', $font, $matches);
207
			preg_match('#/UnderlinePosition[\s]*+([0-9\+\-]*+)#', $font, $matches);
207
			$fmetric['underlinePosition'] = intval($matches[1]);
208
			$fmetric['underlinePosition'] = intval($matches[1]);
208
			preg_match('#/UnderlineThickness[\s]*([0-9\+\-]*)#', $font, $matches);
209
			preg_match('#/UnderlineThickness[\s]*+([0-9\+\-]*+)#', $font, $matches);
209
			$fmetric['underlineThickness'] = intval($matches[1]);
210
			$fmetric['underlineThickness'] = intval($matches[1]);
210
			preg_match('#/isFixedPitch[\s]*([^\s]*)#', $font, $matches);
211
			preg_match('#/isFixedPitch[\s]*+([^\s]*+)#', $font, $matches);
211
			if ($matches[1] == 'true') {
212
			if ($matches[1] == 'true') {
212
				$fmetric['Flags'] |= 1;
213
				$fmetric['Flags'] |= 1;
213
			}
214
			}
214
			// get internal map
215
			// get internal map
215
			$imap = array();
216
			$imap = array();
216
			if (preg_match_all('#dup[\s]([0-9]+)[\s]*/([^\s]*)[\s]put#sU', $font, $fmap, PREG_SET_ORDER) > 0) {
217
			if (preg_match_all('#dup[\s]([0-9]+)[\s]*+/([^\s]*+)[\s]put#sU', $font, $fmap, PREG_SET_ORDER) > 0) {
217
				foreach ($fmap as $v) {
218
				foreach ($fmap as $v) {
218
					$imap[$v[2]] = $v[1];
219
					$imap[$v[2]] = $v[1];
219
				}
220
				}
220
			}
221
			}
221
			// decrypt eexec encrypted part
222
			// decrypt eexec encrypted part
Línea 227... Línea 228...
227
			for ($i = 0; $i < $elen; ++$i) {
228
			for ($i = 0; $i < $elen; ++$i) {
228
				$chr = ord($encrypted[$i]);
229
				$chr = ord($encrypted[$i]);
229
				$eplain .= chr($chr ^ ($r >> 8));
230
				$eplain .= chr($chr ^ ($r >> 8));
230
				$r = ((($chr + $r) * $c1 + $c2) % 65536);
231
				$r = ((($chr + $r) * $c1 + $c2) % 65536);
231
			}
232
			}
232
			if (preg_match('#/ForceBold[\s]*([^\s]*)#', $eplain, $matches) > 0) {
233
			if (preg_match('#/ForceBold[\s]*+([^\s]*+)#', $eplain, $matches) > 0) {
233
				if ($matches[1] == 'true') {
234
				if ($matches[1] == 'true') {
234
					$fmetric['Flags'] |= 0x40000;
235
					$fmetric['Flags'] |= 0x40000;
235
				}
236
				}
236
			}
237
			}
237
			if (preg_match('#/StdVW[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
238
			if (preg_match('#/StdVW[\s]*+\[([^\]]*+)#', $eplain, $matches) > 0) {
238
				$fmetric['StemV'] = intval($matches[1]);
239
				$fmetric['StemV'] = intval($matches[1]);
239
			} else {
240
			} else {
240
				$fmetric['StemV'] = 70;
241
				$fmetric['StemV'] = 70;
241
			}
242
			}
242
			if (preg_match('#/StdHW[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
243
			if (preg_match('#/StdHW[\s]*+\[([^\]]*+)#', $eplain, $matches) > 0) {
243
				$fmetric['StemH'] = intval($matches[1]);
244
				$fmetric['StemH'] = intval($matches[1]);
244
			} else {
245
			} else {
245
				$fmetric['StemH'] = 30;
246
				$fmetric['StemH'] = 30;
246
			}
247
			}
247
			if (preg_match('#/BlueValues[\s]*\[([^\]]*)#', $eplain, $matches) > 0) {
248
			if (preg_match('#/BlueValues[\s]*+\[([^\]]*+)#', $eplain, $matches) > 0) {
248
				$bv = explode(' ', $matches[1]);
249
				$bv = explode(' ', $matches[1]);
249
				if (count($bv) >= 6) {
250
				if (count($bv) >= 6) {
250
					$v1 = intval($bv[2]);
251
					$v1 = intval($bv[2]);
251
					$v2 = intval($bv[4]);
252
					$v2 = intval($bv[4]);
252
					if ($v1 <= $v2) {
253
					if ($v1 <= $v2) {
Línea 263... Línea 264...
263
			} else {
264
			} else {
264
				$fmetric['XHeight'] = 450;
265
				$fmetric['XHeight'] = 450;
265
				$fmetric['CapHeight'] = 700;
266
				$fmetric['CapHeight'] = 700;
266
			}
267
			}
267
			// get the number of random bytes at the beginning of charstrings
268
			// get the number of random bytes at the beginning of charstrings
268
			if (preg_match('#/lenIV[\s]*([0-9]*)#', $eplain, $matches) > 0) {
269
			if (preg_match('#/lenIV[\s]*+([\d]*+)#', $eplain, $matches) > 0) {
269
				$lenIV = intval($matches[1]);
270
				$lenIV = intval($matches[1]);
270
			} else {
271
			} else {
271
				$lenIV = 4;
272
				$lenIV = 4;
272
			}
273
			}
273
			$fmetric['Leading'] = 0;
274
			$fmetric['Leading'] = 0;
274
			// get charstring data
275
			// get charstring data
275
			$eplain = substr($eplain, (strpos($eplain, '/CharStrings') + 1));
276
			$eplain = substr($eplain, (strpos($eplain, '/CharStrings') + 1));
276
			preg_match_all('#/([A-Za-z0-9\.]*)[\s][0-9]+[\s]RD[\s](.*)[\s]ND#sU', $eplain, $matches, PREG_SET_ORDER);
277
			preg_match_all('#/([A-Za-z0-9\.]*+)[\s][0-9]+[\s]RD[\s](.*)[\s]ND#sU', $eplain, $matches, PREG_SET_ORDER);
277
			if (!empty($enc) AND isset(TCPDF_FONT_DATA::$encmap[$enc])) {
278
			if (!empty($enc) AND isset(TCPDF_FONT_DATA::$encmap[$enc])) {
278
				$enc_map = TCPDF_FONT_DATA::$encmap[$enc];
279
				$enc_map = TCPDF_FONT_DATA::$encmap[$enc];
279
			} else {
280
			} else {
280
				$enc_map = false;
281
				$enc_map = false;
281
			}
282
			}
Línea 1778... Línea 1779...
1778
	 * @since 4.5.037 (2009-04-07)
1779
	 * @since 4.5.037 (2009-04-07)
1779
	 * @public static
1780
	 * @public static
1780
	 */
1781
	 */
1781
	public static function UTF8ArrayToUniArray($ta, $isunicode=true) {
1782
	public static function UTF8ArrayToUniArray($ta, $isunicode=true) {
1782
		if ($isunicode) {
1783
		if ($isunicode) {
1783
			return array_map(get_called_class().'::unichrUnicode', $ta);
1784
			return array_map(static::class.'::unichrUnicode', $ta);
1784
		}
1785
		}
1785
		return array_map(get_called_class().'::unichrASCII', $ta);
1786
		return array_map(static::class.'::unichrASCII', $ta);
1786
	}
1787
	}
Línea 1787... Línea 1788...
1787
 
1788
 
1788
	/**
1789
	/**
1789
	 * Extract a slice of the $strarr array and return it as string.
1790
	 * Extract a slice of the $strarr array and return it as string.
Línea 2000... Línea 2001...
2000
	public static function UTF8StringToArray($str, $isunicode, &$currentfont) {
2001
	public static function UTF8StringToArray($str, $isunicode, &$currentfont) {
2001
		$str = is_null($str) ? '' : $str;
2002
		$str = is_null($str) ? '' : $str;
2002
		if ($isunicode) {
2003
		if ($isunicode) {
2003
			// requires PCRE unicode support turned on
2004
			// requires PCRE unicode support turned on
2004
			$chars = TCPDF_STATIC::pregSplit('//','u', $str, -1, PREG_SPLIT_NO_EMPTY);
2005
			$chars = TCPDF_STATIC::pregSplit('//','u', $str, -1, PREG_SPLIT_NO_EMPTY);
2005
			$carr = array_map(get_called_class().'::uniord', $chars);
2006
			$carr = array_map(static::class.'::uniord', $chars);
2006
		} else {
2007
		} else {
2007
			$chars = str_split($str);
2008
			$chars = str_split($str);
2008
			$carr = array_map('ord', $chars);
2009
			$carr = array_map('ord', $chars);
2009
		}
2010
		}
2010
		if (is_array($currentfont['subsetchars']) && is_array($carr)) {
2011
		if (is_array($currentfont['subsetchars']) && is_array($carr)) {