ÿØÿà JFIF    ÿÛ „  ( %!1"%)+...383-7(-.+  -%%--------+------------/----------------------------ÿÀ  ¶" ÿÄ     ÿÄ @    !1AQaq‘¡"±ÁÑð2’BRráS‚ñ3b¢CT²Ò #cÿÄ    ÿÄ '   1!AQ2a"‘±#ÿÚ   ? ò(/p‘—–¢·,M|¯G»R£üešT. ôŸEoCFñ‡ 4ÔkåóxR|µÁ¨ÓDà!Ç´µ˜‡p ÍQ‹§!þž^õWsŒy  åÁ§$á«%ºq˜™JyyË0y«^Ϗ -3ÃÏËÈ£Æ\P’ä„s&•‹Üs üô'àWt¹pñCp$bÚF`·7.^)¾!)ÒÙ˜–ÅÏš^h¾ø³·ìe±ŒaeÖ—Í,e=B}Jéߦ$$½—šÙÜCC¯¶è8β–Åkèwx LÉngT±æ¹£Ócœ¿Í/©Éÿ ‰ÚCÒ­mq;Tt¶–}0"zÖPcd1š­¤tˆ„ÐÓâqú[™öUCŠ2޿د­É(¸ßúçšmW,Ò ºf‹Ån™ÄLêÁ8üÁkÁ€L¥ÍuJ1œôrÂSŒÓöt!7EUíïb)AËi¬â-ÙHk8òÁiXYwÅ)O^"ÇØriÛô{»wRUKÙÏÚlÓ¬€‚’שT ] ªb—ÊîKC^×M“xùäñz¬zJ× {4[¹M'IÆeH1LCWÕ]œûº WDæà°OÅ‚¹c²ÞuA–rL`HšpCez‡V’— Ž‚Ë„–ñ­'µR0ÕÖ=À:±G»C\nÆÉ5*¢ †3šhQ4ýÒi$Õ1"Ü]¢p-q3zcQ$ªö¨¥æf›‘»´ÝÚHá„e²JÇ–iÊ:·à¬Øc5Åk»Laª*wi [0Ówk ¦a¦0Õ²ÅÅ‚T¸’³q:Æ<¹ú Ò˜Æ}2VE•Ѐp¡Ô3Úº …h³^LJºçì¥Ánó|˜ÖˆÎˆ+« ¦dø‘Mº–d\ªDðÛ„Ì×LÝ——Ð9Ç|•FèçVm™¨€™3õS–9Äå¢<̉Ìm¢±`·º˜&Z²ž Ë®D«¶»6™‰©­HÈ Àá«h­i³04æ’hxœi3ï¨(ÓL·†‹¶ËpŒ ƒÜÒ? :õdsÀ –3æÓ·Üjâ¬9—]8n¼&]I F£¼…ì–—Œ0v°LǐÅfÛ2TÖ’aµ˜N@ÖBSÏ^à´4-±°b×nÈÈœÆD=KdŒø…ÄÈK,›ÖR§fjü$^ÔÎ!„6^ s:Üun\ôkCÞò÷<—Lúl Í›G¹ÀPá¼Nc¡šÒ…ÙWͳœ±vÊáЄ×9‹P‰cEØ‘™›µŸP<×g1 º©Ø¬wiÁ^l5× I/';Ë+´Z‡ÓÄFÕp[Èð’ HÄ ó 9¬Dl4“é±Ï”V=^Hð;žLädÉa‚°Ë,#/Ž~²BÔÛ QãñQtIeórVB,ÏÂf‹4#Μc‹É3ZIÖ Œ¢¥·üxa‡Ãçè„jŠ[5 Ä!U?,3žÎ×…ðdÓ÷háŠA‰ìÄ4÷ÃÜZÃE{‰®+W\ZÍE[‰»µk»MÝ­`¢©†˜ÃV‹-f¢¡†¢a«eŠ%«Y¨©q%jâd,Ôq`) ¤¦…šˆ ¦E>0Ùb²t–Ÿ  ÷jsςҒKÈcø(é›;k(’#ôŒQ ™C> õ³M9óºÆµ¤çâ;uÀ)5>RÔ¸fÓ~Ȧ—’-$fe«"FâUˆÊwµPÏu w+"åÉó¨6s™Û9(À¨ù©hE°½†n`m~“@©›p!Vkhµ Á1šbEqqÊ@ºèl›2 –Yã%‘‚hÛ{a¶‡ÅÞM²¬çL34®Çl]®‹ŽØŒm'RÜe35æöˆ­Á­ cP9šeÁköo´L³Ì=p8]”‡B¶,šº|ɏdzXˆØk*ÇÚ{#ñ‰pã(€¶‡9ý'šÜ³½¯kƒ†Â’ëSOƒ•Å®H6+a¢µˆ‹Y¨b˜b+XˆÖ!°u!¢"µˆˆn2ˆ Å0Ä`Å Ô®c(ÓÜGº•Ä»Œ âWî%q.áÐÄ÷î%umÍ£+ÜQ,Vn¦-GphU¸¢X­&,Gt ·K¢ÅÅ·¥RÄÊÉbKn N­R2g$VµÕó Qr#–ÓZUÏð0ÎtÙÀœz ëöo“Îk¯n„T°"SÞ+³/…€½"ižãO%Í%&Δâ‘ËØ´IˆÓ°Ë‰ÞM3.™yçÁzit›`4C`k¢¼á!álÄï sÂ[×!¤l¾æo"ƒIÔ'@ªu)3›ô®“@Z à¾] üœ'‡4¸PÞkÁ-qÄH‰ÓÍBd´ÿ —¹°ÄA&ÊUC„öz‚‚RæŠtf¬>˜ÑidšEçÑL÷áý¡V±h§­c¿¥¨ƒ@g¼…Ýö^ÞËc.ž„æ“I[ ª+·zÐÒÚ,½Ð»¶€C›7jk$๖€Ž¾ÅÙpp¶ÍþéΤ ½ØÎŒq ñpæžÅ¥#Øâ49ÃÂK^MYV“,¶Éz_òæ:…;Õ«¦I3âJ£¤û5$7Èxün\â]Êe¯(Ÿ&Ž‹¶2<6Ćf× æ¢ƱqWı[(ÙÂŽç‚T7¨@ÈÉÍß‚ïÙ"&3TYlGށ†)†#5ŠA©^T2ÆÁ†)©†©†¤yGXÁ†©"†)©¼ÅV WS†#©]R–r‹q5ÕbâWþBh¯u+ªÅÄ×ü„nÑ^êkªÁj‰jeœWˆÕÕ`µDµ2Ì+Ä µDµµ5Ô{¤Þ0RF’H÷AÛ<ÊÁ§ ƈæ0Ñ£ê4 öÚµ[¬/1²€â<-¬šö²r×0o×w ´xÐÒË„ g01¬„åEM蛇Ã\6µE›‘fÙO k÷CºnÓ1`iîÒ² áÂ!ÑLÄÿ ³¬\õ*:M=Ç»c‹2[‰ØsÕLò\ŒK L^™üÄN\¶#» Ç\……ßïIœÉ$¸ÎñÍ®ÔHÇ Ûí/´>Li”„†g^$ 7NÍÑÑ2M2ªNg=k½Ð}Ÿl6‡ —JWˆ”ÞéT·+µ¦üÂFè¢Vs6ýÆ4»2+2IÝ9ô9®ÇGÙÇ1+Ä8;*Õ§ž½D*îÑWÚçá3Ma¤·ˆ¥t}š²Ü…Q+Æüµ8HíS”üxGéÁˆ¦Ël„éÈ 5 µÄƒ6äÜ(kIš¯S†fÖ&¸®×v|Äyˆ*禌Éù@7-®Ä[]ÎÖ¿ê`º…=:…žJVnݳvðÖKE¼‚ »mà ÷f®:Ë ™–4rð¡4` ܹçž~‹C=œ…¾Ïj|VDtK.ƒ"9 Ï ­–éXá³6WÒïIL-Ї Ç . /** * pdflib.php - Moodle PDF library * * We currently use the TCPDF library by Nicola Asuni. * * The default location for fonts that are included with TCPDF is * lib/tcpdf/fonts/. If PDF_CUSTOM_FONT_PATH exists, this directory * will be used instead of lib/tcpdf/fonts/, the default location is * $CFG->dataroot.'/fonts/'. * * You should always copy all fonts from lib/tcpdf/fonts/ to your * PDF_CUSTOM_FONT_PATH and then add extra fonts. Alternatively * you may download all TCPDF fonts from http://www.tcpdf.org/download.php * and extract them to PDF_CUSTOM_FONT_PATH directory. * * You can specify your own default font family in config.php * by defining PDF_DEFAULT_FONT constant there. * * If you want to add True Type fonts such as "Arial Unicode MS", * you need to create a simple script and then execute it, it should add * new file to your fonts directory: * * libdir . '/pdflib.php'); * TCPDF_FONTS::addTTFfont('/full_path_to/ARIALUNI.TTF', 'TrueTypeUnicode'); * * This script will convert the TTF file to format compatible with TCPDF. * * Please note you need to have appropriate license to use the font files on your server! * * Example usage: * * $doc = new pdf; * $doc->setPrintHeader(false); * $doc->setPrintFooter(false); * $doc->AddPage(); * $doc->Write(5, 'Hello World!'); * $doc->Output(); * * * @package moodlecore * @copyright Vy-Shane Sin Fat * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); if (!defined('PDF_CUSTOM_FONT_PATH')) { /** Defines the site-specific location of fonts. */ define('PDF_CUSTOM_FONT_PATH', $CFG->dataroot.'/fonts/'); } if (!defined('PDF_DEFAULT_FONT')) { /** Default font to be used. */ define('PDF_DEFAULT_FONT', 'FreeSerif'); } /** tell tcpdf it is configured here instead of in its own config file */ define('K_TCPDF_EXTERNAL_CONFIG', 1); // The configuration constants needed by tcpdf follow /** * Init K_PATH_FONTS and PDF_FONT_NAME_MAIN constant. * * Unfortunately this hack is necessary because the constants need * to be defined before inclusion of the tcpdf.php file. */ function tcpdf_init_k_font_path() { global $CFG; $defaultfonts = $CFG->dirroot.'/lib/tcpdf/fonts/'; if (!defined('K_PATH_FONTS')) { if (is_dir(PDF_CUSTOM_FONT_PATH)) { // NOTE: // There used to be an option to have just one file and having it set as default // but that does not make sense any more because add-ons using standard fonts // would fail very badly, also font families consist of multiple php files for // regular, bold, italic, etc. // Check for some standard font files if present and if not do not use the custom path. $somestandardfiles = array('courier', 'helvetica', 'times', 'symbol', 'zapfdingbats', 'freeserif', 'freesans'); $missing = false; foreach ($somestandardfiles as $file) { if (!file_exists(PDF_CUSTOM_FONT_PATH . $file . '.php')) { $missing = true; break; } } if ($missing) { define('K_PATH_FONTS', $defaultfonts); } else { define('K_PATH_FONTS', PDF_CUSTOM_FONT_PATH); } } else { define('K_PATH_FONTS', $defaultfonts); } } if (!defined('PDF_FONT_NAME_MAIN')) { define('PDF_FONT_NAME_MAIN', strtolower(PDF_DEFAULT_FONT)); } } tcpdf_init_k_font_path(); /** tcpdf installation path */ define('K_PATH_MAIN', $CFG->dirroot.'/lib/tcpdf/'); /** URL path to tcpdf installation folder */ define('K_PATH_URL', $CFG->wwwroot . '/lib/tcpdf/'); /** cache directory for temporary files (full path) */ define('K_PATH_CACHE', $CFG->cachedir . '/tcpdf/'); /** images directory */ define('K_PATH_IMAGES', $CFG->dirroot . '/'); /** blank image */ define('K_BLANK_IMAGE', K_PATH_IMAGES . 'pix/spacer.gif'); /** height of cell repect font height */ define('K_CELL_HEIGHT_RATIO', 1.25); /** reduction factor for small font */ define('K_SMALL_RATIO', 2/3); /** Throw exceptions from errors so they can be caught and recovered from. */ define('K_TCPDF_THROW_EXCEPTION_ERROR', true); require_once(__DIR__.'/tcpdf/tcpdf.php'); /** * Wrapper class that extends TCPDF (lib/tcpdf/tcpdf.php). * Moodle customisations are done here. * * @package moodlecore * @copyright Vy-Shane Sin Fat * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class pdf extends TCPDF { /** * Class constructor * * See the parent class documentation for the parameters info. */ public function __construct($orientation='P', $unit='mm', $format='A4', $unicode=true, $encoding='UTF-8') { make_cache_directory('tcpdf'); parent::__construct($orientation, $unit, $format, $unicode, $encoding); // These values replace TCPDF's own config/lang definitions. $this->l['w_page'] = get_string('page'); $this->l['a_meta_language'] = get_html_lang_attribute_value(current_language()); $this->l['a_meta_charset'] = 'UTF-8'; $this->l['a_meta_dir'] = get_string('thisdirection', 'langconfig'); } /** * Send the document to a given destination: string, local file or browser. * In the last case, the plug-in may be used (if present) or a download ("Save as" dialog box) may be forced.
* The method first calls Close() if necessary to terminate the document. * @param $name (string) The name of the file when saved. Note that special characters are removed and blanks characters are replaced with the underscore character. * @param $dest (string) Destination where to send the document. It can take one of the following values: * @public * @since Moodle 1.0 * @see Close() */ public function Output($name='doc.pdf', $dest='I') { $olddebug = error_reporting(0); $result = parent::output($name, $dest); error_reporting($olddebug); return $result; } /** * Is this font family one of core fonts? * @param string $fontfamily * @return bool */ public function is_core_font_family($fontfamily) { return isset($this->CoreFonts[$fontfamily]); } /** * Returns list of font families and types of fonts. * * @return array multidimensional array with font families as keys and B, I, BI and N as values. */ public function get_font_families() { $families = array(); foreach ($this->fontlist as $font) { if (strpos($font, 'uni2cid') === 0) { // This is not an font file. continue; } if (strpos($font, 'cid0') === 0) { // These do not seem to work with utf-8, better ignore them for now. continue; } if (substr($font, -2) === 'bi') { $family = substr($font, 0, -2); if (in_array($family, $this->fontlist)) { $families[$family]['BI'] = 'BI'; continue; } } if (substr($font, -1) === 'i') { $family = substr($font, 0, -1); if (in_array($family, $this->fontlist)) { $families[$family]['I'] = 'I'; continue; } } if (substr($font, -1) === 'b') { $family = substr($font, 0, -1); if (in_array($family, $this->fontlist)) { $families[$family]['B'] = 'B'; continue; } } // This must be a Family or incomplete set of fonts present. $families[$font]['R'] = 'R'; } // Sort everything consistently. ksort($families); foreach ($families as $k => $v) { krsort($families[$k]); } return $families; } /** * Get font list from config. * @return array|string[] */ public function get_export_fontlist(): array { global $CFG; $fontlist = []; if (!empty($CFG->pdfexportfont)) { if (is_array($CFG->pdfexportfont)) { $fontlist = $CFG->pdfexportfont; } else { $fontlist[$CFG->pdfexportfont] = $CFG->pdfexportfont; } } // Verify fonts. $availablefonts = $this->get_font_families(); foreach ($fontlist as $key => $value) { if (empty($availablefonts[$key])) { unset($fontlist[$key]); } } if (empty($fontlist)) { // Default font if there is no value set in CFG. $fontlist = ['freesans' => 'FreeSans']; } return $fontlist; } }