From 58461d8d46d1b1e92805b2153761f09411453d65 Mon Sep 17 00:00:00 2001 From: Rudolf Hangl Date: Mon, 20 Apr 2009 08:27:48 +0000 Subject: [PATCH] --- include/xslfo2pdf/fo_layout.php | 1382 +++++++++++++++---------------- 1 file changed, 691 insertions(+), 691 deletions(-) diff --git a/include/xslfo2pdf/fo_layout.php b/include/xslfo2pdf/fo_layout.php index 8d95679de..9eb674052 100644 --- a/include/xslfo2pdf/fo_layout.php +++ b/include/xslfo2pdf/fo_layout.php @@ -1,691 +1,691 @@ - -initLocalAttribute($node, "border-top-style"); - $this->initLocalAttribute($node, "border-right-style"); - $this->initLocalAttribute($node, "border-bottom-style"); - $this->initLocalAttribute($node, "border-left-style"); - $this->initLocalAttribute($node, "border-style"); - $this->initLocalAttribute($node, "border-top-color"); - $this->initLocalAttribute($node, "border-right-color"); - $this->initLocalAttribute($node, "border-bottom-color"); - $this->initLocalAttribute($node, "border-left-color"); - $this->initLocalAttribute($node, "border-color"); - $this->initLocalSizeAttribute($node, "border-top-width"); - $this->initLocalSizeAttribute($node, "border-right-width"); - $this->initLocalSizeAttribute($node, "border-bottom-width"); - $this->initLocalSizeAttribute($node, "border-left-width"); - $this->initLocalSizeAttribute($node, "border-width"); - $this->initAttribute($node, "font-style"); - $this->initAttribute($node, "font-weight"); - $this->initSizeAttribute($node, "font-size", "pt"); - $this->initAttribute($node, "font-family"); - $this->initAttribute($node, "color"); - $this->initLocalSizeAttribute($node, "width"); - $this->initLocalSizeAttribute($node, "height"); - $this->initLocalAttribute($node, "background-color"); - $this->initLocalAttribute($node, "background-image"); - $this->initLocalSizeAttribute($node, "space-before.optimum"); - $this->initLocalSizeAttribute($node, "space-after.optimum"); - $this->initLocalAttribute($node, "break-before"); - $this->initLocalAttribute($node, "break-after"); - $this->initSizeAttribute($node, "line-height"); - $this->initLocalSizeAttribute($node, "padding-top"); - //$this->initLocalSizeAttribute($node, "padding-bottom"); - $this->initLocalSizeAttribute($node, "padding-left"); - //$this->initLocalSizeAttribute($node, "padding-right"); - } - - //oesi - convertiert die daten von utf8 nach latin1 und ersetzt 'EURO' durch das eurosymbol - function convert($str) - { - //echo str_replace('EURO',chr(128),utf8_decode($str)); - return str_replace('EURO',chr(128),utf8_decode($str)); - } - - //oesi - Bei Tabellen wird die Hoehe der Row im vorhinein berechnet - function BerechneTabellenHoehe($child) - { - global $max_line_height_for_that_row; - //var_dump($child); - $pdf = $this->getPdf(); - $anzahl_lines_max=0; - $output = ''; - //alle Zellen durchlaufen - foreach($child->childNodes as $cell) - { - if($cell->childNodes) - { - foreach($cell->childNodes as $block) - { - //Blockelement heraussuchen - if($block->nodeName=='fo:block') - { - //Width des block Elements holen - if($block->attributes->getNamedItem('content-width')) - { - //Schriftgroesse des Elements holen bzw des uebergeordneten - if($block->attributes->getNamedItem('font-size')) - $font_size=$block->attributes->getNamedItem('font-size')->nodeValue; - else - $font_size=$this->getContext("font-size"); - - //wenn schriftgroesse in pt angegeben ist dann in mm umrechnen - if(strstr($font_size,'pt')) - $font_size = $font_size/72*25.4; - $content_width = $block->attributes->getNamedItem('content-width')->nodeValue; - //$output .= $block->nodeValue; - - $anzahl_lines=0; - //sonderzeichen konvertieren - $line = $this->convert($block->nodeValue); - //Zeilenumbrueche loeschen - $line = str_replace("\n",'', trim($line)); - //Lines nach Newlines splitten - $lines = explode('\n', $line); - foreach ($lines as $line) - { - do - { - /*$x = $this->getContext("x"); - $x2 = $this->getContext("startx"); - if (!$x2) { - $x2 = $x; - }*/ - //echo "x2:$x2
"; - - $w = $content_width-1; - - //Anzahl der zeichen holen die in dieser zeile noch platz haben - $noc = $pdf->GetNumberOfChars($w, $line, $font_size); - //wenn das wort nicht abgeteilt werden kann dann ueber den rand hinausschreiben - if($noc==-1) - $noc = strlen($line); - //Zeile abteilen - $showLine = substr($line, 0, $noc); - - $output.= "w=$w noc=$noc fontsize=$font_size
$showLine ($line)"; - - $textWidth = $pdf->GetStringWidth($showLine); - //Rest der Line als neue Line - $line = trim(substr($line, $noc)); - //Anzahl der verbleibenden zeichen ermitteln - $width = $pdf->GetNumberOfChars($w, $line, $font_size); - $anzahl_lines++; - } while($width>0); - } - $output.= " Breaks $anzahl_lines

