PageRenderTime 29ms CodeModel.GetById 12ms RepoModel.GetById 1ms app.codeStats 0ms

/applications/pm/helpers/mpdf/mpdf.php

https://bitbucket.org/amitholkar/zenfile-18-05
PHP | 1691 lines | 1362 code | 233 blank | 96 comment | 102 complexity | 865bd907e000db6f8764f3d1b3f65a04 MD5 | raw file
  1. <?php
  2. // ******************************************************************************
  3. // Software: mPDF, Unicode-HTML Free PDF generator *
  4. // Version: 5.3 based on *
  5. // FPDF by Olivier PLATHEY *
  6. // HTML2FPDF by Renato Coelho *
  7. // Date: 2011-07-21 *
  8. // Author: Ian Back <ianb@bpm1.com> *
  9. // License: GPL *
  10. // *
  11. // Changes: See changelog.txt *
  12. // ******************************************************************************
  13. define('mPDF_VERSION','5.3');
  14. define('AUTOFONT_CJK',1);
  15. define('AUTOFONT_THAIVIET',2);
  16. define('AUTOFONT_RTL',4);
  17. define('AUTOFONT_INDIC',8);
  18. define('AUTOFONT_ALL',15);
  19. define('_BORDER_ALL',15);
  20. define('_BORDER_TOP',8);
  21. define('_BORDER_RIGHT',4);
  22. define('_BORDER_BOTTOM',2);
  23. define('_BORDER_LEFT',1);
  24. if (!defined('_MPDF_PATH')) define('_MPDF_PATH', dirname(preg_replace('/\\\\/','/',__FILE__)) . '/');
  25. if (!defined('_MPDF_URI')) define('_MPDF_URI',_MPDF_PATH);
  26. require_once(_MPDF_PATH.'includes/functions.php');
  27. require_once(_MPDF_PATH.'config_cp.php');
  28. if (!defined('_JPGRAPH_PATH')) define("_JPGRAPH_PATH", _MPDF_PATH.'jpgraph/');
  29. if (!defined('_MPDF_TEMP_PATH')) define("_MPDF_TEMP_PATH", _MPDF_PATH.'tmp/');
  30. if (!defined('_MPDF_TTFONTPATH')) { define('_MPDF_TTFONTPATH',_MPDF_PATH.'ttfonts/'); }
  31. if (!defined('_MPDF_TTFONTDATAPATH')) { define('_MPDF_TTFONTDATAPATH',_MPDF_PATH.'ttfontdata/'); }
  32. $errorlevel=error_reporting();
  33. $errorlevel=error_reporting($errorlevel & ~E_NOTICE);
  34. //error_reporting(E_ALL);
  35. if(function_exists("date_default_timezone_set") and function_exists("date_default_timezone_get"))
  36. @date_default_timezone_set(@date_default_timezone_get());
  37. if (!function_exists("mb_strlen")) { die("Error - mPDF requires mb_string functions. Ensure that PHP is compiled with php_mbstring.dll enabled."); }
  38. if (!defined('PHP_VERSION_ID')) {
  39. $version = explode('.', PHP_VERSION);
  40. define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2]));
  41. }
  42. class mPDF
  43. {
  44. ///////////////////////////////
  45. // EXTERNAL (PUBLIC) VARIABLES
  46. // Define these in config.php
  47. ///////////////////////////////
  48. var $repackageTTF; // mPDF 5.2
  49. var $allowCJKorphans;
  50. var $allowCJKoverflow;
  51. var $CJKleading;
  52. var $CJKfollowing;
  53. var $CJKoverflow;
  54. var $useKerning;
  55. var $restrictColorSpace;
  56. var $bleedMargin;
  57. var $crossMarkMargin;
  58. var $cropMarkMargin;
  59. var $cropMarkLength;
  60. var $nonPrintMargin;
  61. var $PDFX;
  62. var $PDFXauto;
  63. var $PDFA;
  64. var $PDFAauto;
  65. var $ICCProfile;
  66. var $printers_info;
  67. var $iterationCounter;
  68. var $smCapsScale;
  69. var $smCapsStretch;
  70. var $backupSubsFont;
  71. var $backupSIPFont;
  72. var $debugfonts;
  73. var $useAdobeCJK;
  74. var $percentSubset;
  75. var $maxTTFFilesize;
  76. var $BMPonly;
  77. var $tableMinSizePriority;
  78. var $dpi;
  79. var $watermarkImgAlphaBlend;
  80. var $watermarkImgBehind;
  81. var $justifyB4br;
  82. var $packTableData;
  83. var $pgsIns;
  84. var $simpleTables;
  85. var $enableImports;
  86. var $debug;
  87. var $showStats;
  88. var $setAutoTopMargin;
  89. var $setAutoBottomMargin;
  90. var $autoMarginPadding;
  91. var $collapseBlockMargins;
  92. var $falseBoldWeight;
  93. var $normalLineheight;
  94. var $progressBar;
  95. var $incrementFPR1;
  96. var $incrementFPR2;
  97. var $incrementFPR3;
  98. var $incrementFPR4;
  99. var $hyphenate;
  100. var $hyphenateTables;
  101. var $SHYlang;
  102. var $SHYleftmin;
  103. var $SHYrightmin;
  104. var $SHYcharmin;
  105. var $SHYcharmax;
  106. var $SHYlanguages;
  107. // PageNumber Conditional Text
  108. var $pagenumPrefix;
  109. var $pagenumSuffix;
  110. var $nbpgPrefix;
  111. var $nbpgSuffix;
  112. var $showImageErrors;
  113. var $allow_output_buffering;
  114. var $autoPadding;
  115. var $useGraphs;
  116. var $autoFontGroupSize;
  117. var $tabSpaces;
  118. var $useLang;
  119. var $restoreBlockPagebreaks;
  120. var $watermarkTextAlpha;
  121. var $watermarkImageAlpha;
  122. var $watermark_size;
  123. var $watermark_pos;
  124. var $annotSize;
  125. var $annotMargin;
  126. var $annotOpacity;
  127. var $title2annots;
  128. var $keepColumns;
  129. var $keep_table_proportions;
  130. var $ignore_table_widths;
  131. var $ignore_table_percents;
  132. var $list_align_style;
  133. var $list_number_suffix;
  134. var $useSubstitutions;
  135. var $CSSselectMedia;
  136. // $disablePrintCSS depracated
  137. var $forcePortraitHeaders;
  138. var $forcePortraitMargins;
  139. var $displayDefaultOrientation;
  140. var $ignore_invalid_utf8;
  141. var $allowedCSStags;
  142. var $onlyCoreFonts;
  143. var $allow_charset_conversion;
  144. var $jSWord;
  145. var $jSmaxChar;
  146. var $jSmaxCharLast;
  147. var $jSmaxWordLast;
  148. var $orphansAllowed;
  149. var $max_colH_correction;
  150. var $table_error_report;
  151. var $table_error_report_param;
  152. var $biDirectional;
  153. var $text_input_as_HTML;
  154. var $anchor2Bookmark;
  155. var $list_indent_first_level;
  156. var $shrink_tables_to_fit;
  157. var $allow_html_optional_endtags;
  158. var $img_dpi;
  159. var $defaultheaderfontsize;
  160. var $defaultheaderfontstyle;
  161. var $defaultheaderline;
  162. var $defaultfooterfontsize;
  163. var $defaultfooterfontstyle;
  164. var $defaultfooterline;
  165. var $header_line_spacing;
  166. var $footer_line_spacing;
  167. var $textarea_lineheight;
  168. var $pregRTLchars;
  169. var $pregUHCchars;
  170. var $pregSJISchars;
  171. var $pregCJKchars;
  172. var $pregASCIIchars1;
  173. var $pregASCIIchars2;
  174. var $pregASCIIchars3;
  175. var $pregVIETchars;
  176. var $pregVIETPluschars;
  177. var $pregHEBchars;
  178. var $pregARABICchars;
  179. var $pregNonARABICchars;
  180. // INDIC
  181. var $pregHIchars;
  182. var $pregBNchars;
  183. var $pregPAchars;
  184. var $pregGUchars;
  185. var $pregORchars;
  186. var $pregTAchars;
  187. var $pregTEchars;
  188. var $pregKNchars;
  189. var $pregMLchars;
  190. var $pregSHchars;
  191. var $pregINDextra;
  192. var $mirrorMargins;
  193. var $default_lineheight_correction;
  194. var $watermarkText;
  195. var $watermarkImage;
  196. var $showWatermarkText;
  197. var $showWatermarkImage;
  198. var $fontsizes;
  199. // Aliases for backward compatability
  200. var $UnvalidatedText; // alias = $watermarkText
  201. var $TopicIsUnvalidated; // alias = $showWatermarkText
  202. var $useOddEven; // alias = $mirrorMargins
  203. var $useSubstitutionsMB; // alias = $useSubstitutions
  204. // mPDF 5.3 Active Forms
  205. var $formSubmitNoValueFields;
  206. var $useActiveForms;
  207. var $formExportType;
  208. var $formSelectDefaultOption;
  209. var $formUseZapD;
  210. /* Form Styles */
  211. var $form_border_color;
  212. var $form_background_color;
  213. var $form_border_width;
  214. var $form_border_style;
  215. var $form_button_border_color;
  216. var $form_button_background_color;
  217. var $form_button_border_width;
  218. var $form_button_border_style;
  219. var $form_radio_color;
  220. var $form_radio_background_color;
  221. //////////////////////
  222. // INTERNAL VARIABLES
  223. //////////////////////
  224. // mPDF 5.2.09
  225. var $useRC128encryption;
  226. var $uniqid;
  227. // mPDF 5.2.03
  228. // Active forms
  229. var $formMethod;
  230. var $formAction;
  231. var $form_fonts;
  232. var $form_radio_groups;
  233. var $pdf_acro_array;
  234. var $form_checkboxes;
  235. var $forms;
  236. var $formn;
  237. var $pdf_array_co; // mPDF 5.2.10
  238. var $array_form_button_js;
  239. var $array_form_choice_js;
  240. var $array_form_text_js;
  241. /* Button Text */
  242. var $form_button_text;
  243. var $form_button_text_over;
  244. var $form_button_text_click;
  245. var $form_button_icon;
  246. var $kerning;
  247. var $fixedlSpacing;
  248. var $minwSpacing;
  249. var $lSpacingCSS;
  250. var $wSpacingCSS;
  251. var $listDir;
  252. var $spotColorIDs;
  253. var $SVGcolors;
  254. var $spotColors;
  255. var $defTextColor;
  256. var $defDrawColor;
  257. var $defFillColor;
  258. var $tableBackgrounds;
  259. var $inlineDisplayOff;
  260. var $kt_y00;
  261. var $kt_p00;
  262. var $upperCase;
  263. var $checkSIP;
  264. var $checkSMP;
  265. var $checkCJK;
  266. var $tableCJK;
  267. var $watermarkImgAlpha;
  268. var $PDFAXwarnings;
  269. var $MetadataRoot;
  270. var $OutputIntentRoot;
  271. var $InfoRoot;
  272. var $current_filename;
  273. var $parsers;
  274. var $current_parser;
  275. var $_obj_stack;
  276. var $_don_obj_stack;
  277. var $_current_obj_id;
  278. var $tpls;
  279. var $tpl;
  280. var $tplprefix;
  281. var $_res;
  282. var $pdf_version;
  283. var $noImageFile;
  284. var $lastblockbottommargin;
  285. var $baselineC;
  286. var $subPos;
  287. var $subArrMB;
  288. var $ReqFontStyle;
  289. var $tableClipPath ;
  290. var $forceExactLineheight;
  291. var $listOcc;
  292. var $fullImageHeight;
  293. var $inFixedPosBlock; // Internal flag for position:fixed block
  294. var $fixedPosBlock; // Buffer string for position:fixed block
  295. var $fixedPosBlockDepth;
  296. var $fixedPosBlockBBox;
  297. var $fixedPosBlockSave;
  298. var $maxPosL;
  299. var $maxPosR;
  300. var $loaded;
  301. var $extraFontSubsets;
  302. var $docTemplateStart; // Internal flag for page (page no. -1) that docTemplate starts on
  303. var $time0;
  304. // Classes
  305. var $indic;
  306. var $barcode;
  307. var $SHYpatterns;
  308. var $loadedSHYpatterns;
  309. var $loadedSHYdictionary;
  310. var $SHYdictionary;
  311. var $SHYdictionaryWords;
  312. var $spanbgcolorarray;
  313. var $default_font;
  314. var $list_lineheight;
  315. var $headerbuffer;
  316. var $lastblocklevelchange;
  317. var $nestedtablejustfinished;
  318. var $linebreakjustfinished;
  319. var $cell_border_dominance_L;
  320. var $cell_border_dominance_R;
  321. var $cell_border_dominance_T;
  322. var $cell_border_dominance_B;
  323. var $tbCSSlvl;
  324. var $listCSSlvl;
  325. var $table_keep_together;
  326. var $plainCell_properties;
  327. var $inherit_lineheight;
  328. var $listitemtype;
  329. var $shrin_k1;
  330. var $outerfilled;
  331. var $blockContext;
  332. var $floatDivs;
  333. var $tablecascadeCSS;
  334. var $listcascadeCSS;
  335. var $patterns;
  336. var $pageBackgrounds;
  337. var $bodyBackgroundGradient;
  338. var $bodyBackgroundImage;
  339. var $bodyBackgroundColor;
  340. var $writingHTMLheader; // internal flag - used both for writing HTMLHeaders/Footers and FixedPos block
  341. var $writingHTMLfooter;
  342. var $autoFontGroups;
  343. var $angle;
  344. var $gradients;
  345. var $kwt_Reference;
  346. var $kwt_BMoutlines;
  347. var $kwt_toc;
  348. var $tbrot_Reference;
  349. var $tbrot_BMoutlines;
  350. var $tbrot_toc;
  351. var $col_Reference;
  352. var $col_BMoutlines;
  353. var $col_toc;
  354. var $currentGraphId;
  355. var $graphs;
  356. var $floatbuffer;
  357. var $floatmargins;
  358. var $bullet;
  359. var $bulletarray;
  360. var $rtlAsArabicFarsi; // DEPRACATED
  361. var $currentLang;
  362. var $default_lang;
  363. var $default_available_fonts;
  364. var $pageTemplate;
  365. var $docTemplate;
  366. var $docTemplateContinue;
  367. var $arabGlyphs;
  368. var $arabHex;
  369. var $persianGlyphs;
  370. var $persianHex;
  371. var $arabVowels;
  372. var $arabPrevLink;
  373. var $arabNextLink;
  374. var $formobjects; // array of Form Objects for WMF
  375. var $gdiObjectArray; // array of GDI objects for WMF
  376. var $InlineProperties; // Should have done this a long time ago
  377. var $InlineAnnots;
  378. var $ktAnnots;
  379. var $tbrot_Annots;
  380. var $kwt_Annots;
  381. var $columnAnnots;
  382. var $columnForms; // mPDF 5.2.03
  383. var $PageAnnots;
  384. var $pageDim; // Keep track of page wxh for orientation changes - set in _beginpage, used in _putannots
  385. var $breakpoints;
  386. var $tableLevel;
  387. var $tbctr;
  388. var $innermostTableLevel;
  389. var $saveTableCounter;
  390. var $cellBorderBuffer;
  391. var $saveHTMLFooter_height;
  392. var $saveHTMLFooterE_height;
  393. var $firstPageBoxHeader;
  394. var $firstPageBoxHeaderEven;
  395. var $firstPageBoxFooter;
  396. var $firstPageBoxFooterEven;
  397. var $page_box;
  398. var $show_marks; // crop or cross marks
  399. var $basepathIsLocal;
  400. var $use_kwt;
  401. var $kwt;
  402. var $kwt_height;
  403. var $kwt_y0;
  404. var $kwt_x0;
  405. var $kwt_buffer;
  406. var $kwt_Links;
  407. var $kwt_moved;
  408. var $kwt_saved;
  409. var $PageNumSubstitutions;
  410. var $table_borders_separate;
  411. var $base_table_properties;
  412. var $borderstyles;
  413. // doesn't include none or hidden
  414. var $listjustfinished;
  415. var $blockjustfinished;
  416. var $orig_bMargin;
  417. var $orig_tMargin;
  418. var $orig_lMargin;
  419. var $orig_rMargin;
  420. var $orig_hMargin;
  421. var $orig_fMargin;
  422. var $pageheaders;
  423. var $pagefooters;
  424. var $pageHTMLheaders;
  425. var $pageHTMLfooters;
  426. var $saveHTMLHeader;
  427. var $saveHTMLFooter;
  428. var $HTMLheaderPageLinks;
  429. var $HTMLheaderPageAnnots;
  430. var $HTMLheaderPageForms; // mPDF 5.2.03
  431. // See config_fonts.php for these next 5 values
  432. var $available_unifonts;
  433. var $sans_fonts;
  434. var $serif_fonts;
  435. var $mono_fonts;
  436. var $defaultSubsFont;
  437. // List of ALL available CJK fonts (incl. styles) (Adobe add-ons) hw removed
  438. var $available_CJK_fonts;
  439. var $cascadeCSS;
  440. var $HTMLHeader;
  441. var $HTMLFooter;
  442. var $HTMLHeaderE;
  443. var $HTMLFooterE;
  444. var $bufferoutput;
  445. var $showdefaultpagenos; // DEPRACATED -left for backward compatability
  446. var $chrs;
  447. var $ords;
  448. // CJK fonts
  449. var $Big5_widths;
  450. var $GB_widths;
  451. var $SJIS_widths;
  452. var $UHC_widths;
  453. // SetProtection
  454. var $encrypted; //whether document is protected
  455. var $Uvalue; //U entry in pdf document
  456. var $Ovalue; //O entry in pdf document
  457. var $Pvalue; //P entry in pdf document
  458. var $enc_obj_id; //encryption object id
  459. var $last_rc4_key; //last RC4 key encrypted (cached for optimisation)
  460. var $last_rc4_key_c; //last RC4 computed key
  461. var $encryption_key;
  462. var $padding; //used for encryption
  463. // Bookmark
  464. var $BMoutlines;
  465. var $OutlineRoot;
  466. // TOC
  467. var $_toc;
  468. var $TOCmark;
  469. var $TOCfont;
  470. var $TOCfontsize;
  471. var $TOCindent;
  472. var $TOCheader;
  473. var $TOCfooter;
  474. var $TOCpreHTML;
  475. var $TOCpostHTML;
  476. var $TOCbookmarkText;
  477. var $TOCusePaging;
  478. var $TOCuseLinking;
  479. var $TOCorientation;
  480. var $TOC_margin_left;
  481. var $TOC_margin_right;
  482. var $TOC_margin_top;
  483. var $TOC_margin_bottom;
  484. var $TOC_margin_header;
  485. var $TOC_margin_footer;
  486. var $TOC_odd_header_name;
  487. var $TOC_even_header_name;
  488. var $TOC_odd_footer_name;
  489. var $TOC_even_footer_name;
  490. var $TOC_odd_header_value;
  491. var $TOC_even_header_value;
  492. var $TOC_odd_footer_value;
  493. var $TOC_even_footer_value;
  494. var $TOC_start;
  495. var $TOC_end;
  496. var $TOC_npages;
  497. var $m_TOC;
  498. // INDEX
  499. var $ColActive;
  500. var $ChangePage; //Flag indicating that a page break has occurred
  501. var $Reference;
  502. var $CurrCol;
  503. var $NbCol;
  504. var $y0; //Top ordinate of columns
  505. var $ColL;
  506. var $ColWidth;
  507. var $ColGap;
  508. // COLUMNS
  509. var $ColR;
  510. var $ChangeColumn;
  511. var $columnbuffer;
  512. var $ColDetails;
  513. var $columnLinks;
  514. var $colvAlign;
  515. // Substitutions
  516. var $substitute; // Array of substitution strings e.g. <ttz>112</ttz>
  517. var $entsearch; // Array of HTML entities (>ASCII 127) to substitute
  518. var $entsubstitute; // Array of substitution decimal unicode for the Hi entities
  519. // Default values if no style sheet offered (cf. http://www.w3.org/TR/CSS21/sample.html)
  520. var $defaultCSS;
  521. var $form_element_spacing;
  522. var $linemaxfontsize;
  523. var $lineheight_correction;
  524. var $lastoptionaltag; // Save current block item which HTML specifies optionsl endtag
  525. var $pageoutput;
  526. var $charset_in;
  527. var $blk;
  528. var $blklvl;
  529. var $ColumnAdjust;
  530. var $ws; // Word spacing
  531. var $HREF;
  532. var $pgwidth;
  533. var $fontlist;
  534. var $issetfont;
  535. var $issetcolor;
  536. var $oldx;
  537. var $oldy;
  538. var $B;
  539. var $U; //underlining flag
  540. var $S; // SmallCaps flag
  541. var $I;
  542. var $tdbegin;
  543. var $table;
  544. var $cell;
  545. var $col;
  546. var $row;
  547. var $divbegin;
  548. var $divalign;
  549. var $divwidth;
  550. var $divheight;
  551. var $divrevert;
  552. var $spanbgcolor;
  553. var $spanlvl;
  554. var $listlvl;
  555. var $listnum;
  556. var $listtype;
  557. var $listoccur;
  558. var $listlist;
  559. var $listitem;
  560. var $pjustfinished;
  561. var $ignorefollowingspaces;
  562. var $SUP;
  563. var $SUB;
  564. var $SMALL;
  565. var $BIG;
  566. var $toupper;
  567. var $tolower;
  568. var $capitalize;
  569. var $dash_on;
  570. var $dotted_on;
  571. var $strike;
  572. var $CSS;
  573. var $textbuffer;
  574. var $currentfontstyle;
  575. var $currentfontfamily;
  576. var $currentfontsize;
  577. var $colorarray;
  578. var $bgcolorarray;
  579. var $internallink;
  580. var $enabledtags;
  581. var $lineheight;
  582. var $basepath;
  583. var $outlineparam;
  584. var $outline_on;
  585. var $specialcontent;
  586. var $selectoption;
  587. var $usecss;
  588. var $usepre;
  589. var $usetableheader;
  590. var $tableheadernrows;
  591. var $tablefooternrows;
  592. var $objectbuffer;
  593. // Table Rotation
  594. var $table_rotate;
  595. var $tbrot_maxw;
  596. var $tbrot_maxh;
  597. var $tablebuffer;
  598. var $tbrot_align;
  599. var $tbrot_Links;
  600. var $divbuffer; // Buffer used when keeping DIV on one page
  601. var $keep_block_together; // Keep a Block from page-break-inside: avoid
  602. var $ktLinks; // Keep-together Block links array
  603. var $ktBlock; // Keep-together Block array
  604. var $ktForms; // mPDF 5.2.03
  605. var $ktReference;
  606. var $ktBMoutlines;
  607. var $_kttoc;
  608. var $tbrot_y0;
  609. var $tbrot_x0;
  610. var $tbrot_w;
  611. var $tbrot_h;
  612. var $mb_enc;
  613. var $directionality;
  614. var $extgstates; // Used for alpha channel - Transparency (Watermark)
  615. var $mgl;
  616. var $mgt;
  617. var $mgr;
  618. var $mgb;
  619. var $tts;
  620. var $ttz;
  621. var $tta;
  622. var $headerDetails;
  623. var $footerDetails;
  624. // Best to alter the below variables using default stylesheet above
  625. var $div_margin_bottom;
  626. var $div_bottom_border;
  627. var $p_margin_bottom;
  628. var $p_bottom_border;
  629. var $page_break_after_avoid;
  630. var $margin_bottom_collapse;
  631. var $img_margin_top; // default is set at top of fn.openTag 'IMG'
  632. var $img_margin_bottom;
  633. var $list_indent;
  634. var $list_align;
  635. var $list_margin_bottom;
  636. var $default_font_size; // in pts
  637. var $original_default_font_size; // used to save default sizes when using table default
  638. var $original_default_font;
  639. var $watermark_font;
  640. var $defaultAlign;
  641. // TABLE
  642. var $defaultTableAlign;
  643. var $tablethead;
  644. var $thead_font_weight;
  645. var $thead_font_style;
  646. var $thead_font_smCaps;
  647. var $thead_valign_default;
  648. var $thead_textalign_default;
  649. var $tabletfoot;
  650. var $tfoot_font_weight;
  651. var $tfoot_font_style;
  652. var $tfoot_font_smCaps;
  653. var $tfoot_valign_default;
  654. var $tfoot_textalign_default;
  655. var $trow_text_rotate;
  656. var $cellPaddingL;
  657. var $cellPaddingR;
  658. var $cellPaddingT;
  659. var $cellPaddingB;
  660. var $table_lineheight;
  661. var $table_border_attr_set;
  662. var $table_border_css_set;
  663. var $shrin_k; // factor with which to shrink tables - used internally - do not change
  664. var $shrink_this_table_to_fit; // 0 or false to disable; value (if set) gives maximum factor to reduce fontsize
  665. var $MarginCorrection; // corrects for OddEven Margins
  666. var $margin_footer;
  667. var $margin_header;
  668. var $tabletheadjustfinished;
  669. var $usingCoreFont;
  670. var $charspacing;
  671. //Private properties FROM FPDF
  672. var $DisplayPreferences;
  673. var $outlines;
  674. var $flowingBlockAttr;
  675. var $page; //current page number
  676. var $n; //current object number
  677. var $offsets; //array of object offsets
  678. var $buffer; //buffer holding in-memory PDF
  679. var $pages; //array containing pages
  680. var $state; //current document state
  681. var $compress; //compression flag
  682. var $DefOrientation; //default orientation
  683. var $CurOrientation; //current orientation
  684. var $OrientationChanges; //array indicating orientation changes
  685. var $k; //scale factor (number of points in user unit)
  686. var $fwPt;
  687. var $fhPt; //dimensions of page format in points
  688. var $fw;
  689. var $fh; //dimensions of page format in user unit
  690. var $wPt;
  691. var $hPt; //current dimensions of page in points
  692. var $w;
  693. var $h; //current dimensions of page in user unit
  694. var $lMargin; //left margin
  695. var $tMargin; //top margin
  696. var $rMargin; //right margin
  697. var $bMargin; //page break margin
  698. var $cMarginL; //cell margin Left
  699. var $cMarginR; //cell margin Right
  700. var $cMarginT; //cell margin Left
  701. var $cMarginB; //cell margin Right
  702. var $DeflMargin; //Default left margin
  703. var $DefrMargin; //Default right margin
  704. var $x;
  705. var $y; //current position in user unit for cell positioning
  706. var $lasth; //height of last cell printed
  707. var $LineWidth; //line width in user unit
  708. var $CoreFonts; //array of standard font names
  709. var $fonts; //array of used fonts
  710. var $FontFiles; //array of font files
  711. var $diffs; //array of encoding differences
  712. var $images; //array of used images
  713. var $PageLinks; //array of links in pages
  714. var $links; //array of internal links
  715. var $FontFamily; //current font family
  716. var $FontStyle; //current font style
  717. var $CurrentFont; //current font info
  718. var $FontSizePt; //current font size in points
  719. var $FontSize; //current font size in user unit
  720. var $DrawColor; //commands for drawing color
  721. var $FillColor; //commands for filling color
  722. var $TextColor; //commands for text color
  723. var $ColorFlag; //indicates whether fill and text colors are different
  724. var $autoPageBreak; //automatic page breaking
  725. var $PageBreakTrigger; //threshold used to trigger page breaks
  726. var $InFooter; //flag set when processing footer
  727. var $InHTMLFooter;
  728. var $processingFooter; //flag set when processing footer - added for columns
  729. var $processingHeader; //flag set when processing header - added for columns
  730. var $ZoomMode; //zoom display mode
  731. var $LayoutMode; //layout display mode
  732. var $title; //title
  733. var $subject; //subject
  734. var $author; //author
  735. var $keywords; //keywords
  736. var $creator; //creator
  737. var $aliasNbPg; //alias for total number of pages
  738. var $aliasNbPgGp; //alias for total number of pages in page group
  739. var $aliasNbPgHex;
  740. var $aliasNbPgGpHex;
  741. var $ispre;
  742. var $outerblocktags;
  743. var $innerblocktags;
  744. // NOT Currently used
  745. var $inlinetags;
  746. var $listtags;
  747. var $tabletags;
  748. var $formtags;
  749. // **********************************
  750. // **********************************
  751. // **********************************
  752. // **********************************
  753. // **********************************
  754. // **********************************
  755. // **********************************
  756. // **********************************
  757. // **********************************
  758. function mPDF($mode='',$format='A4',$default_font_size=0,$default_font='',$mgl=15,$mgr=15,$mgt=16,$mgb=16,$mgh=9,$mgf=9, $orientation='P') {
  759. $this->time0 = microtime(true);
  760. $unit='mm';
  761. //Some checks
  762. $this->_dochecks();
  763. // Set up Aliases for backwards compatability
  764. $this->UnvalidatedText =& $this->watermarkText;
  765. $this->TopicIsUnvalidated =& $this->showWatermarkText;
  766. $this->AliasNbPg =& $this->aliasNbPg;
  767. $this->AliasNbPgGp =& $this->aliasNbPgGp;
  768. $this->BiDirectional =& $this->biDirectional;
  769. $this->Anchor2Bookmark =& $this->anchor2Bookmark;
  770. $this->KeepColumns =& $this->keepColumns;
  771. $this->useOddEven =& $this->mirrorMargins;
  772. $this->useSubstitutionsMB =& $this->useSubstitutions;
  773. //Initialization of properties
  774. $this->spotColors=array();
  775. $this->spotColorIDs = array();
  776. $this->tableBackgrounds = array();
  777. $this->kt_y00 = '';
  778. $this->kt_p00 = '';
  779. $this->iterationCounter = false;
  780. $this->BMPonly = array();
  781. $this->page=0;
  782. $this->n=2;
  783. $this->buffer='';
  784. $this->objectbuffer = array();
  785. $this->pages=array();
  786. $this->OrientationChanges=array();
  787. $this->state=0;
  788. $this->fonts=array();
  789. $this->FontFiles=array();
  790. $this->diffs=array();
  791. $this->images=array();
  792. $this->links=array();
  793. $this->InFooter=false;
  794. $this->processingFooter=false;
  795. $this->processingHeader=false;
  796. $this->lasth=0;
  797. $this->FontFamily='';
  798. $this->FontStyle='';
  799. $this->FontSizePt=9;
  800. $this->U=false;
  801. // Small Caps
  802. $this->upperCase = array();
  803. @include(_MPDF_PATH.'includes/upperCase.php');
  804. $this->S = false;
  805. $this->smCapsScale = 1;
  806. $this->smCapsStretch = 100;
  807. $this->defTextColor = $this->TextColor = $this->SetTColor($this->ConvertColor(0),true);
  808. $this->defDrawColor = $this->DrawColor = $this->SetDColor($this->ConvertColor(0),true);
  809. $this->defFillColor = $this->FillColor = $this->SetFColor($this->ConvertColor(255),true);
  810. //SVG color names array
  811. //http://www.w3schools.com/css/css_colornames.asp
  812. $this->SVGcolors = array('antiquewhite'=>'#FAEBD7','aqua'=>'#00FFFF','aquamarine'=>'#7FFFD4','beige'=>'#F5F5DC','black'=>'#000000',
  813. 'blue'=>'#0000FF','brown'=>'#A52A2A','cadetblue'=>'#5F9EA0','chocolate'=>'#D2691E','cornflowerblue'=>'#6495ED','crimson'=>'#DC143C',
  814. 'darkblue'=>'#00008B','darkgoldenrod'=>'#B8860B','darkgreen'=>'#006400','darkmagenta'=>'#8B008B','darkorange'=>'#FF8C00',
  815. 'darkred'=>'#8B0000','darkseagreen'=>'#8FBC8F','darkslategray'=>'#2F4F4F','darkviolet'=>'#9400D3','deepskyblue'=>'#00BFFF',
  816. 'dodgerblue'=>'#1E90FF','firebrick'=>'#B22222','forestgreen'=>'#228B22','fuchsia'=>'#FF00FF','gainsboro'=>'#DCDCDC','gold'=>'#FFD700',
  817. 'gray'=>'#808080','green'=>'#008000','greenyellow'=>'#ADFF2F','hotpink'=>'#FF69B4','indigo'=>'#4B0082','khaki'=>'#F0E68C',
  818. 'lavenderblush'=>'#FFF0F5','lemonchiffon'=>'#FFFACD','lightcoral'=>'#F08080','lightgoldenrodyellow'=>'#FAFAD2','lightgreen'=>'#90EE90',
  819. 'lightsalmon'=>'#FFA07A','lightskyblue'=>'#87CEFA','lightslategray'=>'#778899','lightyellow'=>'#FFFFE0','lime'=>'#00FF00','limegreen'=>'#32CD32',
  820. 'magenta'=>'#FF00FF','maroon'=>'#800000','mediumaquamarine'=>'#66CDAA','mediumorchid'=>'#BA55D3','mediumseagreen'=>'#3CB371',
  821. 'mediumspringgreen'=>'#00FA9A','mediumvioletred'=>'#C71585','midnightblue'=>'#191970','mintcream'=>'#F5FFFA','moccasin'=>'#FFE4B5','navy'=>'#000080',
  822. 'olive'=>'#808000','orange'=>'#FFA500','orchid'=>'#DA70D6','palegreen'=>'#98FB98',
  823. 'palevioletred'=>'#D87093','peachpuff'=>'#FFDAB9','pink'=>'#FFC0CB','powderblue'=>'#B0E0E6','purple'=>'#800080',
  824. 'red'=>'#FF0000','royalblue'=>'#4169E1','salmon'=>'#FA8072','seagreen'=>'#2E8B57','sienna'=>'#A0522D','silver'=>'#C0C0C0','skyblue'=>'#87CEEB',
  825. 'slategray'=>'#708090','springgreen'=>'#00FF7F','steelblue'=>'#4682B4','tan'=>'#D2B48C','teal'=>'#008080','thistle'=>'#D8BFD8','turquoise'=>'#40E0D0',
  826. 'violetred'=>'#D02090','white'=>'#FFFFFF','yellow'=>'#FFFF00',
  827. 'aliceblue'=>'#f0f8ff', 'azure'=>'#f0ffff', 'bisque'=>'#ffe4c4', 'blanchedalmond'=>'#ffebcd', 'blueviolet'=>'#8a2be2', 'burlywood'=>'#deb887',
  828. 'chartreuse'=>'#7fff00', 'coral'=>'#ff7f50', 'cornsilk'=>'#fff8dc', 'cyan'=>'#00ffff', 'darkcyan'=>'#008b8b', 'darkgray'=>'#a9a9a9',
  829. 'darkgrey'=>'#a9a9a9', 'darkkhaki'=>'#bdb76b', 'darkolivegreen'=>'#556b2f', 'darkorchid'=>'#9932cc', 'darksalmon'=>'#e9967a',
  830. 'darkslateblue'=>'#483d8b', 'darkslategrey'=>'#2f4f4f', 'darkturquoise'=>'#00ced1', 'deeppink'=>'#ff1493', 'dimgray'=>'#696969',
  831. 'dimgrey'=>'#696969', 'floralwhite'=>'#fffaf0', 'ghostwhite'=>'#f8f8ff', 'goldenrod'=>'#daa520', 'grey'=>'#808080', 'honeydew'=>'#f0fff0',
  832. 'indianred'=>'#cd5c5c', 'ivory'=>'#fffff0', 'lavender'=>'#e6e6fa', 'lawngreen'=>'#7cfc00', 'lightblue'=>'#add8e6', 'lightcyan'=>'#e0ffff',
  833. 'lightgray'=>'#d3d3d3', 'lightgrey'=>'#d3d3d3', 'lightpink'=>'#ffb6c1', 'lightseagreen'=>'#20b2aa', 'lightslategrey'=>'#778899',
  834. 'lightsteelblue'=>'#b0c4de', 'linen'=>'#faf0e6', 'mediumblue'=>'#0000cd', 'mediumpurple'=>'#9370db', 'mediumslateblue'=>'#7b68ee',
  835. 'mediumturquoise'=>'#48d1cc', 'mistyrose'=>'#ffe4e1', 'navajowhite'=>'#ffdead', 'oldlace'=>'#fdf5e6', 'olivedrab'=>'#6b8e23', 'orangered'=>'#ff4500',
  836. 'palegoldenrod'=>'#eee8aa', 'paleturquoise'=>'#afeeee', 'papayawhip'=>'#ffefd5', 'peru'=>'#cd853f', 'plum'=>'#dda0dd', 'rosybrown'=>'#bc8f8f',
  837. 'saddlebrown'=>'#8b4513', 'sandybrown'=>'#f4a460', 'seashell'=>'#fff5ee', 'slateblue'=>'#6a5acd', 'slategrey'=>'#708090', 'snow'=>'#fffafa',
  838. 'tomato'=>'#ff6347', 'violet'=>'#ee82ee', 'wheat'=>'#f5deb3', 'whitesmoke'=>'#f5f5f5', 'yellowgreen'=>'#9acd32');
  839. $this->ColorFlag=false;
  840. $this->extgstates = array();
  841. $this->mb_enc='windows-1252';
  842. $this->directionality='ltr';
  843. $this->defaultAlign = 'L';
  844. $this->defaultTableAlign = 'L';
  845. $this->fixedPosBlockSave = array();
  846. $this->extraFontSubsets = 0;
  847. $this->SHYpatterns = array();
  848. $this->loadedSHYdictionary = false;
  849. $this->SHYdictionary = array();
  850. $this->SHYdictionaryWords = array();
  851. $this->blockContext = 1;
  852. $this->floatDivs = array();
  853. $this->DisplayPreferences='';
  854. $this->tablecascadeCSS = array();
  855. $this->listcascadeCSS = array();
  856. $this->patterns = array(); // Tiling patterns used for backgrounds
  857. $this->pageBackgrounds = array();
  858. $this->writingHTMLheader = false; // internal flag - used both for writing HTMLHeaders/Footers and FixedPos block
  859. $this->writingHTMLfooter = false; // internal flag - used both for writing HTMLHeaders/Footers and FixedPos block
  860. $this->gradients = array();
  861. $this->kwt_Reference = array();
  862. $this->kwt_BMoutlines = array();
  863. $this->kwt_toc = array();
  864. $this->tbrot_Reference = array();
  865. $this->tbrot_BMoutlines = array();
  866. $this->tbrot_toc = array();
  867. $this->col_Reference = array();
  868. $this->col_BMoutlines = array();
  869. $this->col_toc = array();
  870. $this->graphs = array();
  871. $this->pgsIns = array();
  872. $this->PDFAXwarnings = array();
  873. $this->inlineDisplayOff = false;
  874. $this->kerning = false;
  875. $this->lSpacingCSS = '';
  876. $this->wSpacingCSS = '';
  877. $this->fixedlSpacing = false;
  878. $this->minwSpacing = 0;
  879. $this->baselineC = 0.35; // Baseline for text
  880. $this->noImageFile = str_replace("\\","/",dirname(__FILE__)) . '/includes/no_image.jpg';
  881. $this->subPos = 0;
  882. $this->forceExactLineheight = false;
  883. $this->listOcc = 0;
  884. $this->normalLineheight = 1.3;
  885. // These are intended as configuration variables, and should be set in config.php - which will override these values;
  886. // set here as failsafe as will cause an error if not defined
  887. $this->incrementFPR1 = 10;
  888. $this->incrementFPR2 = 10;
  889. $this->incrementFPR3 = 10;
  890. $this->incrementFPR4 = 10;
  891. $this->fullImageHeight = false;
  892. $this->floatbuffer = array();
  893. $this->floatmargins = array();
  894. $this->autoFontGroups = 0;
  895. $this->formobjects=array(); // array of Form Objects for WMF
  896. $this->InlineProperties=array();
  897. $this->InlineAnnots=array();
  898. $this->ktAnnots=array();
  899. $this->tbrot_Annots=array();
  900. $this->kwt_Annots=array();
  901. $this->columnAnnots=array();
  902. $this->pageDim=array();
  903. $this->breakpoints = array(); // used in columnbuffer
  904. $this->tableLevel=0;
  905. $this->tbctr=array(); // counter for nested tables at each level
  906. $this->page_box = array();
  907. $this->show_marks = ''; // crop or cross marks
  908. $this->kwt = false;
  909. $this->kwt_height = 0;
  910. $this->kwt_y0 = 0;
  911. $this->kwt_x0 = 0;
  912. $this->kwt_buffer = array();
  913. $this->kwt_Links = array();
  914. $this->kwt_moved = false;
  915. $this->kwt_saved = false;
  916. $this->PageNumSubstitutions = array();
  917. $this->base_table_properties=array();
  918. $this->borderstyles = array('inset','groove','outset','ridge','dotted','dashed','solid','double');
  919. $this->tbrot_align = 'C';
  920. $this->pageheaders=array();
  921. $this->pagefooters=array();
  922. $this->pageHTMLheaders=array();
  923. $this->pageHTMLfooters=array();
  924. $this->HTMLheaderPageLinks = array();
  925. $this->HTMLheaderPageAnnots = array();
  926. $this->ktForms = array(); // mPDF 5.2.03
  927. $this->HTMLheaderPageForms = array(); // mPDF 5.2.03
  928. $this->columnForms = array(); // mPDF 5.2.03
  929. $this->tbrotForms = array(); // mPDF 5.2.03
  930. // mPDF 5.2.09
  931. $this->useRC128encryption = false;
  932. $this->uniqid = '';
  933. // mPDF 5.2.05
  934. $this->formMethod = 'POST';
  935. $this->formAction = '';
  936. $this->form_fonts = array();
  937. $this->form_radio_groups = array();
  938. $this->form_checkboxes = false;
  939. $this->forms = array();
  940. $this->pdf_array_co = ''; // mPDF 5.2.10
  941. $this->cascadeCSS = array();
  942. $this->bufferoutput = false;
  943. $this->encrypted=false; //whether document is protected
  944. $this->BMoutlines=array();
  945. $this->_toc=array();
  946. $this->TOCheader=false;
  947. $this->TOCfooter=false;
  948. $this->ColActive=0; //Flag indicating that columns are on (the index is being processed)
  949. $this->ChangePage=0; //Flag indicating that a page break has occurred
  950. $this->Reference=array(); //Array containing the references
  951. $this->CurrCol=0; //Current column number
  952. $this->ColL = array(0); // Array of Left pos of columns - absolute - needs Margin correction for Odd-Even
  953. $this->ColR = array(0); // Array of Right pos of columns - absolute pos - needs Margin correction for Odd-Even
  954. $this->ChangeColumn = 0;
  955. $this->columnbuffer = array();
  956. $this->ColDetails = array(); // Keeps track of some column details
  957. $this->columnLinks = array(); // Cross references PageLinks
  958. $this->substitute = array(); // Array of substitution strings e.g. <ttz>112</ttz>
  959. $this->entsearch = array(); // Array of HTML entities (>ASCII 127) to substitute
  960. $this->entsubstitute = array(); // Array of substitution decimal unicode for the Hi entities
  961. $this->lastoptionaltag = '';
  962. $this->charset_in = '';
  963. $this->blk = array();
  964. $this->blklvl = 0;
  965. $this->TOCmark = 0;
  966. $this->tts = false;
  967. $this->ttz = false;
  968. $this->tta = false;
  969. $this->ispre=false;
  970. $this->checkSIP = false;
  971. $this->checkSMP = false;
  972. $this->checkCJK = false;
  973. $this->tableCJK = false;
  974. $this->headerDetails=array();
  975. $this->footerDetails=array();
  976. $this->div_bottom_border = '';
  977. $this->p_bottom_border = '';
  978. $this->page_break_after_avoid = false;
  979. $this->margin_bottom_collapse = false;
  980. $this->tablethead = 0;
  981. $this->tabletfoot = 0;
  982. $this->table_border_attr_set = 0;
  983. $this->table_border_css_set = 0;
  984. $this->shrin_k = 1.0;
  985. $this->shrink_this_table_to_fit = 0;
  986. $this->MarginCorrection = 0;
  987. $this->tabletheadjustfinished = false;
  988. $this->usingCoreFont = false;
  989. $this->charspacing=0;
  990. $this->outlines=array();
  991. $this->autoPageBreak = true;
  992. /*-- FORMS --*/
  993. // FORM ELEMENT SPACING
  994. $this->form_element_spacing['select']['outer']['h'] = 0.5; // Horizontal spacing around SELECT
  995. $this->form_element_spacing['select']['outer']['v'] = 0.5; // Vertical spacing around SELECT
  996. $this->form_element_spacing['select']['inner']['h'] = 0.7; // Horizontal padding around SELECT
  997. $this->form_element_spacing['select']['inner']['v'] = 0.7; // Vertical padding around SELECT
  998. $this->form_element_spacing['input']['outer']['h'] = 0.5;
  999. $this->form_element_spacing['input']['outer']['v'] = 0.5;
  1000. $this->form_element_spacing['input']['inner']['h'] = 0.7;
  1001. $this->form_element_spacing['input']['inner']['v'] = 0.7;
  1002. $this->form_element_spacing['textarea']['outer']['h'] = 0.5;
  1003. $this->form_element_spacing['textarea']['outer']['v'] = 0.5;
  1004. $this->form_element_spacing['textarea']['inner']['h'] = 1;
  1005. $this->form_element_spacing['textarea']['inner']['v'] = 0.5;
  1006. $this->form_element_spacing['button']['outer']['h'] = 0.5;
  1007. $this->form_element_spacing['button']['outer']['v'] = 0.5;
  1008. $this->form_element_spacing['button']['inner']['h'] = 2;
  1009. $this->form_element_spacing['button']['inner']['v'] = 1;
  1010. /*-- END FORMS --*/
  1011. require(_MPDF_PATH.'config.php'); // config data
  1012. //Scale factor
  1013. $this->k=72/25.4; // Will only use mm
  1014. $this->_setPageSize($format, $orientation);
  1015. $this->DefOrientation=$orientation;
  1016. $this->margin_header=$mgh;
  1017. $this->margin_footer=$mgf;
  1018. $bmargin=$mgb;
  1019. $this->DeflMargin = $mgl;
  1020. $this->DefrMargin = $mgr;
  1021. // v1.4 Save orginal settings in case of changed orientation
  1022. $this->orig_tMargin = $mgt;
  1023. $this->orig_bMargin = $bmargin;
  1024. $this->orig_lMargin = $this->DeflMargin;
  1025. $this->orig_rMargin = $this->DefrMargin;
  1026. $this->orig_hMargin = $this->margin_header;
  1027. $this->orig_fMargin = $this->margin_footer;
  1028. if ($this->setAutoTopMargin=='pad') { $mgt += $this->margin_header; }
  1029. if ($this->setAutoBottomMargin=='pad') { $mgb += $this->margin_footer; }
  1030. $this->SetMargins($this->DeflMargin,$this->DefrMargin,$mgt); // sets l r t margin
  1031. //Automatic page break
  1032. $this->SetAutoPageBreak($this->autoPageBreak,$bmargin); // sets $this->bMargin & PageBreakTrigger
  1033. $this->pgwidth = $this->w - $this->lMargin - $this->rMargin;
  1034. //Interior cell margin (1 mm) ? not used
  1035. $this->cMarginL = 1;
  1036. $this->cMarginR = 1;
  1037. //Line width (0.2 mm)
  1038. $this->LineWidth=.567/$this->k;
  1039. //To make the function Footer() work - replaces {nb} with page number
  1040. $this->AliasNbPages();
  1041. $this->AliasNbPageGroups();
  1042. $this->aliasNbPgHex = '{nbHEXmarker}';
  1043. $this->aliasNbPgGpHex = '{nbpgHEXmarker}';
  1044. //Enable all tags as default
  1045. $this->DisableTags();
  1046. //Full width display mode
  1047. $this->SetDisplayMode(100); // fullwidth? 'fullpage'
  1048. //Compression
  1049. $this->SetCompression(true);
  1050. //Set default display preferences
  1051. $this->SetDisplayPreferences('');
  1052. // Font data
  1053. require(_MPDF_PATH.'config_fonts.php');
  1054. // Available fonts
  1055. $this->available_unifonts = array();
  1056. foreach ($this->fontdata AS $f => $fs) {
  1057. if (isset($fs['R']) && $fs['R']) { $this->available_unifonts[] = $f; }
  1058. if (isset($fs['B']) && $fs['B']) { $this->available_unifonts[] = $f.'B'; }
  1059. if (isset($fs['I']) && $fs['I']) { $this->available_unifonts[] = $f.'I'; }
  1060. if (isset($fs['BI']) && $fs['BI']) { $this->available_unifonts[] = $f.'BI'; }
  1061. }
  1062. $this->default_available_fonts = $this->available_unifonts;
  1063. $optcore = false;
  1064. $onlyCoreFonts = false;
  1065. if (preg_match('/([\-+])aCJK/i',$mode, $m)) {
  1066. preg_replace('/([\-+])aCJK/i','',$mode);
  1067. if ($m[1]=='+') { $this->useAdobeCJK = true; }
  1068. else { $this->useAdobeCJK = false; }
  1069. }
  1070. if (strlen($mode)==1) {
  1071. if ($mode=='s') { $this->percentSubset = 100; $mode = ''; }
  1072. else if ($mode=='c') { $onlyCoreFonts = true; $mode = ''; }
  1073. }
  1074. else if (substr($mode,-2)=='-s') {
  1075. $this->percentSubset = 100;
  1076. $mode = substr($mode,0,strlen($mode)-2);
  1077. }
  1078. else if (substr($mode,-2)=='-c') {
  1079. $onlyCoreFonts = true;
  1080. $mode = substr($mode,0,strlen($mode)-2);
  1081. }
  1082. else if (substr($mode,-2)=='-x') {
  1083. $optcore = true;
  1084. $mode = substr($mode,0,strlen($mode)-2);
  1085. }
  1086. // Autodetect if mode is a language_country string (en-GB or en_GB or en)
  1087. if ((strlen($mode) == 5 && $mode != 'UTF-8') || strlen($mode) == 2) {
  1088. list ($coreSuitable,$mpdf_pdf_unifonts) = GetLangOpts($mode, $this->useAdobeCJK);
  1089. if ($coreSuitable && $optcore) { $onlyCoreFonts = true; }
  1090. if ($mpdf_pdf_unifonts) {
  1091. $this->RestrictUnicodeFonts($mpdf_pdf_unifonts);
  1092. $this->default_available_fonts = $mpdf_pdf_unifonts;
  1093. }
  1094. $this->currentLang = $mode;
  1095. $this->default_lang = $mode;
  1096. }
  1097. $this->onlyCoreFonts = $onlyCoreFonts;
  1098. if ($this->onlyCoreFonts) {
  1099. $this->setMBencoding('windows-1252'); // sets $this->mb_enc
  1100. }
  1101. else {
  1102. $this->setMBencoding('UTF-8'); // sets $this->mb_enc
  1103. }
  1104. @mb_regex_encoding('UTF-8');
  1105. // Adobe CJK fonts
  1106. $this->available_CJK_fonts = array('gb','big5','sjis','uhc','gbB','big5B','sjisB','uhcB','gbI','big5I','sjisI','uhcI',
  1107. 'gbBI','big5BI','sjisBI','uhcBI');
  1108. //Standard fonts
  1109. $this->CoreFonts=array('ccourier'=>'Courier','ccourierB'=>'Courier-Bold','ccourierI'=>'Courier-Oblique','ccourierBI'=>'Courier-BoldOblique',
  1110. 'chelvetica'=>'Helvetica','chelveticaB'=>'Helvetica-Bold','chelveticaI'=>'Helvetica-Oblique','chelveticaBI'=>'Helvetica-BoldOblique',
  1111. 'ctimes'=>'Times-Roman','ctimesB'=>'Times-Bold','ctimesI'=>'Times-Italic','ctimesBI'=>'Times-BoldItalic',
  1112. 'csymbol'=>'Symbol','czapfdingbats'=>'ZapfDingbats');
  1113. $this->fontlist=array("ctimes","ccourier","chelvetica","csymbol","czapfdingbats");
  1114. // Substitutions
  1115. $this->setHiEntitySubstitutions();
  1116. if ($this->onlyCoreFonts) {
  1117. $this->useSubstitutions = true;
  1118. $this->SetSubstitutions();
  1119. }
  1120. else { $this->useSubstitutions = false; }
  1121. if (file_exists(_MPDF_PATH.'mpdf.css')) {
  1122. $css = file_get_contents(_MPDF_PATH.'mpdf.css');
  1123. $css2 = $this->ReadDefaultCSS($css);
  1124. $this->defaultCSS = $this->array_merge_recursive_unique($this->defaultCSS,$css2);
  1125. }
  1126. if ($default_font=='') {
  1127. if ($this->onlyCoreFonts) {
  1128. if (in_array(strtolower($this->defaultCSS['BODY']['FONT-FAMILY']),$this->mono_fonts)) { $default_font = 'ccourier'; }
  1129. else if (in_array(strtolower($this->defaultCSS['BODY']['FONT-FAMILY']),$this->sans_fonts)) { $default_font = 'chelvetica'; }
  1130. else { $default_font = 'ctimes'; }
  1131. }
  1132. else { $default_font = $this->defaultCSS['BODY']['FONT-FAMILY']; }
  1133. }
  1134. if (!$default_font_size) {
  1135. $mmsize = $this->ConvertSize($this->defaultCSS['BODY']['FONT-SIZE']);
  1136. $default_font_size = $mmsize*($this->k);
  1137. }
  1138. if ($default_font) { $this->SetDefaultFont($default_font); }
  1139. if ($default_font_size) { $this->SetDefaultFontSize($default_font_size); }
  1140. $this->SetLineHeight(); // lineheight is in mm
  1141. $this->SetFColor($this->ConvertColor(255));
  1142. $this->HREF='';
  1143. $this->oldy=-1;
  1144. $this->B=0;
  1145. $this->U=0;
  1146. $this->S=0;
  1147. $this->I=0;
  1148. $this->listlvl=0;
  1149. $this->listnum=0;
  1150. $this->listtype='';
  1151. $this->listoccur=array();
  1152. $this->listlist=array();
  1153. $this->listitem=array();
  1154. $this->tdbegin=false;
  1155. $this->table=array();
  1156. $this->cell=array();
  1157. $this->col=-1;
  1158. $this->row=-1;
  1159. $this->cellBorderBuffer = array();
  1160. $this->divbegin=false;
  1161. $this->divalign='';
  1162. $this->divwidth=0;
  1163. $this->divheight=0;
  1164. $this->spanbgcolor=false;
  1165. $this->divrevert=false;
  1166. $this->issetfont=false;
  1167. $this->issetcolor=false;
  1168. $this->blockjustfinished=false;
  1169. $this->listjustfinished=false;
  1170. $this->ignorefollowingspaces = true; //in order to eliminate exceeding left-side spaces
  1171. $this->toupper=false;
  1172. $this->tolower=false;
  1173. $this->capitalize=false;
  1174. $this->dash_on=false;
  1175. $this->dotted_on=false;
  1176. $this->SUP=false;
  1177. $this->SUB=false;
  1178. $this->strike=false;
  1179. $this->currentfontfamily='';
  1180. $this->currentfontsize='';
  1181. $this->currentfontstyle='';
  1182. $this->colorarray=array();
  1183. $this->spanbgcolorarray=array();
  1184. $this->textbuffer=array();
  1185. $this->CSS=array();
  1186. $this->internallink=array();
  1187. $this->basepath = "";
  1188. $this->SetBasePath('');
  1189. $this->outlineparam = array();
  1190. $this->outline_on = false;
  1191. $this->specialcontent = '';
  1192. $this->selectoption = array();
  1193. $this->usetableheader=false;
  1194. $this->usecss=true;
  1195. $this->usepre=true;
  1196. for($i=0;$i<256;$i++) {
  1197. $this->chrs[$i] = chr($i);
  1198. $this->ords[chr($i)] = $i;
  1199. }
  1200. /*-- IMPORTS --*/
  1201. $this->tpls = array();
  1202. $this->tpl = 0;
  1203. $this->tplprefix = "/TPL";
  1204. $this->res = array();
  1205. if ($this->enableImports) {
  1206. $this->SetImportUse();
  1207. }
  1208. /*-- END IMPORTS --*/
  1209. if ($this->progressBar) { $this->StartProgressBarOutput($this->progressBar) ; } // *PROGRESS-BAR*
  1210. }
  1211. function _setPageSize($format, &$orientation) {
  1212. //Page format
  1213. if(is_string($format))
  1214. {
  1215. if ($format=='') { $format = 'A4'; }
  1216. $pfo = 'P';
  1217. if(preg_match('/([0-9a-zA-Z]*)-L/i',$format,$m)) { // e.g. A4-L = A$ landscape
  1218. $format=$m[1];
  1219. $pfo='L';
  1220. }
  1221. $format = $this->_getPageFormat($format);
  1222. if (!$format) { $this->Error('Unknown page format: '.$format); }
  1223. else { $orientation = $pfo; }
  1224. $this->fwPt=$format[0];
  1225. $this->fhPt=$format[1];
  1226. }
  1227. else
  1228. {
  1229. if (!$format[0] || !$format[1]) { $this->Error('Invalid page format: '.$format[0].' '.$format[1]); }
  1230. $this->fwPt=$format[0]*$this->k;
  1231. $this->fhPt=$format[1]*$this->k;
  1232. }
  1233. $this->fw=$this->fwPt/$this->k;
  1234. $this->fh=$this->fhPt/$this->k;
  1235. //Page orientation
  1236. $orientation=strtolower($orientation);
  1237. if($orientation=='p' or $orientation=='portrait')
  1238. {
  1239. $orientation='P';
  1240. $this->wPt=$this->fwPt;
  1241. $this->hPt=$this->fhPt;
  1242. }
  1243. elseif($orientation=='l' or $orientation=='landscape')
  1244. {
  1245. $orientation='L';
  1246. $this->wPt=$this->fhPt;
  1247. $this->hPt=$this->fwPt;
  1248. }
  1249. else $this->Error('Incorrect orientation: '.$orientation);
  1250. $this->CurOrientation=$orientation;
  1251. $this->w=$this->wPt/$this->k;
  1252. $this->h=$this->hPt/$this->k;
  1253. }
  1254. function _getPageFormat($format) {
  1255. switch (strtoupper($format)) {
  1256. case '4A0': {$format = array(4767.87,6740.79); break;}
  1257. case '2A0': {$format = array(3370.39,4767.87); break;}
  1258. case 'A0': {$format = array(2383.94,3370.39); break;}
  1259. case 'A1': {$format = array(1683.78,2383.94); break;}
  1260. case 'A2': {$format = array(1190.55,1683.78); break;}
  1261. case 'A3': {$format = array(841.89,1190.55); break;}
  1262. case 'A4': default: {$format = array(595.28,841.89); break;}
  1263. case 'A5': {$format = array(419.53,595.28); break;}
  1264. case 'A6': {$format = array(297.64,419.53); break;}
  1265. case 'A7': {$format = array(209.76,297.64); break;}
  1266. case 'A8': {$format = array(147.40,209.76); break;}
  1267. case 'A9': {$format = array(104.88,147.40); break;}
  1268. case 'A10': {$format = array(73.70,104.88); break;}
  1269. case 'B0': {$format = array(2834.65,4008.19); break;}
  1270. case 'B1': {$format = array(2004.09,2834.65); break;}
  1271. case 'B2': {$format = array(1417.32,2004.09); break;}
  1272. case 'B3': {$format = array(1000.63,1417.32); break;}
  1273. case 'B4': {$format = array(708.66,1000.63); break;}
  1274. case 'B5': {$format = array(498.90,708.66); break;}
  1275. case 'B6': {$format = array(354.33,498.90); break;}
  1276. case 'B7': {$format = array(249.45,354.33); break;}
  1277. case 'B8': {$format = array(175.75,249.45); break;}
  1278. case 'B9': {$format = array(124.72,175.75); break;}
  1279. case 'B10': {$format = array(87.87,124.72); break;}
  1280. case 'C0': {$format = array(2599.37,3676.54); break;}
  1281. case 'C1': {$format = array(1836.85,2599.37); break;}
  1282. case 'C2': {$format = array(1298.27,1836.85); break;}
  1283. case 'C3': {$format = array(918.43,1298.27); break;}
  1284. case 'C4': {$format = array(649.13,918.43); break;}
  1285. case 'C5': {$format = array(459.21,649.13); break;}
  1286. case 'C6': {$format = array(323.15,459.21); break;}
  1287. case 'C7': {$format = array(229.61,323.15); break;}
  1288. case 'C8': {$format = array(161.57,229.61); break;}
  1289. case 'C9': {$format = array(113.39,161.57); break;}
  1290. case 'C10': {$format = array(79.37,113.39); break;}
  1291. case 'RA0': {$format = array(2437.80,3458.27); break;}
  1292. case 'RA1': {$format = array(1729.13,2437.80); break;}
  1293. case 'RA2': {$format = array(1218.90,1729.13); break;}
  1294. case 'RA3': {$format = array(864.57,1218.90); break;}
  1295. case 'RA4': {$format = array(609.45,864.57); break;}
  1296. case 'SRA0': {$format = array(2551.18,3628.35); break;}
  1297. case 'SRA1': {$format = array(1814.17,2551.18); break;}
  1298. case 'SRA2': {$format = array(1275.59,1814.17); break;}
  1299. case 'SRA3': {$format = array(907.09,1275.59); break;}
  1300. case 'SRA4': {$format = array(637.80,907.09); break;}
  1301. case 'LETTER': {$format = array(612.00,792.00); break;}
  1302. case 'LEGAL': {$format = array(612.00,1008.00); break;}
  1303. case 'EXECUTIVE': {$format = array(521.86,756.00); break;}
  1304. case 'FOLIO': {$format = array(612.00,936.00); break;}
  1305. case 'B': {$format=array(362.83,561.26 ); break;} // 'B' format paperback size 128x198mm
  1306. case 'A': {$format=array(314.65,504.57 ); break;} // 'A' format paperback size 111x178mm
  1307. case 'DEMY': {$format=array(382.68,612.28 ); break;} // 'Demy' format paperback size 135x216mm
  1308. case 'ROYAL': {$format=array(433.70,663.30 ); break;} // 'Royal' format paperback size 153x234mm
  1309. default: $format = false;
  1310. }
  1311. return $format;
  1312. }
  1313. /*-- PROGRESS-BAR --*/
  1314. function StartProgressBarOutput($mode=1) {
  1315. // must be relative path, or URI (not a file system path)
  1316. if (!defined('_MPDF_URI')) {
  1317. $this->progressBar = false;
  1318. if ($this->debug) { $this->Error("You need to define _MPDF_URI to use the progress bar!"); }
  1319. else return false;
  1320. }
  1321. $this->progressBar = $mode;
  1322. if ($this->progbar_altHTML) {
  1323. echo $this->progbar_altHTML;
  1324. }
  1325. else {
  1326. echo '<html>
  1327. <head>
  1328. <title>mPDF File Progress</title>
  1329. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  1330. <link rel="stylesheet" type="text/css" href="'._MPDF_URI.'progbar.css" />
  1331. </head>
  1332. <body>
  1333. <div class="main">
  1334. <div class="heading">'.$this->progbar_heading.'</div>
  1335. <div class="demo">
  1336. ';
  1337. if ($this->progressBar==2) { echo ' <table width="100%"><tr><td style="width: 50%;">
  1338. <span class="barheading">Writing HTML code</span> <br/>
  1339. <div class="progressBar">
  1340. <div id="element1" class="innerBar">&nbsp;</div>
  1341. </div>
  1342. <span class="code" id="box1"></span>
  1343. </td><td style="width: 50%;">
  1344. <span class="barheading">Autosizing elements</span> <br/>
  1345. <div class="progressBar">
  1346. <div id="element4" class="innerBar">&nbsp;</div>
  1347. </div>
  1348. <span class="code" id="box4"></span>
  1349. <br/><br/>
  1350. <span class="barheading">Writing Tables</span> <br/>
  1351. <div class="progressBar">
  1352. <div id="element7" class="innerBar">&nbsp;</div>
  1353. </div>
  1354. <span class="code" id="box7"></span>
  1355. </td></tr>
  1356. <tr><td><br /><br /></td><td></td></tr>
  1357. <tr><td style="width: 50%;">
  1358. '; }
  1359. echo ' <span class="barheading">Writing PDF file</span> <br/>
  1360. <div class="progressBar">
  1361. <div id="element2" class="innerBar">&nbsp;</div>
  1362. </div>
  1363. <span class="code" id="box2"></span>
  1364. ';
  1365. if ($this->progressBar==2) { echo '
  1366. </td><td style="width: 50%;">
  1367. <span class="barheading">Memory usage</span> <br/>
  1368. <div class="progressBar">
  1369. <div id="element5" class="innerBar">&nbsp;</div>
  1370. </div>
  1371. <span id="box5">0</span> '.ini_get("memory_limit").'<br />
  1372. <br/><br/>
  1373. <span class="barheading">Memory usage (peak)</span> <br/>
  1374. <div class="progressBar">
  1375. <div id="element6" class="innerBar">&nbsp;</div>
  1376. </div>
  1377. <span id="box6">0</span> '.ini_get("memory_limit").'<br />
  1378. </td></tr>
  1379. </table>
  1380. '; }
  1381. echo ' <br/><br/>
  1382. <span id="box3"></span>
  1383. </div>
  1384. ';
  1385. }
  1386. ob_flush();
  1387. flush();
  1388. }
  1389. function UpdateProgressBar($el,$val,$txt='') {
  1390. // $val should be a string - 5 = actual value, +15 = increment
  1391. if ($this->progressBar<2) {
  1392. if ($el>3) { return; }
  1393. else if ($el ==1) { $el = 2; }
  1394. }
  1395. echo '<script type="text/javascript">';
  1396. if ($val) { echo ' document.getElementById(\'element'.$el.'\').style.width=\''.$val.'%\'; '; }
  1397. if ($txt) { echo ' document.getElementById(\'box'.$el.'\').innerHTML=\''.$txt.'\'; '; }
  1398. if ($this->progressBar==2) {
  1399. $m = round(memory_get_usage()/1048576);
  1400. $m2 = round(memory_get_peak_usage()/1048576);
  1401. $mem = $m * 100 / (ini_get("memory_limit")+0);
  1402. $mem2 = $m2 * 100 / (ini_get("memory_limit")+0);
  1403. echo ' document.getElementById(\'element5\').style.width=\''.$mem.'%\'; ';
  1404. echo ' document.getElementById(\'element6\').style.width=\''.$mem2.'%\'; ';
  1405. echo ' document.getElementById(\'box5\').innerHTML=\''.$m.'MB / \'; ';
  1406. echo ' document.getElementById(\'box6\').innerHTML=\''.$m2.'MB / \'; ';
  1407. }
  1408. echo '</script>'."\n";
  1409. ob_flush();
  1410. flush();
  1411. }
  1412. /*-- END PROGRESS-BAR --*/
  1413. function RestrictUnicodeFonts($res) {
  1414. // $res = array of (Unicode) fonts to restrict to: e.g. norasi|norasiB - language specific
  1415. if (count($res)) { // Leave full list of available fonts if passed blank array
  1416. $this->available_unifonts = $res;
  1417. }
  1418. else { $this->available_unifonts = $this->default_available_fonts; }
  1419. if (count($this->available_unifonts) == 0) { $this->available_unifonts[] = $this->default_available_fonts[0]; }
  1420. $this->available_unifonts = array_values($this->available_unifonts);
  1421. }
  1422. function setMBencoding($enc) {
  1423. @mb_regex_encoding('UTF-8');
  1424. $curr = $this->mb_enc;
  1425. $this->mb_enc = $enc;
  1426. if (!$this->mb_enc || $curr != $this->mb_enc) {
  1427. mb_internal_encoding($this->mb_enc);
  1428. if ($enc == 'UTF-8') { @mb_regex_encoding('UTF-8'); }
  1429. // else if ($enc == 'windows-1252') { @mb_regex_encoding('ISO-8859-1'); }
  1430. }
  1431. }
  1432. function SetMargins($left,$right,$top) {
  1433. //Set left, top and right margins
  1434. $this->lMargin=$left;
  1435. $this->rMargin=$right;
  1436. $this->tMargin=$top;
  1437. }
  1438. function ResetMargins() {
  1439. //ReSet left, top margins
  1440. if (($this->forcePortraitHeaders || $this->forcePortraitMargins) && $this->DefOrientation=='P' && $this->CurOrientation=='L') {
  1441. if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN
  1442. $this->tMargin=$this->orig_rMargin;
  1443. $this->bMargin=$this->orig_lMargin;
  1444. }
  1445. else { // ODD // OR NOT MIRRORING MARGINS/FOOTERS
  1446. $this->tMargin=$this->orig_lMargin;
  1447. $this->bMargin=$this->orig_rMargin;
  1448. }
  1449. $this->lMargin=$this->DeflMargin;
  1450. $this->rMargin=$this->DefrMargin;
  1451. $this->MarginCorrection = 0;
  1452. $this->PageBreakTrigger=$this->h-$this->bMargin;
  1453. }
  1454. else if (($this->mirrorMargins) && (($this->page)%2==0)) { // EVEN
  1455. $this->lMargin=$this->DefrMargin;
  1456. $this->rMar