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