"; - //Wenn die Anzahl der benoetigten Zeilen in dieser Zelle - //Groesser als die bisher groesste ist dann aendern - if($anzahl_lines_max<$anzahl_lines) - $anzahl_lines_max = $anzahl_lines; - break; - } - } - } - } - } - //Groesse der Zellen in Globale Variable schreiben - $max_line_height_for_that_row = $anzahl_lines_max; - //echo $output." - Line breaks $anzahl_lines_max times
"; - } - - function parse(DOMNode $node) { - //set default attributes - $this->initDefaultAttributes($node); - $this->initAttributes($node); - $this->initialize(); - $acceptPageBreak = $this->getContext("acceptPageBreak"); - - $pos = $this->getPosition(); - list($x, $y, $width, $height) = $pos[0]; - list($xOrig, $yOrig, $width, $height) = $pos[1]; - - //automatic page break if component exceeds page limits - $pdf = $this->getPdf(); - if ($yOrig > $pdf->PageBreakTrigger && - $pdf->AcceptPageBreak() && - $acceptPageBreak) { - $pdf->AddPage(); - $this->handleEvent("sync-position"); - $this->parse($node); - return; - } - - //update to inner position - $this->setContext("x", $x); - $this->setContext("y", $y); - - //draw us - $this->setColor(); - $this->setFont(); - - $this->startCapture(); - foreach($node->childNodes as $child) - { - if ($child->nodeType == self::NODE_TYPE_TEXT) - { - $this->preParseContent($child->textContent); - //oesi - add function utf8_decode for special chars (umlaut) - $this->processContent($this->convert($child->nodeValue)); - $this->postParseContent($child->textContent); - } - else - { - //oesi - Bei Table-rows im vorhinein die hoehe berechnen - if($child->nodeName=='fo:table-row') - $this->BerechneTabellenHoehe($child); - $this->processChildNode($child, $this->getChildNodes()); - } - } - - //oesi - hack for ExternalGraphic Tag to show without content - if($this instanceof FO_ExternalGraphic) - $this->processContent(''); - //endhack - - $contentBuffer = $this->endCapture(); - - //update to outer position - $this->setContext("x", $xOrig); - $this->setContext("y", $yOrig); - - //recalc positions - $pos2 = $this->getPosition(); - //merge with X and y values of the original psoition - $pos2[0][0] = $pos[0][0]; - $pos2[0][1] = $pos[0][1]; - $pos2[1][0] = $pos[1][0]; - $pos2[1][1] = $pos[1][1]; - - //automatic page break if component exceeds page limits - $pdf = $this->getPdf(); - if ($pos2[1][3] < $pdf->PageBreakTrigger && - $pos2[1][3]+$this->getContext("y") > $pdf->PageBreakTrigger && - $pdf->AcceptPageBreak() && $acceptPageBreak) { - $pdf->AddPage(); - $this->handleEvent("sync-position"); - $this->parse($node); - return; - } - - $this->drawBordersAndBackground($pos2); - - //update to outer positions - $this->setLocalContext("width", $pos2[1][2]); - $this->setLocalContext("height", $pos2[1][3]); - - //append child buffer - $this->appendBuffer($contentBuffer); - - $this->closeDown(); - } - - /** - * Initialize additional attributes - **/ - function initAttributes(DOMNode $node) { - //do nothing - } - - function preParseContent($content) { - } - - function postParseContent($textcontent) { - } - - /** - * Draw borders and backgrounds according to the positions - * May be overwritten to specify behaviour - */ - function drawBordersAndBackground($pos) { - list($x, $y, $width, $height) = $pos[1]; - $this->drawBackground($x, $y, $width, $height); - $this->drawBorders($x, $y, $width, $height); - } - - function getChildNodes() { - //no child nodes per default - return array(); - } - - function initialize() { - $break_before = $this->getContext("break-before"); - $this->handleBreak($break_before); - } - - function closeDown() { - $pdf = $this->getPdf(); - if ($this->_oldFont) { - $pdf->SetFont($this->_oldFont, $this->_oldFontStyle, - $this->_oldFontSize); - } - else if ($this->_oldFontSize) { - $pdf->SetFontSize($this->oldFontSize); - } - - if ($this->_oldColor) { - $this->setTextColor($this->_oldColor, $pdf); - } - - $space_after = $this->getContext("space-after.optimum"); -// echo "Space-after:".$space_after.":".get_class($this).":".$this->getContext("height")."
"; - if ($space_after) { - $this->setLocalContext("height", $this->getContext("height") + - $space_after); - } - $break_after = $this->getContext("break-after"); - $this->handleBreak($break_after); - } - - function startCapture() { - if ($this->_buffer) { - echo "Already captureing
"; - return; - } - $this->_buffer = $this->getPdf()->startCapture(); - } - - function endCapture() { - if (!$this->_buffer) { - return; - } - $partBuffer = $this->getPdf()->endCapture($this->_buffer); - $this->_buffer = NULL; - return $partBuffer; - } - - function appendBuffer($buffer) { - if (!$buffer) { - //echo "Nothing to append
"; - return; - } - $this->getPdf()->appendBuffer($buffer); - } - - function getPosition() { - $space_before = $this->getContext("space-before.optimum"); - $height = $this->getContext("line-height"); - $pdf = $this->getPdf(); - - $bw_top = $this->getContext("border-top-width"); - $bw_left = $this->getContext("border-left-width"); - $bw_right = $this->getContext("border-right-width"); - $bw_bottom = $this->getContext("border-bottom-width"); - $padding_left = $this->getContext("padding-left"); - $padding_top = $this->getContext("padding-top"); - - $bw = $this->getContext("border-width"); - $xx = $this->getContext("x"); - $yy = $this->getContext("y"); - - $height2 = $this->getContext("height"); - if (!$height || $height < $height2) { - $height = $height2; - } - $width = $this->getContext("width"); - if (!$bw_top) {$bw_top = $bw;} - if (!$bw_bottom) {$bw_bottom = $bw;} - if (!$bw_right) {$bw_right = $bw;} - if (!$bw_left) {$bw_left = $bw;} - - sscanf($bw_top, "%f%s", $wt, $unit); - sscanf($bw_left, "%f%s", $wl, $unit); - sscanf($bw_right, "%f%s", $wr, $unit); - sscanf($bw_bottom, "%f%s", $wb, $unit); - $xx += $wl; - $yy += $wt; - $height += $wt+$wb; - $width += $wl+$wr; - - if ($space_before) { - //echo "Spacebefore:$space_before
"; - $yy += $space_before; - $height += $space_before; - } - if ($padding_left) { - $xx += $padding_left; - } - if ($padding_top) { - $yy += $padding_top; - } - - return - array( - //inner coordinates - array($xx, $yy, $width-$wl-$wr, $height-$wt-$wb), - //outer coordinates - array($xx-$wl, $yy-$wr, $width, $height)); - } - - function setColor() { - $pdf = $this->getPdf(); - $this->_oldColor = $pdf->GetTextColor(); - $color = $this->getContext("color"); - if ($color) { - $this->setTextColor($color, $pdf); - } - } - - function setFont() { - $pdf = $this->getPdf(); - $this->_oldFont = $pdf->GetFontFamily(); - $this->_oldFontStyle = $pdf->GetFontStyle(); - $this->_oldFontSize = $pdf->GetFontSizePt(); - $weight = $this->getContext("font-weight"); - $style = $this->getContext("font-style"); - $family = $this->getContext("font-family"); - $size = $this->getContext("font-size"); - if ($family) { - $f = $family; - } - else { - $f = $this->_oldFont; - } - if ($weight || $style) { - if ($weight) { - $st = "B"; - } - if ($style) { - //TODO: check which styles are supported - } - } - else { - $st = $this->_oldFontStyle; - } - if ($size) { - $sz = $size; - } - else { - $sz = $this->_oldFontSize; - } - if ($pdf->FontExists($f, $st)) { - $pdf->SetFont($f, $st, $sz); - } - else if ($pdf->FontExists($this->_oldFont, $st)) { - $pdf->SetFont($this->_oldFont, $st, $sz); - } - else { - //adjust only size - $pdf->SetFontSize($sz); - } - } - - function drawBorders($x, $y, $width, $height) { - $bs_top = $this->getContext("border-top-style"); - $bs_left = $this->getContext("border-left-style"); - $bs_right = $this->getContext("border-right-style"); - $bs_bottom = $this->getContext("border-bottom-style"); - $bs = $this->getContext("border-style"); - $bc_top = $this->getContext("border-top-color"); - $bc_left = $this->getContext("border-left-color"); - $bc_right = $this->getContext("border-right-color"); - $bc_bottom = $this->getContext("border-bottom-color"); - $bc = $this->getContext("border-color"); - $bw_top = $this->getContext("border-top-width"); - $bw_left = $this->getContext("border-left-width"); - $bw_right = $this->getContext("border-right-width"); - $bw_bottom = $this->getContext("border-bottom-width"); - $bw = $this->getContext("border-width"); - - $pdf = $this->getPdf(); - if (!$bs_top) {$bs_top = $bs;} - if (!$bs_bottom) {$bs_bottom = $bs;} - if (!$bs_right) {$bs_right = $bs;} - if (!$bs_left) {$bs_left = $bs;} - if (!$bc_top) {$bc_top = $bc;} - if (!$bc_bottom) {$bc_bottom = $bc;} - if (!$bc_right) {$bc_right = $bc;} - if (!$bc_left) {$bc_left = $bc;} - if (!$bw_top) {$bw_top = $bw;} - if (!$bw_bottom) {$bw_bottom = $bw;} - if (!$bw_right) {$bw_right = $bw;} - if (!$bw_left) {$bw_left = $bw;} - - sscanf($bw_top, "%f%s", $wt, $unit); - sscanf($bw_left, "%f%s", $wl, $unit); - sscanf($bw_right, "%f%s", $wr, $unit); - sscanf($bw_bottom, "%f%s", $wb, $unit); - $wt /= 2; - $wl /= 2; - $wr /= 2; - $wb /= 2; - - $width -= $wl+$wr; - $height -= $wt+$wb; - $x += $wl; - $y += $wt; - $this->drawLine($x, $y, $x+$width, $y, $bs_top, $bc_top, - $bw_top, $pdf); - $this->drawLine($x, $y, $x, $y+$height, $bs_left, - $bc_left, $bw_left,$pdf); - $this->drawLine($x, $y+$height, $x+$width, $y+$height, - $bs_bottom, $bc_bottom, $bw_bottom, $pdf); - $this->drawLine($x+$width, $y, $x+$width, $y+$height, - $bs_right, $bc_right,$bw_right, $pdf); - } - - function drawBackground($x, $y, $width, $height) { - $pdf = $this->GetPdf(); - $bg_c = $this->getContext("background-color"); - $bg_img = $this->getContext("background-image"); - if ($bg_c) { - $oldColor = $pdf->GetFillColor(); - list($r, $g, $b) = $this->parseColor($bg_c); - $pdf->SetFillColor($r, $g, $b); - $pdf->Rect($x, $y, $width, $height, "F"); - list($r, $g, $b) = $this->parseColor($oldColor); - $pdf->SetFillColor($r, $g, $b); - } - else if ($bg_img) { - $this->NotYetSupported("background-image"); - } - } - - function drawLine($x, $y, $x2, $y2, $style, $color, $width, &$pdf) { - $oldColor = $pdf->GetDrawColor(); - $oldLineWidth = $pdf->GetLineWidth(); - if ($width) { - $pdf->SetLineWidth($width); - } - $this->setDrawColor($color, $pdf); - switch ($style) { - case "dotted": - $pdf->SetDash(0.5, 0.5); //1mm on, 1mm off - $pdf->Line($x, $y, $x2, $y2); - $pdf->SetDash(); //restore no dash - return; - case "dashed": - $pdf->SetDash(2,2); //2mm on, 2mm off - $pdf->Line($x, $y, $x2, $y2); - $pdf->SetDash(); //restore no dash - return; - case "solid": - $pdf->Line($x, $y, $x2, $y2); - return; - case "double": - case "groove": - case "ridge": - case "inset": - case "outset": - //TODO:implement - echo "border style '$style' not yet supported
"; - case "none": - case "hidden": - default: - //do nothing - return; - } - $this->setDrawColor($oldColor, $pdf); - $this->setLineWidth($oldLineWidth); - } - - function setDrawColor($color, &$pdf) { - if ($color == '') { - return; - } - list($r, $g, $b) = $this->parseColor($color); - $pdf->SetDrawColor($r, $g, $b); - } - - function setTextColor($color, &$pdf) { - if ($color == '') { - return; - } - list($r, $g, $b) = $this->parseColor($color); - $pdf->SetTextColor($r, $g, $b); - } - - function handleBreak($break) { - if (!$break) { - return; - } - $pdf = $this->getPdf(); - switch($break) { - case "page": - $pdf->AddPage(); - $this->handleEvent("sync-position"); - return; - default: - $this->NotYetSupported("Break:$break"); - } - } -} - -class FO_LayoutMasterSet extends FO_Object { - var $name; - - function parse(DOMNode $node) { - $this->name = $node->attributes->getNamedItem("master-name"); - $this->addReference($this, $this->name); - } -} - -class FO_PageSequence extends FO_Object { - static $CHILDNODES = array( - 'FO_Flow' - ); - - function parse(DOMNode $node) { - $masterRef = $node->attributes->getNamedItem("master-reference"); - if ($masterRef) { - $master = $this->resolveReference('FO_LayoutMasterSet', $masterRef); - //TODO: do something with this master - } - $pdf = $this->getPdf(); - $pdf->AddPage(); - $this->handleEvent("sync-position"); - $this->processChildNodes($node, self::$CHILDNODES); - } -} - -class FO_FlowContainer extends FO_Object { - - function postParse(FO_Object $obj) { - $acceptPageBreak = $this->getContext("acceptPageBreak"); - $this->setLocalContext("width", $obj->getContext("width")); - $height = $this->getContext("height")+$obj->getContext("height"); - $this->setLocalContext("height", $height); - $y = $this->getContext("y")+$obj->getContext("height"); - $pdf = $this->getPdf(); - if ($height < $pdf->PageBreakTrigger && - $y > $pdf->PageBreakTrigger && - $pdf->AcceptPageBreak() && - $acceptPageBreak) { - - $pdf->AddPage(); - $this->handleEvent("sync-position"); - //echo "Page break on .".get_class($obj)."
"; - } - else { - $this->setContext("y", $y); - //echo "Move :".get_class($obj).":".$y.":".$obj->getContext("height")."
;"; - } - } -} - -class FO_Flow extends FO_FlowContainer { - static $CHILDNODES = array( - 'FO_Block', - 'FO_Table', - 'FO_BlockContainer', - 'FO_TableAndCaption', - 'FO_ListBlock' - ); - - function parse(DOMNode $node) { - //TODO: use attributes - $this->processChildNodes($node, self::$CHILDNODES); - } -} - -class FO_BlockContainer extends FO_LayoutObject { - static $CHILDNODES = array( - 'FO_Block', - 'FO_BlockContainer', - 'FO_TableAndCaption', - 'FO_Table', - 'FO_ListBlock'); - - function initAttributes(DOMNode $node) { - $this->initLocalSizeAttribute($node, "position"); - $this->initLocalSizeAttribute($node, "top"); - $this->initLocalSizeAttribute($node, "left"); - $this->initLocalSizeAttribute($node, "height"); - $this->initLocalSizeAttribute($node, "width"); - } - - function getChildNodes() { - return self::$CHILDNODES; - } - - function parse(DOMNode $node) { - $this->initAttributes($node); - $position = $this->getContext("position"); - if ($position == "absolute"){ - //init absolute positions - $top = $this->getContext("top"); - $left = $this->getContext("left"); - $this->setContext("x", $left); - $this->setContext("y", $top); - $this->setContext("acceptPageBreak", false); - } - parent::parse($node); - } - -} - -class FO_ListBlock extends FO_LayoutObject { - -} - -?> + +initLocalAttribute($node, "border-top-style"); + $this->initLocalAttribute($node, "border-right-style"); + $this->initLocalAttribute($node, "border-bottom-style"); + $this->initLocalAttribute($node, "border-left-style"); + $this->initLocalAttribute($node, "border-style"); + $this->initLocalAttribute($node, "border-top-color"); + $this->initLocalAttribute($node, "border-right-color"); + $this->initLocalAttribute($node, "border-bottom-color"); + $this->initLocalAttribute($node, "border-left-color"); + $this->initLocalAttribute($node, "border-color"); + $this->initLocalSizeAttribute($node, "border-top-width"); + $this->initLocalSizeAttribute($node, "border-right-width"); + $this->initLocalSizeAttribute($node, "border-bottom-width"); + $this->initLocalSizeAttribute($node, "border-left-width"); + $this->initLocalSizeAttribute($node, "border-width"); + $this->initAttribute($node, "font-style"); + $this->initAttribute($node, "font-weight"); + $this->initSizeAttribute($node, "font-size", "pt"); + $this->initAttribute($node, "font-family"); + $this->initAttribute($node, "color"); + $this->initLocalSizeAttribute($node, "width"); + $this->initLocalSizeAttribute($node, "height"); + $this->initLocalAttribute($node, "background-color"); + $this->initLocalAttribute($node, "background-image"); + $this->initLocalSizeAttribute($node, "space-before.optimum"); + $this->initLocalSizeAttribute($node, "space-after.optimum"); + $this->initLocalAttribute($node, "break-before"); + $this->initLocalAttribute($node, "break-after"); + $this->initSizeAttribute($node, "line-height"); + $this->initLocalSizeAttribute($node, "padding-top"); + //$this->initLocalSizeAttribute($node, "padding-bottom"); + $this->initLocalSizeAttribute($node, "padding-left"); + //$this->initLocalSizeAttribute($node, "padding-right"); + } + + //oesi - convertiert die daten von utf8 nach latin1 und ersetzt 'EURO' durch das eurosymbol + function convert($str) + { + //echo str_replace('EURO',chr(128),utf8_decode($str)); + return str_replace('EURO',chr(128),utf8_decode($str)); + } + + //oesi - Bei Tabellen wird die Hoehe der Row im vorhinein berechnet + function BerechneTabellenHoehe($child) + { + global $max_line_height_for_that_row; + //var_dump($child); + $pdf = $this->getPdf(); + $anzahl_lines_max=0; + $output = ''; + //alle Zellen durchlaufen + foreach($child->childNodes as $cell) + { + if($cell->childNodes) + { + foreach($cell->childNodes as $block) + { + //Blockelement heraussuchen + if($block->nodeName=='fo:block') + { + //Width des block Elements holen + if($block->attributes->getNamedItem('content-width')) + { + //Schriftgroesse des Elements holen bzw des uebergeordneten + if($block->attributes->getNamedItem('font-size')) + $font_size=$block->attributes->getNamedItem('font-size')->nodeValue; + else + $font_size=$this->getContext("font-size"); + + //wenn schriftgroesse in pt angegeben ist dann in mm umrechnen + if(strstr($font_size,'pt')) + $font_size = $font_size/72*25.4; + $content_width = $block->attributes->getNamedItem('content-width')->nodeValue; + //$output .= $block->nodeValue; + + $anzahl_lines=0; + //sonderzeichen konvertieren + $line = $this->convert($block->nodeValue); + //Zeilenumbrueche loeschen + $line = str_replace("\n",'', trim($line)); + //Lines nach Newlines splitten + $lines = explode('\n', $line); + foreach ($lines as $line) + { + do + { + /*$x = $this->getContext("x"); + $x2 = $this->getContext("startx"); + if (!$x2) { + $x2 = $x; + }*/ + //echo "x2:$x2
"; + + $w = $content_width-1; + + //Anzahl der zeichen holen die in dieser zeile noch platz haben + $noc = $pdf->GetNumberOfChars($w, $line, $font_size); + //wenn das wort nicht abgeteilt werden kann dann ueber den rand hinausschreiben + if($noc==-1) + $noc = strlen($line); + //Zeile abteilen + $showLine = substr($line, 0, $noc); + + $output.= "w=$w noc=$noc fontsize=$font_size
$showLine ($line)"; + + $textWidth = $pdf->GetStringWidth($showLine); + //Rest der Line als neue Line + $line = trim(substr($line, $noc)); + //Anzahl der verbleibenden zeichen ermitteln + $width = $pdf->GetNumberOfChars($w, $line, $font_size); + $anzahl_lines++; + } while($width>0); + } + $output.= " Breaks $anzahl_lines

