1<?php 2 3namespace Mpdf\Tag; 4 5use Mpdf\Css\Border; 6use Mpdf\Mpdf; 7 8class Table extends Tag 9{ 10 11 public function open($attr, &$ahtml, &$ihtml) 12 { 13 $this->mpdf->tdbegin = false; 14 $this->mpdf->lastoptionaltag = ''; 15 // Disable vertical justification in columns 16 if ($this->mpdf->ColActive) { 17 $this->mpdf->colvAlign = ''; 18 } // *COLUMNS* 19 if ($this->mpdf->lastblocklevelchange == 1) { 20 $blockstate = 1; 21 } // Top margins/padding only 22 elseif ($this->mpdf->lastblocklevelchange < 1) { 23 $blockstate = 0; 24 } // NO margins/padding 25 // called from block after new div e.g. <div> ... <table> ... Outputs block top margin/border and padding 26 if (count($this->mpdf->textbuffer) == 0 && $this->mpdf->lastblocklevelchange == 1 && !$this->mpdf->tableLevel && !$this->mpdf->kwt) { 27 $this->mpdf->newFlowingBlock($this->mpdf->blk[$this->mpdf->blklvl]['width'], $this->mpdf->lineheight, '', false, 1, true, $this->mpdf->blk[$this->mpdf->blklvl]['direction']); 28 $this->mpdf->finishFlowingBlock(true); // true = END of flowing block 29 } elseif (!$this->mpdf->tableLevel && count($this->mpdf->textbuffer)) { 30 $this->mpdf->printbuffer($this->mpdf->textbuffer, $blockstate); 31 } 32 33 $this->mpdf->textbuffer = []; 34 $this->mpdf->lastblocklevelchange = -1; 35 36 37 38 if ($this->mpdf->tableLevel) { // i.e. now a nested table coming... 39 // Save current level table 40 $this->mpdf->cell['PARENTCELL'] = $this->mpdf->saveInlineProperties(); 41 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['baseProperties'] = $this->mpdf->base_table_properties; 42 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells'] = $this->mpdf->cell; 43 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['currrow'] = $this->mpdf->row; 44 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['currcol'] = $this->mpdf->col; 45 } 46 $this->mpdf->tableLevel++; 47 $this->cssManager->tbCSSlvl++; 48 49 if ($this->mpdf->tableLevel > 1) { // inherit table properties from cell in which nested 50 //$this->mpdf->base_table_properties['FONT-KERNING'] = ($this->mpdf->textvar & TextVars::FC_KERNING); // mPDF 6 51 $this->mpdf->base_table_properties['LETTER-SPACING'] = $this->mpdf->lSpacingCSS; 52 $this->mpdf->base_table_properties['WORD-SPACING'] = $this->mpdf->wSpacingCSS; 53 // mPDF 6 54 $direction = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['direction']; 55 $txta = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['a']; 56 $cellLineHeight = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['cellLineHeight']; 57 $cellLineStackingStrategy = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['cellLineStackingStrategy']; 58 $cellLineStackingShift = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['cellLineStackingShift']; 59 } 60 61 if (isset($this->mpdf->tbctr[$this->mpdf->tableLevel])) { 62 $this->mpdf->tbctr[$this->mpdf->tableLevel] ++; 63 } else { 64 $this->mpdf->tbctr[$this->mpdf->tableLevel] = 1; 65 } 66 67 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['level'] = $this->mpdf->tableLevel; 68 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['levelid'] = $this->mpdf->tbctr[$this->mpdf->tableLevel]; 69 70 if ($this->mpdf->tableLevel > $this->mpdf->innermostTableLevel) { 71 $this->mpdf->innermostTableLevel = $this->mpdf->tableLevel; 72 } 73 if ($this->mpdf->tableLevel > 1) { 74 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nestedpos'] = [ 75 $this->mpdf->row, 76 $this->mpdf->col, 77 $this->mpdf->tbctr[$this->mpdf->tableLevel - 1], 78 ]; 79 } 80 //++++++++++++++++++++++++++++ 81 82 $this->mpdf->cell = []; 83 $this->mpdf->col = -1; //int 84 $this->mpdf->row = -1; //int 85 $table = &$this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]; 86 87 // New table - any level 88 $table['direction'] = $this->mpdf->directionality; 89 $table['bgcolor'] = false; 90 $table['va'] = false; 91 $table['txta'] = false; 92 $table['topntail'] = false; 93 $table['thead-underline'] = false; 94 $table['border'] = false; 95 $table['border_details']['R']['w'] = 0; 96 $table['border_details']['L']['w'] = 0; 97 $table['border_details']['T']['w'] = 0; 98 $table['border_details']['B']['w'] = 0; 99 $table['border_details']['R']['style'] = ''; 100 $table['border_details']['L']['style'] = ''; 101 $table['border_details']['T']['style'] = ''; 102 $table['border_details']['B']['style'] = ''; 103 $table['max_cell_border_width']['R'] = 0; 104 $table['max_cell_border_width']['L'] = 0; 105 $table['max_cell_border_width']['T'] = 0; 106 $table['max_cell_border_width']['B'] = 0; 107 $table['padding']['L'] = false; 108 $table['padding']['R'] = false; 109 $table['padding']['T'] = false; 110 $table['padding']['B'] = false; 111 $table['margin']['L'] = false; 112 $table['margin']['R'] = false; 113 $table['margin']['T'] = false; 114 $table['margin']['B'] = false; 115 $table['a'] = false; 116 $table['border_spacing_H'] = false; 117 $table['border_spacing_V'] = false; 118 $table['decimal_align'] = false; 119 $this->mpdf->Reset(); 120 $this->mpdf->InlineProperties = []; 121 $this->mpdf->InlineBDF = []; // mPDF 6 122 $this->mpdf->InlineBDFctr = 0; // mPDF 6 123 $table['nc'] = $table['nr'] = 0; 124 $this->mpdf->tablethead = 0; 125 $this->mpdf->tabletfoot = 0; 126 $this->mpdf->tabletheadjustfinished = false; 127 128 // mPDF 6 129 if ($this->mpdf->tableLevel > 1) { // inherit table properties from cell in which nested 130 $table['direction'] = $direction; 131 $table['txta'] = $txta; 132 $table['cellLineHeight'] = $cellLineHeight; 133 $table['cellLineStackingStrategy'] = $cellLineStackingStrategy; 134 $table['cellLineStackingShift'] = $cellLineStackingShift; 135 } 136 137 138 $lastbottommargin = 0; 139 if ($this->mpdf->blockjustfinished && !count($this->mpdf->textbuffer) && $this->mpdf->y != $this->mpdf->tMargin && $this->mpdf->collapseBlockMargins && $this->mpdf->tableLevel == 1) { 140 $lastbottommargin = $this->mpdf->lastblockbottommargin; 141 } 142 $this->mpdf->lastblockbottommargin = 0; 143 $this->mpdf->blockjustfinished = false; 144 145 if ($this->mpdf->tableLevel == 1) { 146 $table['headernrows'] = 0; 147 $table['footernrows'] = 0; 148 $this->mpdf->base_table_properties = []; 149 } 150 151 // ADDED CSS FUNCIONS FOR TABLE 152 if ($this->cssManager->tbCSSlvl == 1) { 153 $properties = $this->cssManager->MergeCSS('TOPTABLE', 'TABLE', $attr); 154 } else { 155 $properties = $this->cssManager->MergeCSS('TABLE', 'TABLE', $attr); 156 } 157 158 $w = ''; 159 if (isset($properties['WIDTH'])) { 160 $w = $properties['WIDTH']; 161 } elseif (!empty($attr['WIDTH'])) { 162 $w = $attr['WIDTH']; 163 } 164 165 if (isset($attr['ALIGN']) && array_key_exists(strtolower($attr['ALIGN']), self::ALIGN)) { 166 $table['a'] = $this->getAlign($attr['ALIGN']); 167 } 168 if (!$table['a']) { 169 if ($table['direction'] === 'rtl') { 170 $table['a'] = 'R'; 171 } else { 172 $table['a'] = 'L'; 173 } 174 } 175 176 if (!empty($properties['DIRECTION'])) { 177 $table['direction'] = strtolower($properties['DIRECTION']); 178 } elseif (!empty($attr['DIR'])) { 179 $table['direction'] = strtolower($attr['DIR']); 180 } elseif ($this->mpdf->tableLevel == 1) { 181 $table['direction'] = $this->mpdf->blk[$this->mpdf->blklvl]['direction']; 182 } 183 184 if (isset($properties['BACKGROUND-COLOR'])) { 185 if ($table['bgcolor'] === false) { // @todo cleaner initialization 186 $table['bgcolor'] = []; 187 } 188 $table['bgcolor'][-1] = $properties['BACKGROUND-COLOR']; 189 } elseif (isset($properties['BACKGROUND'])) { 190 if ($table['bgcolor'] === false) { 191 $table['bgcolor'] = []; 192 } 193 $table['bgcolor'][-1] = $properties['BACKGROUND']; 194 } elseif (isset($attr['BGCOLOR'])) { 195 if ($table['bgcolor'] === false) { 196 $table['bgcolor'] = []; 197 } 198 $table['bgcolor'][-1] = $attr['BGCOLOR']; 199 } 200 201 if (isset($properties['VERTICAL-ALIGN']) && array_key_exists(strtolower($properties['VERTICAL-ALIGN']), self::ALIGN)) { 202 $table['va'] = $this->getAlign($properties['VERTICAL-ALIGN']); 203 } 204 if (isset($properties['TEXT-ALIGN']) && array_key_exists(strtolower($properties['TEXT-ALIGN']), self::ALIGN)) { 205 $table['txta'] = $this->getAlign($properties['TEXT-ALIGN']); 206 } 207 208 if (!empty($properties['AUTOSIZE']) && $this->mpdf->tableLevel == 1) { 209 $this->mpdf->shrink_this_table_to_fit = $properties['AUTOSIZE']; 210 if ($this->mpdf->shrink_this_table_to_fit < 1) { 211 $this->mpdf->shrink_this_table_to_fit = 0; 212 } 213 } 214 if (!empty($properties['ROTATE']) && $this->mpdf->tableLevel == 1) { 215 $this->mpdf->table_rotate = $properties['ROTATE']; 216 } 217 if (isset($properties['TOPNTAIL'])) { 218 $table['topntail'] = $properties['TOPNTAIL']; 219 } 220 if (isset($properties['THEAD-UNDERLINE'])) { 221 $table['thead-underline'] = $properties['THEAD-UNDERLINE']; 222 } 223 224 if (isset($properties['BORDER'])) { 225 $bord = $this->mpdf->border_details($properties['BORDER']); 226 if ($bord['s']) { 227 $table['border'] = Border::ALL; 228 $table['border_details']['R'] = $bord; 229 $table['border_details']['L'] = $bord; 230 $table['border_details']['T'] = $bord; 231 $table['border_details']['B'] = $bord; 232 } 233 } 234 if (isset($properties['BORDER-RIGHT'])) { 235 if ($table['direction'] === 'rtl') { // *OTL* 236 $table['border_details']['R'] = $this->mpdf->border_details($properties['BORDER-LEFT']); // *OTL* 237 } // *OTL* 238 else { // *OTL* 239 $table['border_details']['R'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); 240 } // *OTL* 241 $this->mpdf->setBorder($table['border'], Border::RIGHT, $table['border_details']['R']['s']); 242 } 243 if (isset($properties['BORDER-LEFT'])) { 244 if ($table['direction'] === 'rtl') { // *OTL* 245 $table['border_details']['L'] = $this->mpdf->border_details($properties['BORDER-RIGHT']); // *OTL* 246 } // *OTL* 247 else { // *OTL* 248 $table['border_details']['L'] = $this->mpdf->border_details($properties['BORDER-LEFT']); 249 } // *OTL* 250 $this->mpdf->setBorder($table['border'], Border::LEFT, $table['border_details']['L']['s']); 251 } 252 if (isset($properties['BORDER-BOTTOM'])) { 253 $table['border_details']['B'] = $this->mpdf->border_details($properties['BORDER-BOTTOM']); 254 $this->mpdf->setBorder($table['border'], Border::BOTTOM, $table['border_details']['B']['s']); 255 } 256 if (isset($properties['BORDER-TOP'])) { 257 $table['border_details']['T'] = $this->mpdf->border_details($properties['BORDER-TOP']); 258 $this->mpdf->setBorder($table['border'], Border::TOP, $table['border_details']['T']['s']); 259 } 260 261 $this->mpdf->table_border_css_set = 0; 262 if ($table['border']) { 263 $this->mpdf->table_border_css_set = 1; 264 } 265 266 // mPDF 6 267 if (!empty($properties['LANG'])) { 268 if ($this->mpdf->autoLangToFont && !$this->mpdf->usingCoreFont) { 269 if ($properties['LANG'] != $this->mpdf->default_lang && $properties['LANG'] !== 'UTF-8') { 270 list ($coreSuitable, $mpdf_pdf_unifont) = $this->languageToFont->getLanguageOptions($properties['LANG'], $this->mpdf->useAdobeCJK); 271 if ($mpdf_pdf_unifont) { 272 $properties['FONT-FAMILY'] = $mpdf_pdf_unifont; 273 } 274 } 275 } 276 $this->mpdf->currentLang = $properties['LANG']; 277 } 278 279 280 if (isset($properties['FONT-FAMILY'])) { 281 $this->mpdf->default_font = $properties['FONT-FAMILY']; 282 $this->mpdf->SetFont($this->mpdf->default_font, '', 0, false); 283 } 284 $this->mpdf->base_table_properties['FONT-FAMILY'] = $this->mpdf->FontFamily; 285 286 if (isset($properties['FONT-SIZE'])) { 287 if ($this->mpdf->tableLevel > 1) { 288 $tableFontSize = $this->sizeConverter->convert($this->mpdf->base_table_properties['FONT-SIZE']); 289 $mmsize = $this->sizeConverter->convert($properties['FONT-SIZE'], $tableFontSize); 290 } else { 291 $mmsize = $this->sizeConverter->convert($properties['FONT-SIZE'], $this->mpdf->default_font_size / Mpdf::SCALE); 292 } 293 if ($mmsize) { 294 $this->mpdf->default_font_size = $mmsize * Mpdf::SCALE; 295 $this->mpdf->SetFontSize($this->mpdf->default_font_size, false); 296 } 297 } 298 $this->mpdf->base_table_properties['FONT-SIZE'] = $this->mpdf->FontSize . 'mm'; 299 300 if (isset($properties['FONT-WEIGHT'])) { 301 if (strtoupper($properties['FONT-WEIGHT']) === 'BOLD') { 302 $this->mpdf->base_table_properties['FONT-WEIGHT'] = 'BOLD'; 303 } 304 } 305 if (isset($properties['FONT-STYLE'])) { 306 if (strtoupper($properties['FONT-STYLE']) === 'ITALIC') { 307 $this->mpdf->base_table_properties['FONT-STYLE'] = 'ITALIC'; 308 } 309 } 310 if (isset($properties['COLOR'])) { 311 $this->mpdf->base_table_properties['COLOR'] = $properties['COLOR']; 312 } 313 if (isset($properties['FONT-KERNING'])) { 314 $this->mpdf->base_table_properties['FONT-KERNING'] = $properties['FONT-KERNING']; 315 } 316 if (isset($properties['LETTER-SPACING'])) { 317 $this->mpdf->base_table_properties['LETTER-SPACING'] = $properties['LETTER-SPACING']; 318 } 319 if (isset($properties['WORD-SPACING'])) { 320 $this->mpdf->base_table_properties['WORD-SPACING'] = $properties['WORD-SPACING']; 321 } 322 // mPDF 6 323 if (isset($properties['HYPHENS'])) { 324 $this->mpdf->base_table_properties['HYPHENS'] = $properties['HYPHENS']; 325 } 326 if (!empty($properties['LINE-HEIGHT'])) { 327 $table['cellLineHeight'] = $this->mpdf->fixLineheight($properties['LINE-HEIGHT']); 328 } elseif ($this->mpdf->tableLevel == 1) { 329 $table['cellLineHeight'] = $this->mpdf->blk[$this->mpdf->blklvl]['line_height']; 330 } 331 332 if (!empty($properties['LINE-STACKING-STRATEGY'])) { 333 $table['cellLineStackingStrategy'] = strtolower($properties['LINE-STACKING-STRATEGY']); 334 } elseif ($this->mpdf->tableLevel == 1 && isset($this->mpdf->blk[$this->mpdf->blklvl]['line_stacking_strategy'])) { 335 $table['cellLineStackingStrategy'] = $this->mpdf->blk[$this->mpdf->blklvl]['line_stacking_strategy']; 336 } else { 337 $table['cellLineStackingStrategy'] = 'inline-line-height'; 338 } 339 340 if (!empty($properties['LINE-STACKING-SHIFT'])) { 341 $table['cellLineStackingShift'] = strtolower($properties['LINE-STACKING-SHIFT']); 342 } elseif ($this->mpdf->tableLevel == 1 && isset($this->mpdf->blk[$this->mpdf->blklvl]['line_stacking_shift'])) { 343 $table['cellLineStackingShift'] = $this->mpdf->blk[$this->mpdf->blklvl]['line_stacking_shift']; 344 } else { 345 $table['cellLineStackingShift'] = 'consider-shifts'; 346 } 347 348 if (isset($properties['PADDING-LEFT'])) { 349 $table['padding']['L'] = $this->sizeConverter->convert($properties['PADDING-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 350 } 351 if (isset($properties['PADDING-RIGHT'])) { 352 $table['padding']['R'] = $this->sizeConverter->convert($properties['PADDING-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 353 } 354 if (isset($properties['PADDING-TOP'])) { 355 $table['padding']['T'] = $this->sizeConverter->convert($properties['PADDING-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 356 } 357 if (isset($properties['PADDING-BOTTOM'])) { 358 $table['padding']['B'] = $this->sizeConverter->convert($properties['PADDING-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 359 } 360 361 if (isset($properties['MARGIN-TOP'])) { 362 if ($lastbottommargin) { 363 $tmp = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 364 if ($tmp > $lastbottommargin) { 365 $properties['MARGIN-TOP'] = (int) $properties['MARGIN-TOP'] - $lastbottommargin; 366 } else { 367 $properties['MARGIN-TOP'] = 0; 368 } 369 } 370 $table['margin']['T'] = $this->sizeConverter->convert($properties['MARGIN-TOP'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 371 } 372 373 if (isset($properties['MARGIN-BOTTOM'])) { 374 $table['margin']['B'] = $this->sizeConverter->convert($properties['MARGIN-BOTTOM'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 375 } 376 if (isset($properties['MARGIN-LEFT'])) { 377 $table['margin']['L'] = $this->sizeConverter->convert($properties['MARGIN-LEFT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 378 } 379 380 if (isset($properties['MARGIN-RIGHT'])) { 381 $table['margin']['R'] = $this->sizeConverter->convert($properties['MARGIN-RIGHT'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 382 } 383 if (isset($properties['MARGIN-LEFT'], $properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-LEFT']) === 'auto' && strtolower($properties['MARGIN-RIGHT']) === 'auto') { 384 $table['a'] = 'C'; 385 } elseif (isset($properties['MARGIN-LEFT']) && strtolower($properties['MARGIN-LEFT']) === 'auto') { 386 $table['a'] = 'R'; 387 } elseif (isset($properties['MARGIN-RIGHT']) && strtolower($properties['MARGIN-RIGHT']) === 'auto') { 388 $table['a'] = 'L'; 389 } 390 391 if (isset($properties['BORDER-COLLAPSE']) && strtoupper($properties['BORDER-COLLAPSE']) === 'SEPARATE') { 392 $table['borders_separate'] = true; 393 } else { 394 $table['borders_separate'] = false; 395 } 396 397 // mPDF 5.7.3 398 399 if (isset($properties['BORDER-SPACING-H'])) { 400 $table['border_spacing_H'] = $this->sizeConverter->convert($properties['BORDER-SPACING-H'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 401 } 402 if (isset($properties['BORDER-SPACING-V'])) { 403 $table['border_spacing_V'] = $this->sizeConverter->convert($properties['BORDER-SPACING-V'], $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 404 } 405 // mPDF 5.7.3 406 if (!$table['borders_separate']) { 407 $table['border_spacing_H'] = $table['border_spacing_V'] = 0; 408 } 409 410 if (isset($properties['EMPTY-CELLS'])) { 411 $table['empty_cells'] = strtolower($properties['EMPTY-CELLS']); // 'hide' or 'show' 412 } else { 413 $table['empty_cells'] = ''; 414 } 415 416 if (isset($properties['PAGE-BREAK-INSIDE']) && strtoupper($properties['PAGE-BREAK-INSIDE']) === 'AVOID' && $this->mpdf->tableLevel == 1 && !$this->mpdf->writingHTMLfooter) { 417 $this->mpdf->table_keep_together = true; 418 } elseif ($this->mpdf->tableLevel == 1) { 419 $this->mpdf->table_keep_together = false; 420 } 421 if (isset($properties['PAGE-BREAK-AFTER']) && $this->mpdf->tableLevel == 1) { 422 $table['page_break_after'] = strtoupper($properties['PAGE-BREAK-AFTER']); 423 } 424 425 /* -- BACKGROUNDS -- */ 426 if (isset($properties['BACKGROUND-GRADIENT']) && !$this->mpdf->kwt && !$this->mpdf->ColActive) { 427 $table['gradient'] = $properties['BACKGROUND-GRADIENT']; 428 } 429 430 if (!empty($properties['BACKGROUND-IMAGE']) && !$this->mpdf->kwt && !$this->mpdf->ColActive) { 431 $ret = $this->mpdf->SetBackground($properties, $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']); 432 if ($ret) { 433 $table['background-image'] = $ret; 434 } 435 } 436 /* -- END BACKGROUNDS -- */ 437 438 if (isset($properties['OVERFLOW'])) { 439 $table['overflow'] = strtolower($properties['OVERFLOW']); // 'hidden' 'wrap' or 'visible' or 'auto' 440 if (($this->mpdf->ColActive || $this->mpdf->tableLevel > 1) && $table['overflow'] === 'visible') { 441 unset($table['overflow']); 442 } 443 } 444 445 if (isset($attr['CELLPADDING'])) { 446 $table['cell_padding'] = $attr['CELLPADDING']; 447 } else { 448 $table['cell_padding'] = false; 449 } 450 451 if (isset($attr['BORDER']) && $attr['BORDER'] == '1') { 452 $this->mpdf->table_border_attr_set = 1; 453 $bord = $this->mpdf->border_details('#000000 1px solid'); 454 if ($bord['s']) { 455 $table['border'] = Border::ALL; 456 $table['border_details']['R'] = $bord; 457 $table['border_details']['L'] = $bord; 458 $table['border_details']['T'] = $bord; 459 $table['border_details']['B'] = $bord; 460 } 461 } else { 462 $this->mpdf->table_border_attr_set = 0; 463 } 464 465 if ($w) { 466 $maxwidth = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']; 467 if ($table['borders_separate']) { 468 $tblblw = $table['margin']['L'] + $table['margin']['R'] + $table['border_details']['L']['w'] / 2 + $table['border_details']['R']['w'] / 2; 469 } else { 470 $tblblw = $table['margin']['L'] + $table['margin']['R'] + $table['max_cell_border_width']['L'] / 2 + $table['max_cell_border_width']['R'] / 2; 471 } 472 if (strpos($w, '%') && $this->mpdf->tableLevel == 1 && !$this->mpdf->ignore_table_percents) { 473 // % needs to be of inner box without table margins etc. 474 $maxwidth -= $tblblw; 475 $wmm = $this->sizeConverter->convert($w, $maxwidth, $this->mpdf->FontSize, false); 476 $table['w'] = $wmm + $tblblw; 477 } 478 if (strpos($w, '%') && $this->mpdf->tableLevel > 1 && !$this->mpdf->ignore_table_percents && $this->mpdf->keep_table_proportions) { 479 $table['wpercent'] = (int) $w; // makes 80% -> 80 480 } 481 if (!strpos($w, '%') && !$this->mpdf->ignore_table_widths) { 482 $wmm = $this->sizeConverter->convert($w, $this->mpdf->blk[$this->mpdf->blklvl]['inner_width'], $this->mpdf->FontSize, false); 483 $table['w'] = $wmm + $tblblw; 484 } 485 if (!$this->mpdf->keep_table_proportions) { 486 if (isset($table['w']) && $table['w'] > $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']) { 487 $table['w'] = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']; 488 } 489 } 490 } 491 492 if (isset($attr['AUTOSIZE']) && $this->mpdf->tableLevel == 1) { 493 $this->mpdf->shrink_this_table_to_fit = $attr['AUTOSIZE']; 494 if ($this->mpdf->shrink_this_table_to_fit < 1) { 495 $this->mpdf->shrink_this_table_to_fit = 1; 496 } 497 } 498 if (isset($attr['ROTATE']) && $this->mpdf->tableLevel == 1) { 499 $this->mpdf->table_rotate = $attr['ROTATE']; 500 } 501 502 //++++++++++++++++++++++++++++ 503 if ($this->mpdf->table_rotate) { 504 $this->mpdf->tbrot_Links = []; 505 $this->mpdf->tbrot_Annots = []; 506 $this->mpdf->tbrotForms = []; 507 $this->mpdf->tbrot_BMoutlines = []; 508 $this->mpdf->tbrot_toc = []; 509 } 510 511 if ($this->mpdf->kwt) { 512 if ($this->mpdf->table_rotate) { 513 $this->mpdf->table_keep_together = true; 514 } 515 $this->mpdf->kwt = false; 516 $this->mpdf->kwt_saved = true; 517 } 518 519 //++++++++++++++++++++++++++++ 520 $this->mpdf->plainCell_properties = []; 521 unset($table); 522 } 523 524 public function close(&$ahtml, &$ihtml) 525 { 526 527 $this->mpdf->lastoptionaltag = ''; 528 unset($this->cssManager->tablecascadeCSS[$this->cssManager->tbCSSlvl]); 529 $this->cssManager->tbCSSlvl--; 530 $this->mpdf->ignorefollowingspaces = true; //Eliminate exceeding left-side spaces 531 // mPDF 5.7.3 532 // In case a colspan (on a row after first row) exceeded number of columns in table 533 for ($k = 0; $k < $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nr']; $k++) { 534 for ($l = 0; $l < $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nc']; $l++) { 535 if (!isset($this->mpdf->cell[$k][$l])) { 536 for ($n = $l - 1; $n >= 0; $n--) { 537 if (isset($this->mpdf->cell[$k][$n]) && $this->mpdf->cell[$k][$n] != 0) { 538 break; 539 } 540 } 541 $this->mpdf->cell[$k][$l] = [ 542 'a' => 'C', 543 'va' => 'M', 544 'R' => false, 545 'nowrap' => false, 546 'bgcolor' => false, 547 'padding' => ['L' => false, 'R' => false, 'T' => false, 'B' => false], 548 'gradient' => false, 549 's' => 0, 550 'maxs' => 0, 551 'textbuffer' => [], 552 'dfs' => $this->mpdf->FontSize, 553 ]; 554 555 if (!$this->mpdf->simpleTables) { 556 $this->mpdf->cell[$k][$l]['border'] = 0; 557 $this->mpdf->cell[$k][$l]['border_details']['R'] = ['s' => 0, 'w' => 0, 'c' => false, 'style' => 'none', 'dom' => 0]; 558 $this->mpdf->cell[$k][$l]['border_details']['L'] = ['s' => 0, 'w' => 0, 'c' => false, 'style' => 'none', 'dom' => 0]; 559 $this->mpdf->cell[$k][$l]['border_details']['T'] = ['s' => 0, 'w' => 0, 'c' => false, 'style' => 'none', 'dom' => 0]; 560 $this->mpdf->cell[$k][$l]['border_details']['B'] = ['s' => 0, 'w' => 0, 'c' => false, 'style' => 'none', 'dom' => 0]; 561 $this->mpdf->cell[$k][$l]['border_details']['mbw'] = ['BL' => 0, 'BR' => 0, 'RT' => 0, 'RB' => 0, 'TL' => 0, 'TR' => 0, 'LT' => 0, 'LB' => 0]; 562 if ($this->mpdf->packTableData) { 563 $this->mpdf->cell[$k][$l]['borderbin'] = $this->mpdf->_packCellBorder($this->mpdf->cell[$k][$l]); 564 unset($this->mpdf->cell[$k][$l]['border'], $this->mpdf->cell[$k][$l]['border_details']); 565 } 566 } 567 } 568 } 569 } 570 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells'] = $this->mpdf->cell; 571 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['wc'] = array_pad( 572 [], 573 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nc'], 574 ['miw' => 0, 'maw' => 0] 575 ); 576 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['hr'] = array_pad( 577 [], 578 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nr'], 579 0 580 ); 581 582 // Move table footer <tfoot> row to end of table 583 if (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot']) 584 && count($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'])) { 585 $tfrows = []; 586 foreach ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'] as $r => $val) { 587 if ($val) { 588 $tfrows[] = $r; 589 } 590 } 591 $temp = []; 592 $temptf = []; 593 foreach ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells'] as $k => $row) { 594 if (in_array($k, $tfrows)) { 595 $temptf[] = $row; 596 } else { 597 $temp[] = $row; 598 } 599 } 600 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'] = []; 601 for ($i = count($temp); $i < (count($temp) + count($temptf)); $i++) { 602 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['is_tfoot'][$i] = true; 603 } 604 // Update nestedpos row references 605 if (isset($this->mpdf->table[$this->mpdf->tableLevel + 1]) && count($this->mpdf->table[$this->mpdf->tableLevel + 1])) { 606 foreach ($this->mpdf->table[$this->mpdf->tableLevel + 1] as $nid => $nested) { 607 $this->mpdf->table[$this->mpdf->tableLevel + 1][$nid]['nestedpos'][0] -= count($temptf); 608 } 609 } 610 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells'] = array_merge($temp, $temptf); 611 612 // Update other arays set on row number 613 // [trbackground-images] [trgradients] 614 $temptrbgi = []; 615 $temptrbgg = []; 616 $temptrbgc = []; 617 if (isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][-1])) { 618 $temptrbgc[-1] = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][-1]; 619 } 620 for ($k = 0; $k < $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nr']; $k++) { 621 if (!in_array($k, $tfrows)) { 622 $temptrbgi[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'][$k]) 623 ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'][$k] 624 : null; 625 $temptrbgg[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'][$k]) 626 ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'][$k] 627 : null; 628 $temptrbgc[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$k]) 629 ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$k] 630 : null; 631 } 632 } 633 for ($k = 0; $k < $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['nr']; $k++) { 634 if (in_array($k, $tfrows)) { 635 $temptrbgi[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'][$k]) 636 ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'][$k] 637 : null; 638 $temptrbgg[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'][$k]) 639 ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'][$k] 640 : null; 641 $temptrbgc[] = isset($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$k]) 642 ? $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'][$k] 643 : null; 644 } 645 } 646 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trbackground-images'] = $temptrbgi; 647 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['trgradients'] = $temptrbgg; 648 $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['bgcolor'] = $temptrbgc; 649 // Should Update all other arays set on row number, but cell properties have been set so not needed 650 // [bgcolor] [trborder-left] [trborder-right] [trborder-top] [trborder-bottom] 651 } 652 653 if ($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['direction'] === 'rtl') { 654 $this->mpdf->_reverseTableDir($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]); 655 } 656 657 // Fix Borders ********************************************* 658 $this->mpdf->_fixTableBorders($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]); 659 660 if ($this->mpdf->ColActive) { 661 $this->mpdf->table_rotate = 0; 662 } // *COLUMNS* 663 if ($this->mpdf->table_rotate <> 0) { 664 $this->mpdf->tablebuffer = ''; 665 // Max width for rotated table 666 $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 1); 667 $this->mpdf->tbrot_maxh = $this->mpdf->blk[$this->mpdf->blklvl]['inner_width']; // Max width for rotated table 668 $this->mpdf->tbrot_align = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['a']; 669 } 670 $this->mpdf->shrin_k = 1; 671 672 if ($this->mpdf->shrink_tables_to_fit < 1) { 673 $this->mpdf->shrink_tables_to_fit = 1; 674 } 675 if (!$this->mpdf->shrink_this_table_to_fit) { 676 $this->mpdf->shrink_this_table_to_fit = $this->mpdf->shrink_tables_to_fit; 677 } 678 679 if ($this->mpdf->tableLevel > 1) { 680 // deal with nested table 681 682 $this->mpdf->_tableColumnWidth($this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]], true); 683 684 $tmiw = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['miw']; 685 $tmaw = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['maw']; 686 $tl = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['tl']; 687 688 // Go down to lower table level 689 $this->mpdf->tableLevel--; 690 691 // Reset lower level table 692 $this->mpdf->base_table_properties = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['baseProperties']; 693 // mPDF 5.7.3 694 $this->mpdf->default_font = $this->mpdf->base_table_properties['FONT-FAMILY']; 695 $this->mpdf->SetFont($this->mpdf->default_font, '', 0, false); 696 $this->mpdf->default_font_size = $this->sizeConverter->convert($this->mpdf->base_table_properties['FONT-SIZE']) * Mpdf::SCALE; 697 $this->mpdf->SetFontSize($this->mpdf->default_font_size, false); 698 699 $this->mpdf->cell = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['cells']; 700 if (isset($this->mpdf->cell['PARENTCELL'])) { 701 if ($this->mpdf->cell['PARENTCELL']) { 702 $this->mpdf->restoreInlineProperties($this->mpdf->cell['PARENTCELL']); 703 } 704 unset($this->mpdf->cell['PARENTCELL']); 705 } 706 $this->mpdf->row = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['currrow']; 707 $this->mpdf->col = $this->mpdf->table[$this->mpdf->tableLevel][$this->mpdf->tbctr[$this->mpdf->tableLevel]]['currcol']; 708 $objattr = []; 709 $objattr['type'] = 'nestedtable'; 710 $objattr['nestedcontent'] = $this->mpdf->tbctr[$this->mpdf->tableLevel + 1]; 711 $objattr['table'] = $this->mpdf->tbctr[$this->mpdf->tableLevel]; 712 $objattr['row'] = $this->mpdf->row; 713 $objattr['col'] = $this->mpdf->col; 714 $objattr['level'] = $this->mpdf->tableLevel; 715 $e = "\xbb\xa4\xactype=nestedtable,objattr=" . serialize($objattr) . "\xbb\xa4\xac"; 716 $this->mpdf->_saveCellTextBuffer($e); 717 $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] += $tl; 718 if (!isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'])) { 719 $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; 720 } elseif ($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] < $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']) { 721 $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['maxs'] = $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s']; 722 } 723 $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['s'] = 0; // reset 724 if ((isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmaw']) && $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmaw'] < $tmaw) 725 || !isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmaw'])) { 726 $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmaw'] = $tmaw; 727 } 728 if ((isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmiw']) && $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmiw'] < $tmiw) 729 || !isset($this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmiw'])) { 730 $this->mpdf->cell[$this->mpdf->row][$this->mpdf->col]['nestedmiw'] = $tmiw; 731 } 732 $this->mpdf->tdbegin = true; 733 $this->mpdf->nestedtablejustfinished = true; 734 $this->mpdf->ignorefollowingspaces = true; 735 return; 736 } 737 $this->mpdf->cMarginL = 0; 738 $this->mpdf->cMarginR = 0; 739 $this->mpdf->cMarginT = 0; 740 $this->mpdf->cMarginB = 0; 741 $this->mpdf->cellPaddingL = 0; 742 $this->mpdf->cellPaddingR = 0; 743 $this->mpdf->cellPaddingT = 0; 744 $this->mpdf->cellPaddingB = 0; 745 746 if (isset($this->mpdf->table[1][1]['overflow']) && $this->mpdf->table[1][1]['overflow'] === 'visible') { 747 if ($this->mpdf->kwt || $this->mpdf->table_rotate || $this->mpdf->table_keep_together || $this->mpdf->ColActive) { 748 $this->mpdf->kwt = false; 749 $this->mpdf->table_rotate = 0; 750 $this->mpdf->table_keep_together = false; 751 //throw new \Mpdf\MpdfException("mPDF Warning: You cannot use CSS overflow:visible together with any of these functions: 752 // 'Keep-with-table', rotated tables, page-break-inside:avoid, or columns"); 753 } 754 $this->mpdf->_tableColumnWidth($this->mpdf->table[1][1], true); 755 $this->mpdf->_tableWidth($this->mpdf->table[1][1]); 756 } else { 757 if (!$this->mpdf->kwt_saved) { 758 $this->mpdf->kwt_height = 0; 759 } 760 761 list($check, $tablemiw) = $this->mpdf->_tableColumnWidth($this->mpdf->table[1][1], true); 762 $save_table = $this->mpdf->table; 763 $reset_to_minimum_width = false; 764 $added_page = false; 765 766 if ($check > 1) { 767 if ($check > $this->mpdf->shrink_this_table_to_fit && $this->mpdf->table_rotate) { 768 if ($this->mpdf->y != $this->mpdf->tMargin) { 769 $this->mpdf->AddPage($this->mpdf->CurOrientation); 770 $this->mpdf->kwt_moved = true; 771 } 772 $added_page = true; 773 $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; 774 //$check = $tablemiw/$this->mpdf->tbrot_maxw; // undo any shrink 775 $check = 1; // undo any shrink 776 } 777 $reset_to_minimum_width = true; 778 } 779 780 if ($reset_to_minimum_width) { 781 $this->mpdf->shrin_k = $check; 782 783 $this->mpdf->default_font_size /= $this->mpdf->shrin_k; 784 $this->mpdf->SetFontSize($this->mpdf->default_font_size, false); 785 786 $this->mpdf->shrinkTable($this->mpdf->table[1][1], $this->mpdf->shrin_k); 787 788 $this->mpdf->_tableColumnWidth($this->mpdf->table[1][1]); // repeat 789 // Starting at $this->mpdf->innermostTableLevel 790 // Shrink table values - and redo columnWidth 791 for ($lvl = 2; $lvl <= $this->mpdf->innermostTableLevel; $lvl++) { 792 for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { 793 $this->mpdf->shrinkTable($this->mpdf->table[$lvl][$nid], $this->mpdf->shrin_k); 794 $this->mpdf->_tableColumnWidth($this->mpdf->table[$lvl][$nid]); 795 } 796 } 797 } 798 799 // Set table cell widths for top level table 800 // Use $shrin_k to resize but don't change again 801 $this->mpdf->SetLineHeight('', $this->mpdf->table[1][1]['cellLineHeight']); 802 803 // Top level table 804 $this->mpdf->_tableWidth($this->mpdf->table[1][1]); 805 } 806 807 // Now work through any nested tables setting child table[w'] = parent cell['w'] 808 // Now do nested tables _tableWidth 809 for ($lvl = 2; $lvl <= $this->mpdf->innermostTableLevel; $lvl++) { 810 for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { 811 // HERE set child table width = cell width 812 813 list($parentrow, $parentcol, $parentnid) = $this->mpdf->table[$lvl][$nid]['nestedpos']; 814 815 $c = & $this->mpdf->table[$lvl - 1][$parentnid]['cells'][$parentrow][$parentcol]; 816 817 if (isset($c['colspan']) && $c['colspan'] > 1) { 818 $parentwidth = 0; 819 for ($cs = 0; $cs < $c['colspan']; $cs++) { 820 $parentwidth += $this->mpdf->table[$lvl - 1][$parentnid]['wc'][$parentcol + $cs]; 821 } 822 } else { 823 $parentwidth = $this->mpdf->table[$lvl - 1][$parentnid]['wc'][$parentcol]; 824 } 825 826 //$parentwidth -= ALLOW FOR PADDING ETC. in parent cell 827 if (!$this->mpdf->simpleTables) { 828 if ($this->mpdf->packTableData) { 829 list($bt, $br, $bb, $bl) = $this->mpdf->_getBorderWidths($c['borderbin']); 830 } else { 831 $br = $c['border_details']['R']['w']; 832 $bl = $c['border_details']['L']['w']; 833 } 834 if ($this->mpdf->table[$lvl - 1][$parentnid]['borders_separate']) { 835 $parentwidth -= $br + $bl + $c['padding']['L'] + $c['padding']['R'] + $this->mpdf->table[$lvl - 1][$parentnid]['border_spacing_H']; 836 } else { 837 $parentwidth -= $br / 2 + $bl / 2 + $c['padding']['L'] + $c['padding']['R']; 838 } 839 } elseif ($this->mpdf->simpleTables) { 840 if ($this->mpdf->table[$lvl - 1][$parentnid]['borders_separate']) { 841 $parentwidth -= $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['L']['w'] 842 + $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['R']['w'] + $c['padding']['L'] 843 + $c['padding']['R'] + $this->mpdf->table[$lvl - 1][$parentnid]['border_spacing_H']; 844 } else { 845 $parentwidth -= $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['L']['w'] / 2 846 + $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['R']['w'] / 2 + $c['padding']['L'] + $c['padding']['R']; 847 } 848 } 849 if (!empty($this->mpdf->table[$lvl][$nid]['wpercent']) && $lvl > 1) { 850 $this->mpdf->table[$lvl][$nid]['w'] = $parentwidth; 851 } elseif ($parentwidth > $this->mpdf->table[$lvl][$nid]['maw']) { 852 $this->mpdf->table[$lvl][$nid]['w'] = $this->mpdf->table[$lvl][$nid]['maw']; 853 } else { 854 $this->mpdf->table[$lvl][$nid]['w'] = $parentwidth; 855 } 856 unset($c); 857 $this->mpdf->_tableWidth($this->mpdf->table[$lvl][$nid]); 858 } 859 } 860 861 // Starting at $this->mpdf->innermostTableLevel 862 // Cascade back up nested tables: setting heights back up the tree 863 for ($lvl = $this->mpdf->innermostTableLevel; $lvl > 0; $lvl--) { 864 for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { 865 list($tableheight, $maxrowheight, $fullpage, $remainingpage, $maxfirstrowheight) = $this->mpdf->_tableHeight($this->mpdf->table[$lvl][$nid]); 866 } 867 } 868 869 if ($this->mpdf->table[1][1]['overflow'] === 'visible') { 870 if ($maxrowheight > $fullpage) { 871 throw new \Mpdf\MpdfException('mPDF Warning: A Table row is greater than available height. You cannot use CSS overflow:visible'); 872 } 873 if ($maxfirstrowheight > $remainingpage) { 874 $this->mpdf->AddPage($this->mpdf->CurOrientation); 875 } 876 $r = 0; 877 $c = 0; 878 $p = 0; 879 $y = 0; 880 $finished = false; 881 while (!$finished) { 882 list($finished, $r, $c, $p, $y, $y0) = $this->mpdf->_tableWrite($this->mpdf->table[1][1], true, $r, $c, $p, $y); 883 if (!$finished) { 884 $this->mpdf->AddPage($this->mpdf->CurOrientation); 885 // If printed something on first spread, set same y 886 if ($r == 0 && $y0 > -1) { 887 $this->mpdf->y = $y0; 888 } 889 } 890 } 891 } else { 892 $recalculate = 1; 893 $forcerecalc = false; 894 // RESIZING ALGORITHM 895 if ($maxrowheight > $fullpage) { 896 $recalculate = $this->tbsqrt($maxrowheight / $fullpage, 1); 897 $forcerecalc = true; 898 } elseif ($this->mpdf->table_rotate) { // NB $remainingpage == $fullpage == the width of the page 899 if ($tableheight > $remainingpage) { 900 // If can fit on remainder of page whilst respecting autsize value.. 901 if (($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $remainingpage, 1)) <= $this->mpdf->shrink_this_table_to_fit) { 902 $recalculate = $this->tbsqrt($tableheight / $remainingpage, 1); 903 } elseif (!$added_page) { 904 if ($this->mpdf->y != $this->mpdf->tMargin) { 905 $this->mpdf->AddPage($this->mpdf->CurOrientation); 906 $this->mpdf->kwt_moved = true; 907 } 908 $added_page = true; 909 $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; 910 // 0.001 to force it to recalculate 911 $recalculate = (1 / $this->mpdf->shrin_k) + 0.001; // undo any shrink 912 } 913 } else { 914 $recalculate = 1; 915 } 916 } elseif ($this->mpdf->table_keep_together || ($this->mpdf->table[1][1]['nr'] == 1 && !$this->mpdf->writingHTMLfooter)) { 917 if ($tableheight > $fullpage) { 918 if (($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $fullpage, 1)) <= $this->mpdf->shrink_this_table_to_fit) { 919 $recalculate = $this->tbsqrt($tableheight / $fullpage, 1); 920 } elseif ($this->mpdf->tableMinSizePriority) { 921 $this->mpdf->table_keep_together = false; 922 $recalculate = 1.001; 923 } else { 924 if ($this->mpdf->y != $this->mpdf->tMargin) { 925 $this->mpdf->AddPage($this->mpdf->CurOrientation); 926 $this->mpdf->kwt_moved = true; 927 } 928 $added_page = true; 929 $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; 930 $recalculate = $this->tbsqrt($tableheight / $fullpage, 1); 931 } 932 } elseif ($tableheight > $remainingpage) { 933 // If can fit on remainder of page whilst respecting autsize value.. 934 if (($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $remainingpage, 1)) <= $this->mpdf->shrink_this_table_to_fit) { 935 $recalculate = $this->tbsqrt($tableheight / $remainingpage, 1); 936 } else { 937 if ($this->mpdf->y != $this->mpdf->tMargin) { 938 // mPDF 6 939 if ($this->mpdf->AcceptPageBreak()) { 940 $this->mpdf->AddPage($this->mpdf->CurOrientation); 941 } elseif ($this->mpdf->ColActive && $tableheight > (($this->mpdf->h - $this->mpdf->bMargin) - $this->mpdf->y0)) { 942 $this->mpdf->AddPage($this->mpdf->CurOrientation); 943 } 944 $this->mpdf->kwt_moved = true; 945 } 946 $added_page = true; 947 $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; 948 $recalculate = 1.001; 949 } 950 } else { 951 $recalculate = 1; 952 } 953 } else { 954 $recalculate = 1; 955 } 956 957 if ($recalculate > $this->mpdf->shrink_this_table_to_fit && !$forcerecalc) { 958 $recalculate = $this->mpdf->shrink_this_table_to_fit; 959 } 960 961 $iteration = 1; 962 963 // RECALCULATE 964 while ($recalculate <> 1) { 965 $this->mpdf->shrin_k1 = $recalculate; 966 $this->mpdf->shrin_k *= $recalculate; 967 $this->mpdf->default_font_size /= $this->mpdf->shrin_k1; 968 $this->mpdf->SetFontSize($this->mpdf->default_font_size, false); 969 $this->mpdf->SetLineHeight('', $this->mpdf->table[1][1]['cellLineHeight']); 970 $this->mpdf->table = $save_table; 971 if ($this->mpdf->shrin_k <> 1) { 972 $this->mpdf->shrinkTable($this->mpdf->table[1][1], $this->mpdf->shrin_k); 973 } 974 $this->mpdf->_tableColumnWidth($this->mpdf->table[1][1]); // repeat 975 // Starting at $this->mpdf->innermostTableLevel 976 // Shrink table values - and redo columnWidth 977 for ($lvl = 2; $lvl <= $this->mpdf->innermostTableLevel; $lvl++) { 978 for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { 979 if ($this->mpdf->shrin_k <> 1) { 980 $this->mpdf->shrinkTable($this->mpdf->table[$lvl][$nid], $this->mpdf->shrin_k); 981 } 982 $this->mpdf->_tableColumnWidth($this->mpdf->table[$lvl][$nid]); 983 } 984 } 985 // Set table cell widths for top level table 986 // Top level table 987 $this->mpdf->_tableWidth($this->mpdf->table[1][1]); 988 989 // Now work through any nested tables setting child table[w'] = parent cell['w'] 990 // Now do nested tables _tableWidth 991 for ($lvl = 2; $lvl <= $this->mpdf->innermostTableLevel; $lvl++) { 992 for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { 993 // HERE set child table width = cell width 994 995 list($parentrow, $parentcol, $parentnid) = $this->mpdf->table[$lvl][$nid]['nestedpos']; 996 $c = & $this->mpdf->table[$lvl - 1][$parentnid]['cells'][$parentrow][$parentcol]; 997 998 if (isset($c['colspan']) && $c['colspan'] > 1) { 999 $parentwidth = 0; 1000 for ($cs = 0; $cs < $c['colspan']; $cs++) { 1001 $parentwidth += $this->mpdf->table[$lvl - 1][$parentnid]['wc'][$parentcol + $cs]; 1002 } 1003 } else { 1004 $parentwidth = $this->mpdf->table[$lvl - 1][$parentnid]['wc'][$parentcol]; 1005 } 1006 1007 //$parentwidth -= ALLOW FOR PADDING ETC.in parent cell 1008 if (!$this->mpdf->simpleTables) { 1009 if ($this->mpdf->packTableData) { 1010 list($bt, $br, $bb, $bl) = $this->mpdf->_getBorderWidths($c['borderbin']); 1011 } else { 1012 $br = $c['border_details']['R']['w']; 1013 $bl = $c['border_details']['L']['w']; 1014 } 1015 if ($this->mpdf->table[$lvl - 1][$parentnid]['borders_separate']) { 1016 $parentwidth -= $br + $bl + $c['padding']['L'] + $c['padding']['R'] + $this->mpdf->table[$lvl - 1][$parentnid]['border_spacing_H']; 1017 } else { 1018 $parentwidth -= $br / 2 + $bl / 2 + $c['padding']['L'] + $c['padding']['R']; 1019 } 1020 } elseif ($this->mpdf->simpleTables) { 1021 if ($this->mpdf->table[$lvl - 1][$parentnid]['borders_separate']) { 1022 $parentwidth -= $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['L']['w'] 1023 + $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['R']['w'] + $c['padding']['L'] + $c['padding']['R'] 1024 + $this->mpdf->table[$lvl - 1][$parentnid]['border_spacing_H']; 1025 } else { 1026 $parentwidth -= ($this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['L']['w'] 1027 + $this->mpdf->table[$lvl - 1][$parentnid]['simple']['border_details']['R']['w']) / 2 + $c['padding']['L'] + $c['padding']['R']; 1028 } 1029 } 1030 if (!empty($this->mpdf->table[$lvl][$nid]['wpercent']) && $lvl > 1) { 1031 $this->mpdf->table[$lvl][$nid]['w'] = $parentwidth; 1032 } elseif ($parentwidth > $this->mpdf->table[$lvl][$nid]['maw']) { 1033 $this->mpdf->table[$lvl][$nid]['w'] = $this->mpdf->table[$lvl][$nid]['maw']; 1034 } else { 1035 $this->mpdf->table[$lvl][$nid]['w'] = $parentwidth; 1036 } 1037 unset($c); 1038 $this->mpdf->_tableWidth($this->mpdf->table[$lvl][$nid]); 1039 } 1040 } 1041 1042 // Starting at $this->mpdf->innermostTableLevel 1043 // Cascade back up nested tables: setting heights back up the tree 1044 for ($lvl = $this->mpdf->innermostTableLevel; $lvl > 0; $lvl--) { 1045 for ($nid = 1; $nid <= $this->mpdf->tbctr[$lvl]; $nid++) { 1046 list($tableheight, $maxrowheight, $fullpage, $remainingpage, $maxfirstrowheight) = $this->mpdf->_tableHeight($this->mpdf->table[$lvl][$nid]); 1047 } 1048 } 1049 1050 // RESIZING ALGORITHM 1051 1052 if ($maxrowheight > $fullpage) { 1053 $recalculate = $this->tbsqrt($maxrowheight / $fullpage, $iteration); 1054 $iteration++; 1055 } elseif ($this->mpdf->table_rotate && $tableheight > $remainingpage && !$added_page) { 1056 // If can fit on remainder of page whilst respecting autosize value.. 1057 if (($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $remainingpage, $iteration)) <= $this->mpdf->shrink_this_table_to_fit) { 1058 $recalculate = $this->tbsqrt($tableheight / $remainingpage, $iteration); 1059 $iteration++; 1060 } else { 1061 if (!$added_page) { 1062 $this->mpdf->AddPage($this->mpdf->CurOrientation); 1063 $added_page = true; 1064 $this->mpdf->kwt_moved = true; 1065 $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; 1066 } 1067 // 0.001 to force it to recalculate 1068 $recalculate = (1 / $this->mpdf->shrin_k) + 0.001; // undo any shrink 1069 } 1070 } elseif ($this->mpdf->table_keep_together || ($this->mpdf->table[1][1]['nr'] == 1 && !$this->mpdf->writingHTMLfooter)) { 1071 if ($tableheight > $fullpage) { 1072 if (($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $fullpage, $iteration)) <= $this->mpdf->shrink_this_table_to_fit) { 1073 $recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); 1074 $iteration++; 1075 } elseif ($this->mpdf->tableMinSizePriority) { 1076 $this->mpdf->table_keep_together = false; 1077 $recalculate = (1 / $this->mpdf->shrin_k) + 0.001; 1078 } else { 1079 if (!$added_page && $this->mpdf->y != $this->mpdf->tMargin) { 1080 $this->mpdf->AddPage($this->mpdf->CurOrientation); 1081 $added_page = true; 1082 $this->mpdf->kwt_moved = true; 1083 $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; 1084 } 1085 $recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); 1086 $iteration++; 1087 } 1088 } elseif ($tableheight > $remainingpage) { 1089 // If can fit on remainder of page whilst respecting autosize value.. 1090 if (($this->mpdf->shrin_k * $this->tbsqrt($tableheight / $remainingpage, $iteration)) <= $this->mpdf->shrink_this_table_to_fit) { 1091 $recalculate = $this->tbsqrt($tableheight / $remainingpage, $iteration); 1092 $iteration++; 1093 } else { 1094 if (!$added_page) { 1095 // mPDF 6 1096 if ($this->mpdf->AcceptPageBreak()) { 1097 $this->mpdf->AddPage($this->mpdf->CurOrientation); 1098 } elseif ($this->mpdf->ColActive && $tableheight > (($this->mpdf->h - $this->mpdf->bMargin) - $this->mpdf->y0)) { 1099 $this->mpdf->AddPage($this->mpdf->CurOrientation); 1100 } 1101 $added_page = true; 1102 $this->mpdf->kwt_moved = true; 1103 $this->mpdf->tbrot_maxw = $this->mpdf->h - ($this->mpdf->y + $this->mpdf->bMargin + 5) - $this->mpdf->kwt_height; 1104 } 1105 1106 //$recalculate = $this->tbsqrt($tableheight / $fullpage, $iteration); $iteration++; 1107 $recalculate = (1 / $this->mpdf->shrin_k) + 0.001; // undo any shrink 1108 } 1109 } else { 1110 $recalculate = 1; 1111 } 1112 } else { 1113 $recalculate = 1; 1114 } 1115 } 1116 1117 if ($maxfirstrowheight > $remainingpage && !$added_page && !$this->mpdf->table_rotate && !$this->mpdf->ColActive 1118 && !$this->mpdf->table_keep_together && !$this->mpdf->writingHTMLheader && !$this->mpdf->writingHTMLfooter) { 1119 $this->mpdf->AddPage($this->mpdf->CurOrientation); 1120 $this->mpdf->kwt_moved = true; 1121 } 1122 1123 // keep-with-table: if page has advanced, print out buffer now, else done in fn. _Tablewrite() 1124 if ($this->mpdf->kwt_saved && $this->mpdf->kwt_moved) { 1125 $this->mpdf->printkwtbuffer(); 1126 $this->mpdf->kwt_moved = false; 1127 $this->mpdf->kwt_saved = false; 1128 } 1129 1130 // Recursively writes all tables starting at top level 1131 $this->mpdf->_tableWrite($this->mpdf->table[1][1]); 1132 1133 if ($this->mpdf->table_rotate && $this->mpdf->tablebuffer) { 1134 $this->mpdf->PageBreakTrigger = $this->mpdf->h - $this->mpdf->bMargin; 1135 $save_tr = $this->mpdf->table_rotate; 1136 $save_y = $this->mpdf->y; 1137 $this->mpdf->table_rotate = 0; 1138 $this->mpdf->y = $this->mpdf->tbrot_y0; 1139 $h = $this->mpdf->tbrot_w; 1140 $this->mpdf->DivLn($h, $this->mpdf->blklvl); 1141 1142 $this->mpdf->table_rotate = $save_tr; 1143 $this->mpdf->y = $save_y; 1144 1145 $this->mpdf->printtablebuffer(); 1146 } 1147 $this->mpdf->table_rotate = 0; 1148 } 1149 1150 1151 $this->mpdf->x = $this->mpdf->lMargin + $this->mpdf->blk[$this->mpdf->blklvl]['outer_left_margin']; 1152 1153 $this->mpdf->maxPosR = max($this->mpdf->maxPosR, $this->mpdf->x + $this->mpdf->table[1][1]['w']); 1154 1155 $this->mpdf->blockjustfinished = true; 1156 $this->mpdf->lastblockbottommargin = $this->mpdf->table[1][1]['margin']['B']; 1157 //Reset values 1158 1159 $page_break_after = ''; 1160 if (isset($this->mpdf->table[1][1]['page_break_after'])) { 1161 $page_break_after = $this->mpdf->table[1][1]['page_break_after']; 1162 } 1163 1164 // Keep-with-table 1165 $this->mpdf->kwt = false; 1166 $this->mpdf->kwt_y0 = 0; 1167 $this->mpdf->kwt_x0 = 0; 1168 $this->mpdf->kwt_height = 0; 1169 $this->mpdf->kwt_buffer = []; 1170 $this->mpdf->kwt_Links = []; 1171 $this->mpdf->kwt_Annots = []; 1172 $this->mpdf->kwt_moved = false; 1173 $this->mpdf->kwt_saved = false; 1174 1175 $this->mpdf->kwt_Reference = []; 1176 $this->mpdf->kwt_BMoutlines = []; 1177 $this->mpdf->kwt_toc = []; 1178 1179 $this->mpdf->shrin_k = 1; 1180 $this->mpdf->shrink_this_table_to_fit = 0; 1181 1182 $this->mpdf->table = []; //array 1183 $this->mpdf->tableLevel = 0; 1184 $this->mpdf->tbctr = []; 1185 $this->mpdf->innermostTableLevel = 0; 1186 $this->cssManager->tbCSSlvl = 0; 1187 $this->cssManager->tablecascadeCSS = []; 1188 1189 $this->mpdf->cell = []; //array 1190 1191 $this->mpdf->col = -1; //int 1192 $this->mpdf->row = -1; //int 1193 1194 $this->mpdf->Reset(); 1195 1196 $this->mpdf->cellPaddingL = 0; 1197 $this->mpdf->cellPaddingT = 0; 1198 $this->mpdf->cellPaddingR = 0; 1199 $this->mpdf->cellPaddingB = 0; 1200 $this->mpdf->cMarginL = 0; 1201 $this->mpdf->cMarginT = 0; 1202 $this->mpdf->cMarginR = 0; 1203 $this->mpdf->cMarginB = 0; 1204 $this->mpdf->default_font_size = $this->mpdf->original_default_font_size; 1205 $this->mpdf->default_font = $this->mpdf->original_default_font; 1206 $this->mpdf->SetFontSize($this->mpdf->default_font_size, false); 1207 $this->mpdf->SetFont($this->mpdf->default_font, '', 0, false); 1208 $this->mpdf->SetLineHeight(); 1209 1210 if (isset($this->mpdf->blk[$this->mpdf->blklvl]['InlineProperties'])) { 1211 $this->mpdf->restoreInlineProperties($this->mpdf->blk[$this->mpdf->blklvl]['InlineProperties']); 1212 } 1213 1214 if ($page_break_after) { 1215 $save_blklvl = $this->mpdf->blklvl; 1216 $save_blk = $this->mpdf->blk; 1217 $save_silp = $this->mpdf->saveInlineProperties(); 1218 $save_ilp = $this->mpdf->InlineProperties; 1219 $save_bflp = $this->mpdf->InlineBDF; 1220 $save_bflpc = $this->mpdf->InlineBDFctr; // mPDF 6 1221 // mPDF 6 pagebreaktype 1222 $startpage = $this->mpdf->page; 1223 $pagebreaktype = $this->mpdf->defaultPagebreakType; 1224 if ($this->mpdf->ColActive) { 1225 $pagebreaktype = 'cloneall'; 1226 } 1227 1228 // mPDF 6 pagebreaktype 1229 $this->mpdf->_preForcedPagebreak($pagebreaktype); 1230 1231 if ($page_break_after === 'RIGHT') { 1232 $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-ODD'); 1233 } elseif ($page_break_after === 'LEFT') { 1234 $this->mpdf->AddPage($this->mpdf->CurOrientation, 'NEXT-EVEN'); 1235 } else { 1236 $this->mpdf->AddPage($this->mpdf->CurOrientation); 1237 } 1238 1239 // mPDF 6 pagebreaktype 1240 $this->mpdf->_postForcedPagebreak($pagebreaktype, $startpage, $save_blk, $save_blklvl); 1241 1242 $this->mpdf->InlineProperties = $save_ilp; 1243 $this->mpdf->InlineBDF = $save_bflp; 1244 $this->mpdf->InlineBDFctr = $save_bflpc; // mPDF 6 1245 $this->mpdf->restoreInlineProperties($save_silp); 1246 } 1247 } 1248 1249 /** 1250 * This function determines the shrink factor when resizing tables 1251 * val is the table_height / page_height_available 1252 * returns a scaling factor used as $shrin_k to resize the table 1253 * Overcompensating will be quicker but may unnecessarily shrink table too much 1254 * Undercompensating means it will reiterate more times (taking more processing time) 1255 */ 1256 private function tbsqrt($val, $iteration = 3) 1257 { 1258 // Alters number of iterations until it returns $val itself - Must be > 2 1259 $k = 4; 1260 1261 // Probably best guess and most accurate 1262 if ($iteration === 1) { 1263 return sqrt($val); 1264 } 1265 1266 // Faster than using sqrt (because it won't undercompensate), and gives reasonable results 1267 // return 1 + (($val - 1) / 2); 1268 $x = 2 - (($iteration - 2) / ($k - 2)); 1269 1270 if ($x === 0) { 1271 $ret = $val + 0.00001; 1272 } elseif ($x < 0) { 1273 $ret = 1 + ( pow(2, ($iteration - 2 - $k)) / 1000 ); 1274 } else { 1275 $ret = 1 + (($val - 1) / $x); 1276 } 1277 1278 return $ret; 1279 } 1280 1281} 1282