Example #1
0
 /**
  * Draw an HTML block border and fill
  * @param $tag (array) array of tag properties.
  * @param $xmax (int) end X coordinate for border.
  * @protected
  * @since 5.7.000 (2010-08-03)
  */
 protected function drawHTMLTagBorder($tag, $xmax)
 {
     if (!isset($tag['borderposition'])) {
         // nothing to draw
         return;
     }
     $prev_x = $this->x;
     $prev_y = $this->y;
     $prev_lasth = $this->lasth;
     $border = 0;
     $fill = false;
     $this->lasth = 0;
     if (isset($tag['border']) and !empty($tag['border'])) {
         // get border style
         $border = $tag['border'];
         if (!TCPDF_STATIC::empty_string($this->thead) and !$this->inthead) {
             // border for table header
             $border = TCPDF_STATIC::getBorderMode($border, $position = 'middle', $this->opencell);
         }
     }
     if (isset($tag['bgcolor']) and $tag['bgcolor'] !== false) {
         // get background color
         $old_bgcolor = $this->bgcolor;
         $this->SetFillColorArray($tag['bgcolor']);
         $fill = true;
     }
     if (!$border and !$fill) {
         // nothing to draw
         return;
     }
     if (isset($tag['attribute']['cellspacing'])) {
         $clsp = $this->getHTMLUnitToUnits($tag['attribute']['cellspacing'], 1, 'px');
         $cellspacing = array('H' => $clsp, 'V' => $clsp);
     } elseif (isset($tag['border-spacing'])) {
         $cellspacing = $tag['border-spacing'];
     } else {
         $cellspacing = array('H' => 0, 'V' => 0);
     }
     if ($tag['value'] != 'table' and is_array($border) and !empty($border)) {
         // draw the border externally respect the sqare edge.
         $border['mode'] = 'ext';
     }
     if ($this->rtl) {
         if ($xmax >= $tag['borderposition']['x']) {
             $xmax = $tag['borderposition']['xmax'];
         }
         $w = $tag['borderposition']['x'] - $xmax;
     } else {
         if ($xmax <= $tag['borderposition']['x']) {
             $xmax = $tag['borderposition']['xmax'];
         }
         $w = $xmax - $tag['borderposition']['x'];
     }
     if ($w <= 0) {
         return;
     }
     $w += $cellspacing['H'];
     $startpage = $tag['borderposition']['page'];
     $startcolumn = $tag['borderposition']['column'];
     $x = $tag['borderposition']['x'];
     $y = $tag['borderposition']['y'];
     $endpage = $this->page;
     $starty = $tag['borderposition']['y'] - $cellspacing['V'];
     $currentY = $this->y;
     $this->x = $x;
     // get latest column
     $endcolumn = $this->current_column;
     if ($this->num_columns == 0) {
         $this->num_columns = 1;
     }
     // get border modes
     $border_start = TCPDF_STATIC::getBorderMode($border, $position = 'start', $this->opencell);
     $border_end = TCPDF_STATIC::getBorderMode($border, $position = 'end', $this->opencell);
     $border_middle = TCPDF_STATIC::getBorderMode($border, $position = 'middle', $this->opencell);
     // temporary disable page regions
     $temp_page_regions = $this->page_regions;
     $this->page_regions = array();
     // design borders around HTML cells.
     for ($page = $startpage; $page <= $endpage; ++$page) {
         // for each page
         $ccode = '';
         $this->setPage($page);
         if ($this->num_columns < 2) {
             // single-column mode
             $this->x = $x;
             $this->y = $this->tMargin;
         }
         // account for margin changes
         if ($page > $startpage) {
             if ($this->rtl and $this->pagedim[$page]['orm'] != $this->pagedim[$startpage]['orm']) {
                 $this->x -= $this->pagedim[$page]['orm'] - $this->pagedim[$startpage]['orm'];
             } elseif (!$this->rtl and $this->pagedim[$page]['olm'] != $this->pagedim[$startpage]['olm']) {
                 $this->x += $this->pagedim[$page]['olm'] - $this->pagedim[$startpage]['olm'];
             }
         }
         if ($startpage == $endpage) {
             // single page
             for ($column = $startcolumn; $column <= $endcolumn; ++$column) {
                 // for each column
                 $this->selectColumn($column);
                 if ($startcolumn == $endcolumn) {
                     // single column
                     $cborder = $border;
                     $h = $currentY - $y + $cellspacing['V'];
                     $this->y = $starty;
                 } elseif ($column == $startcolumn) {
                     // first column
                     $cborder = $border_start;
                     $this->y = $starty;
                     $h = $this->h - $this->y - $this->bMargin;
                 } elseif ($column == $endcolumn) {
                     // end column
                     $cborder = $border_end;
                     $h = $currentY - $this->y;
                 } else {
                     // middle column
                     $cborder = $border_middle;
                     $h = $this->h - $this->y - $this->bMargin;
                 }
                 $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true) . "\n";
             }
             // end for each column
         } elseif ($page == $startpage) {
             // first page
             for ($column = $startcolumn; $column < $this->num_columns; ++$column) {
                 // for each column
                 $this->selectColumn($column);
                 if ($column == $startcolumn) {
                     // first column
                     $cborder = $border_start;
                     $this->y = $starty;
                     $h = $this->h - $this->y - $this->bMargin;
                 } else {
                     // middle column
                     $cborder = $border_middle;
                     $h = $this->h - $this->y - $this->bMargin;
                 }
                 $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true) . "\n";
             }
             // end for each column
         } elseif ($page == $endpage) {
             // last page
             for ($column = 0; $column <= $endcolumn; ++$column) {
                 // for each column
                 $this->selectColumn($column);
                 if ($column == $endcolumn) {
                     // end column
                     $cborder = $border_end;
                     $h = $currentY - $this->y;
                 } else {
                     // middle column
                     $cborder = $border_middle;
                     $h = $this->h - $this->y - $this->bMargin;
                 }
                 $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true) . "\n";
             }
             // end for each column
         } else {
             // middle page
             for ($column = 0; $column < $this->num_columns; ++$column) {
                 // for each column
                 $this->selectColumn($column);
                 $cborder = $border_middle;
                 $h = $this->h - $this->y - $this->bMargin;
                 $ccode .= $this->getCellCode($w, $h, '', $cborder, 1, '', $fill, '', 0, true) . "\n";
             }
             // end for each column
         }
         if ($cborder or $fill) {
             $offsetlen = strlen($ccode);
             // draw border and fill
             if ($this->inxobj) {
                 // we are inside an XObject template
                 if (end($this->xobjects[$this->xobjid]['transfmrk']) !== false) {
                     $pagemarkkey = key($this->xobjects[$this->xobjid]['transfmrk']);
                     $pagemark = $this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey];
                     $this->xobjects[$this->xobjid]['transfmrk'][$pagemarkkey] += $offsetlen;
                 } else {
                     $pagemark = $this->xobjects[$this->xobjid]['intmrk'];
                     $this->xobjects[$this->xobjid]['intmrk'] += $offsetlen;
                 }
                 $pagebuff = $this->xobjects[$this->xobjid]['outdata'];
                 $pstart = substr($pagebuff, 0, $pagemark);
                 $pend = substr($pagebuff, $pagemark);
                 $this->xobjects[$this->xobjid]['outdata'] = $pstart . $ccode . $pend;
             } else {
                 if (end($this->transfmrk[$this->page]) !== false) {
                     $pagemarkkey = key($this->transfmrk[$this->page]);
                     $pagemark = $this->transfmrk[$this->page][$pagemarkkey];
                 } elseif ($this->InFooter) {
                     $pagemark = $this->footerpos[$this->page];
                 } else {
                     $pagemark = $this->intmrk[$this->page];
                 }
                 $pagebuff = $this->getPageBuffer($this->page);
                 $pstart = substr($pagebuff, 0, $pagemark);
                 $pend = substr($pagebuff, $pagemark);
                 $this->setPageBuffer($this->page, $pstart . $ccode . $pend);
                 $this->bordermrk[$this->page] += $offsetlen;
                 $this->cntmrk[$this->page] += $offsetlen;
             }
         }
     }
     // end for each page
     // restore page regions
     $this->page_regions = $temp_page_regions;
     if (isset($old_bgcolor)) {
         // restore background color
         $this->SetFillColorArray($old_bgcolor);
     }
     // restore pointer position
     $this->x = $prev_x;
     $this->y = $prev_y;
     $this->lasth = $prev_lasth;
 }