"; + //Wenn die Anzahl der benoetigten Zeilen in dieser Zelle + //Groesser als die bisher groesste ist dann aendern + if($anzahl_lines_max<$anzahl_lines) + $anzahl_lines_max = $anzahl_lines; + break; + } + } + } + } + } + //Groesse der Zellen in Globale Variable schreiben + $max_line_height_for_that_row = $anzahl_lines_max; + //echo $output." - Line breaks $anzahl_lines_max times
"; + } + + function parse(DOMNode $node) { + //set default attributes + $this->initDefaultAttributes($node); + $this->initAttributes($node); + $this->initialize(); + $acceptPageBreak = $this->getContext("acceptPageBreak"); + + $pos = $this->getPosition(); + list($x, $y, $width, $height) = $pos[0]; + list($xOrig, $yOrig, $width, $height) = $pos[1]; + + //automatic page break if component exceeds page limits + $pdf = $this->getPdf(); + if ($yOrig > $pdf->PageBreakTrigger && + $pdf->AcceptPageBreak() && + $acceptPageBreak) { + $pdf->AddPage(); + $this->handleEvent("sync-position"); + $this->parse($node); + return; + } + + //update to inner position + $this->setContext("x", $x); + $this->setContext("y", $y); + + //draw us + $this->setColor(); + $this->setFont(); + + $this->startCapture(); + foreach($node->childNodes as $child) + { + if ($child->nodeType == self::NODE_TYPE_TEXT) + { + $this->preParseContent($child->textContent); + //oesi - add function utf8_decode for special chars (umlaut) + $this->processContent($this->convert($child->nodeValue)); + $this->postParseContent($child->textContent); + } + else + { + //oesi - Bei Table-rows im vorhinein die hoehe berechnen + if($child->nodeName=='fo:table-row') + $this->BerechneTabellenHoehe($child); + $this->processChildNode($child, $this->getChildNodes()); + } + } + + //oesi - hack for ExternalGraphic Tag to show without content + if($this instanceof FO_ExternalGraphic) + $this->processContent(''); + //endhack + + $contentBuffer = $this->endCapture(); + + //update to outer position + $this->setContext("x", $xOrig); + $this->setContext("y", $yOrig); + + //recalc positions + $pos2 = $this->getPosition(); + //merge with X and y values of the original psoition + $pos2[0][0] = $pos[0][0]; + $pos2[0][1] = $pos[0][1]; + $pos2[1][0] = $pos[1][0]; + $pos2[1][1] = $pos[1][1]; + + //automatic page break if component exceeds page limits + $pdf = $this->getPdf(); + if ($pos2[1][3] < $pdf->PageBreakTrigger && + $pos2[1][3]+$this->getContext("y") > $pdf->PageBreakTrigger && + $pdf->AcceptPageBreak() && $acceptPageBreak) { + $pdf->AddPage(); + $this->handleEvent("sync-position"); + $this->parse($node); + return; + } + + $this->drawBordersAndBackground($pos2); + + //update to outer positions + $this->setLocalContext("width", $pos2[1][2]); + $this->setLocalContext("height", $pos2[1][3]); + + //append child buffer + $this->appendBuffer($contentBuffer); + + $this->closeDown(); + } + + /** + * Initialize additional attributes + **/ + function initAttributes(DOMNode $node) { + //do nothing + } + + function preParseContent($content) { + } + + function postParseContent($textcontent) { + } + + /** + * Draw borders and backgrounds according to the positions + * May be overwritten to specify behaviour + */ + function drawBordersAndBackground($pos) { + list($x, $y, $width, $height) = $pos[1]; + $this->drawBackground($x, $y, $width, $height); + $this->drawBorders($x, $y, $width, $height); + } + + function getChildNodes() { + //no child nodes per default + return array(); + } + + function initialize() { + $break_before = $this->getContext("break-before"); + $this->handleBreak($break_before); + } + + function closeDown() { + $pdf = $this->getPdf(); + if ($this->_oldFont) { + $pdf->SetFont($this->_oldFont, $this->_oldFontStyle, + $this->_oldFontSize); + } + else if ($this->_oldFontSize) { + $pdf->SetFontSize($this->oldFontSize); + } + + if ($this->_oldColor) { + $this->setTextColor($this->_oldColor, $pdf); + } + + $space_after = $this->getContext("space-after.optimum"); +// echo "Space-after:".$space_after.":".get_class($this).":".$this->getContext("height")."
"; + if ($space_after) { + $this->setLocalContext("height", $this->getContext("height") + + $space_after); + } + $break_after = $this->getContext("break-after"); + $this->handleBreak($break_after); + } + + function startCapture() { + if ($this->_buffer) { + echo "Already captureing
"; + return; + } + $this->_buffer = $this->getPdf()->startCapture(); + } + + function endCapture() { + if (!$this->_buffer) { + return; + } + $partBuffer = $this->getPdf()->endCapture($this->_buffer); + $this->_buffer = NULL; + return $partBuffer; + } + + function appendBuffer($buffer) { + if (!$buffer) { + //echo "Nothing to append
"; + return; + } + $this->getPdf()->appendBuffer($buffer); + } + + function getPosition() { + $space_before = $this->getContext("space-before.optimum"); + $height = $this->getContext("line-height"); + $pdf = $this->getPdf(); + + $bw_top = $this->getContext("border-top-width"); + $bw_left = $this->getContext("border-left-width"); + $bw_right = $this->getContext("border-right-width"); + $bw_bottom = $this->getContext("border-bottom-width"); + $padding_left = $this->getContext("padding-left"); + $padding_top = $this->getContext("padding-top"); + + $bw = $this->getContext("border-width"); + $xx = $this->getContext("x"); + $yy = $this->getContext("y"); + + $height2 = $this->getContext("height"); + if (!$height || $height < $height2) { + $height = $height2; + } + $width = $this->getContext("width"); + if (!$bw_top) {$bw_top = $bw;} + if (!$bw_bottom) {$bw_bottom = $bw;} + if (!$bw_right) {$bw_right = $bw;} + if (!$bw_left) {$bw_left = $bw;} + + sscanf($bw_top, "%f%s", $wt, $unit); + sscanf($bw_left, "%f%s", $wl, $unit); + sscanf($bw_right, "%f%s", $wr, $unit); + sscanf($bw_bottom, "%f%s", $wb, $unit); + $xx += $wl; + $yy += $wt; + $height += $wt+$wb; + $width += $wl+$wr; + + if ($space_before) { + //echo "Spacebefore:$space_before
"; + $yy += $space_before; + $height += $space_before; + } + if ($padding_left) { + $xx += $padding_left; + } + if ($padding_top) { + $yy += $padding_top; + } + + return + array( + //inner coordinates + array($xx, $yy, $width-$wl-$wr, $height-$wt-$wb), + //outer coordinates + array($xx-$wl, $yy-$wr, $width, $height)); + } + + function setColor() { + $pdf = $this->getPdf(); + $this->_oldColor = $pdf->GetTextColor(); + $color = $this->getContext("color"); + if ($color) { + $this->setTextColor($color, $pdf); + } + } + + function setFont() { + $pdf = $this->getPdf(); + $this->_oldFont = $pdf->GetFontFamily(); + $this->_oldFontStyle = $pdf->GetFontStyle(); + $this->_oldFontSize = $pdf->GetFontSizePt(); + $weight = $this->getContext("font-weight"); + $style = $this->getContext("font-style"); + $family = $this->getContext("font-family"); + $size = $this->getContext("font-size"); + if ($family) { + $f = $family; + } + else { + $f = $this->_oldFont; + } + if ($weight || $style) { + if ($weight) { + $st = "B"; + } + if ($style) { + //TODO: check which styles are supported + } + } + else { + $st = $this->_oldFontStyle; + } + if ($size) { + $sz = $size; + } + else { + $sz = $this->_oldFontSize; + } + if ($pdf->FontExists($f, $st)) { + $pdf->SetFont($f, $st, $sz); + } + else if ($pdf->FontExists($this->_oldFont, $st)) { + $pdf->SetFont($this->_oldFont, $st, $sz); + } + else { + //adjust only size + $pdf->SetFontSize($sz); + } + } + + function drawBorders($x, $y, $width, $height) { + $bs_top = $this->getContext("border-top-style"); + $bs_left = $this->getContext("border-left-style"); + $bs_right = $this->getContext("border-right-style"); + $bs_bottom = $this->getContext("border-bottom-style"); + $bs = $this->getContext("border-style"); + $bc_top = $this->getContext("border-top-color"); + $bc_left = $this->getContext("border-left-color"); + $bc_right = $this->getContext("border-right-color"); + $bc_bottom = $this->getContext("border-bottom-color"); + $bc = $this->getContext("border-color"); + $bw_top = $this->getContext("border-top-width"); + $bw_left = $this->getContext("border-left-width"); + $bw_right = $this->getContext("border-right-width"); + $bw_bottom = $this->getContext("border-bottom-width"); + $bw = $this->getContext("border-width"); + + $pdf = $this->getPdf(); + if (!$bs_top) {$bs_top = $bs;} + if (!$bs_bottom) {$bs_bottom = $bs;} + if (!$bs_right) {$bs_right = $bs;} + if (!$bs_left) {$bs_left = $bs;} + if (!$bc_top) {$bc_top = $bc;} + if (!$bc_bottom) {$bc_bottom = $bc;} + if (!$bc_right) {$bc_right = $bc;} + if (!$bc_left) {$bc_left = $bc;} + if (!$bw_top) {$bw_top = $bw;} + if (!$bw_bottom) {$bw_bottom = $bw;} + if (!$bw_right) {$bw_right = $bw;} + if (!$bw_left) {$bw_left = $bw;} + + sscanf($bw_top, "%f%s", $wt, $unit); + sscanf($bw_left, "%f%s", $wl, $unit); + sscanf($bw_right, "%f%s", $wr, $unit); + sscanf($bw_bottom, "%f%s", $wb, $unit); + $wt /= 2; + $wl /= 2; + $wr /= 2; + $wb /= 2; + + $width -= $wl+$wr; + $height -= $wt+$wb; + $x += $wl; + $y += $wt; + $this->drawLine($x, $y, $x+$width, $y, $bs_top, $bc_top, + $bw_top, $pdf); + $this->drawLine($x, $y, $x, $y+$height, $bs_left, + $bc_left, $bw_left,$pdf); + $this->drawLine($x, $y+$height, $x+$width, $y+$height, + $bs_bottom, $bc_bottom, $bw_bottom, $pdf); + $this->drawLine($x+$width, $y, $x+$width, $y+$height, + $bs_right, $bc_right,$bw_right, $pdf); + } + + function drawBackground($x, $y, $width, $height) { + $pdf = $this->GetPdf(); + $bg_c = $this->getContext("background-color"); + $bg_img = $this->getContext("background-image"); + if ($bg_c) { + $oldColor = $pdf->GetFillColor(); + list($r, $g, $b) = $this->parseColor($bg_c); + $pdf->SetFillColor($r, $g, $b); + $pdf->Rect($x, $y, $width, $height, "F"); + list($r, $g, $b) = $this->parseColor($oldColor); + $pdf->SetFillColor($r, $g, $b); + } + else if ($bg_img) { + $this->NotYetSupported("background-image"); + } + } + + function drawLine($x, $y, $x2, $y2, $style, $color, $width, &$pdf) { + $oldColor = $pdf->GetDrawColor(); + $oldLineWidth = $pdf->GetLineWidth(); + if ($width) { + $pdf->SetLineWidth($width); + } + $this->setDrawColor($color, $pdf); + switch ($style) { + case "dotted": + $pdf->SetDash(0.5, 0.5); //1mm on, 1mm off + $pdf->Line($x, $y, $x2, $y2); + $pdf->SetDash(); //restore no dash + return; + case "dashed": + $pdf->SetDash(2,2); //2mm on, 2mm off + $pdf->Line($x, $y, $x2, $y2); + $pdf->SetDash(); //restore no dash + return; + case "solid": + $pdf->Line($x, $y, $x2, $y2); + return; + case "double": + case "groove": + case "ridge": + case "inset": + case "outset": + //TODO:implement + echo "border style '$style' not yet supported
"; + case "none": + case "hidden": + default: + //do nothing + return; + } + $this->setDrawColor($oldColor, $pdf); + $this->setLineWidth($oldLineWidth); + } + + function setDrawColor($color, &$pdf) { + if ($color == '') { + return; + } + list($r, $g, $b) = $this->parseColor($color); + $pdf->SetDrawColor($r, $g, $b); + } + + function setTextColor($color, &$pdf) { + if ($color == '') { + return; + } + list($r, $g, $b) = $this->parseColor($color); + $pdf->SetTextColor($r, $g, $b); + } + + function handleBreak($break) { + if (!$break) { + return; + } + $pdf = $this->getPdf(); + switch($break) { + case "page": + $pdf->AddPage(); + $this->handleEvent("sync-position"); + return; + default: + $this->NotYetSupported("Break:$break"); + } + } +} + +class FO_LayoutMasterSet extends FO_Object { + var $name; + + function parse(DOMNode $node) { + $this->name = $node->attributes->getNamedItem("master-name"); + $this->addReference($this, $this->name); + } +} + +class FO_PageSequence extends FO_Object { + static $CHILDNODES = array( + 'FO_Flow' + ); + + function parse(DOMNode $node) { + $masterRef = $node->attributes->getNamedItem("master-reference"); + if ($masterRef) { + $master = $this->resolveReference('FO_LayoutMasterSet', $masterRef); + //TODO: do something with this master + } + $pdf = $this->getPdf(); + $pdf->AddPage(); + $this->handleEvent("sync-position"); + $this->processChildNodes($node, self::$CHILDNODES); + } +} + +class FO_FlowContainer extends FO_Object { + + function postParse(FO_Object $obj) { + $acceptPageBreak = $this->getContext("acceptPageBreak"); + $this->setLocalContext("width", $obj->getContext("width")); + $height = $this->getContext("height")+$obj->getContext("height"); + $this->setLocalContext("height", $height); + $y = $this->getContext("y")+$obj->getContext("height"); + $pdf = $this->getPdf(); + if ($height < $pdf->PageBreakTrigger && + $y > $pdf->PageBreakTrigger && + $pdf->AcceptPageBreak() && + $acceptPageBreak) { + + $pdf->AddPage(); + $this->handleEvent("sync-position"); + //echo "Page break on .".get_class($obj)."
"; + } + else { + $this->setContext("y", $y); + //echo "Move :".get_class($obj).":".$y.":".$obj->getContext("height")."
;"; + } + } +} + +class FO_Flow extends FO_FlowContainer { + static $CHILDNODES = array( + 'FO_Block', + 'FO_Table', + 'FO_BlockContainer', + 'FO_TableAndCaption', + 'FO_ListBlock' + ); + + function parse(DOMNode $node) { + //TODO: use attributes + $this->processChildNodes($node, self::$CHILDNODES); + } +} + +class FO_BlockContainer extends FO_LayoutObject { + static $CHILDNODES = array( + 'FO_Block', + 'FO_BlockContainer', + 'FO_TableAndCaption', + 'FO_Table', + 'FO_ListBlock'); + + function initAttributes(DOMNode $node) { + $this->initLocalSizeAttribute($node, "position"); + $this->initLocalSizeAttribute($node, "top"); + $this->initLocalSizeAttribute($node, "left"); + $this->initLocalSizeAttribute($node, "height"); + $this->initLocalSizeAttribute($node, "width"); + } + + function getChildNodes() { + return self::$CHILDNODES; + } + + function parse(DOMNode $node) { + $this->initAttributes($node); + $position = $this->getContext("position"); + if ($position == "absolute"){ + //init absolute positions + $top = $this->getContext("top"); + $left = $this->getContext("left"); + $this->setContext("x", $left); + $this->setContext("y", $top); + $this->setContext("acceptPageBreak", false); + } + parent::parse($node); + } + +} + +class FO_ListBlock extends FO_LayoutObject { + +} + +?>