Erledigt: [PHP] FPDF - Tabellen erzeugen

M3Y3R

Well-known member
ID: 336361
L
8 Mai 2006
1.608
60
Hallo,

ich habe folgendes Problem:
Ich besitze eine Tabelle:
HTML:
<TABLE BORDER=0 CLASS='data'>
<TR><TH CLASS='data'>State</TH><TH CLASS='data'>Type / Reason</TH><TH CLASS='data'>Time</TH><TH CLASS='data'>% Total Time</TH><TH CLASS='data'>% Known Time</TH></TR>
<tr CLASS='dataEven'><td CLASS='hostUP' rowspan=3>UP</td><td CLASS='dataEven'>Unscheduled</td><td CLASS='dataEven'>0d 18h 12m 33s</td><td CLASS='dataEven'>10.839%</td><td class='dataEven'>10.839%</td></tr>
<tr CLASS='dataEven'><td CLASS='dataEven'>Scheduled</td><td CLASS='dataEven'>0d 0h 0m 0s</td><td CLASS='dataEven'>0.000%</td><td class='dataEven'>0.000%</td></tr>
<tr CLASS='hostUP'><td CLASS='hostUP'>Total</td><td CLASS='hostUP'>0d 18h 12m 33s</td><td CLASS='hostUP'>10.839%</td><td class='hostUP'>10.839%</td></tr>
</table>

Nun erstelle ich mit der Klasse FPDF und einem Addon html_tables diese Tabell, jedoch werden hier die Rowspans nicht berücksichtigt!

Ich dachte ich könnte das selbst einfügen wie beim colspan auch aber das funktioniert leider nicht:

PHP:
//Funktioniert -> Erstellt colspans!
if(isset($attr['COLSPAN']) && $attr['COLSPAN'] !=''){
     $this->tdwidth=38*$attr['COLSPAN'];
}

//Funktioniert [B]nicht[/B] -> Soll rowspans erstellen
if(isset($attr['ROWSPAN']) && $attr['ROWSPAN'] !=''){
     $this->tdheight=6*$attr['ROWSPAN'];
}

Weitere Funktionen die hilfreich sein könnten sind diese hier:
PHP:
$this->GetX(); //Liefert die aktuelle horizontale Position (X-Achse).
$this->GetY(); //Liefert die aktuelle vertikale Position (Y-Achse).
$this->SetX(); //Definiert die horizontale Position (auf der X-Achse) relativ zum linken Seitenrand. Ist der Wert negativ, wird die Position relativ vom rechten Seitenrand aus ermittelt.
$this->SetY(); //Definiert die vertikale Position (auf der Y-Achse) relativ zum oberen Seitenrand. Ist der Wert negativ, wird die Position relativ vom unteren Seitenrand aus ermittelt. Bei der Verwendung von SetY wird die horizontale Position (auf der X-Achse) wieder auf den linken Seitenrand gesetzt.
$this->SetXY(); //Definiert die horizontale Position (auf der X-Achse) relativ vom linken Seitenrand und die vertikale Position (auf der Y-Achse) relativ vom oberen Seitenrand aus. Ist der Wert für eine Position negativ, wird die Position relativ vom rechten bzw. unteren Seitenrand aus ermittelt.

Wer kennt sich mit FPDF aus und kann die Rowspans mit einbinden?


Danke!

MFG
Papenburger
 
Zuletzt bearbeitet:
Achso dachte das kann dir helfen mir hat es auch immer geholfen. Haben die nicht auch ein forum schreibe da mal da bekommst bestimmt schneller hilfe. Weil diese klasse verwenden ja nicht viele leute.
 
Darf ich fragen wie?
Und mal ne Frage an dich wie kann ich einen Automatischen Zeilenumbruch machen?

Ich habe mir ein Addon (HTML TABLE) geholt wie unten stehend angepasst:

html_table.php
PHP:
<?php
//Based on HTML2PDF by Clément Lavoillotte

require('fpdf.php');

//function hex2dec
//returns an associative array (keys: R,G,B) from
//a hex html code (e.g. #3FE5AA)
function hex2dec($couleur = "#000000"){
	$R = substr($couleur, 1, 2);
	$rouge = hexdec($R);
	$V = substr($couleur, 3, 2);
	$vert = hexdec($V);
	$B = substr($couleur, 5, 2);
	$bleu = hexdec($B);
	$tbl_couleur = array();
	$tbl_couleur['R']=$rouge;
	$tbl_couleur['G']=$vert;
	$tbl_couleur['B']=$bleu;
	return $tbl_couleur;
}

//conversion pixel -> millimeter in 72 dpi
function px2mm($px){
	return $px*25.4/72;
}

function txtentities($html){
	$trans = get_html_translation_table(HTML_ENTITIES);
	$trans = array_flip($trans);
	return strtr($html, $trans);
}
////////////////////////////////////

class PDF extends FPDF
{
//variables of html parser
var $B;
var $I;
var $U;
var $HREF;
var $fontList;
var $issetfont;
var $issetcolor;

var $aktiv;
var $anzahl;
var $jetzt;

function PDF($orientation='P',$unit='mm',$format='A4')
{
	//Call parent constructor
	$this->FPDF($orientation,$unit,$format);
	//Initialization
	$this->B=0;
	$this->I=0;
	$this->U=0;
	$this->HREF='';

	$this->aktiv=0;
	$this->anzahl=0;
	$this->jetzt=1;

	$this->tableborder=0;
	$this->tdbegin=false;
	$this->tdwidth=0;
	$this->tdheight=0;
	$this->tdalign="L";
	$this->tdbgcolor=false;

	$this->oldx=0;
	$this->oldy=0;

	$this->fontlist=array("arial","times","courier","helvetica","symbol");
	$this->issetfont=false;
	$this->issetcolor=false;
}

//////////////////////////////////////
//html parser

function WriteHTML($html)//, $width=38)
{
	$html=strip_tags($html,"<b><u><i><a><img><p><br><strong><em><font><tr><blockquote><hr><td><tr><table><sup><th>"); //remove all unsupported tags
	$html=str_replace("\n",'',$html); //replace carriage returns by spaces
	$html=str_replace("\t",'',$html); //replace carriage returns by spaces
	$a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE); //explodes the string

	foreach($a as $i=>$e)
	{
		if($i%2==0)
		{
			//Text
			if($this->tdbegin) {
				if(trim($e)!='' and $e!=" ") {
					if(strlen($e) > 23){
						$e=substr($e,0,20);
						$e.="...";
					}
					$this->Cell($this->tdwidth,$this->tdheight,$e,$this->tableborder,'',$this->tdalign,$this->tdbgcolor);
				}
				elseif($e==" ") {
					$this->Cell($this->tdwidth,$this->tdheight,'',$this->tableborder,'',$this->tdalign,$this->tdbgcolor);
				}
			}
			else
				$this->Write(5,stripslashes(txtentities($e)));
		}
		else
		{
			//Tag
			if($e{0}=='/')
				$this->CloseTag(strtoupper(substr($e,1)));
			else
			{
				//Extract attributes
				$a2=explode(' ',$e);
				$tag=strtoupper(array_shift($a2));
				$attr=array();
				foreach($a2 as $v)
					if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
						$attr[strtoupper($a3[1])]=$a3[2];
				$this->OpenTag($tag,$attr);
			}
		}
	}
}

function OpenTag($tag,$attr)
{
	//Opening tag
	switch($tag){

		case 'SUP':
			if($attr['SUP'] != '') {	
				//Set current font to: Bold, 6pt 	
				$this->SetFont('','',6);
				//Start 125cm plus width of cell to the right of left margin 		
				//Superscript "1" 
				$this->Cell(2,2,$attr['SUP'],0,0,'L');
			}
			break;

		case 'TABLE': // TABLE-BEGIN
			if( $attr['BORDER'] != '' ) $this->tableborder=$attr['BORDER'];
			else $this->tableborder=0;
			break;
		case 'TR': //TR-BEGIN
			if($this->aktiv==1){$this->SetLeftMargin(48);}
			else{$this->SetLeftMargin(10);}
		break;
		case 'TD': // TD-BEGIN
			if(isset($attr['WIDTH']) && $attr['WIDTH'] != '' ){$this->tdwidth=($attr['WIDTH']/4);}else{$this->tdwidth=38;} 		// SET to your own width if you need bigger fixed cells
			if(isset($attr['HEIGHT']) && $attr['HEIGHT'] != ''){$this->tdheight=($attr['HEIGHT']/6);}else{$this->tdheight=6;} 	// SET to your own height if you need bigger fixed cells
			if(isset($attr['ALIGN']) && $attr['ALIGN'] != '' ){
				$align=$attr['ALIGN'];		
				if($align=="LEFT") $this->tdalign="L";
				if($align=="CENTER") $this->tdalign="C";
				if($align=="RIGHT") $this->tdalign="R";
			}
			else $this->tdalign="L"; // SET to your own

			if(isset($attr['ROWSPAN']) && $attr['ROWSPAN'] !=''){
				$this->tdheight=6*$attr['ROWSPAN'];
				$this->aktiv=1;
				$this->jetzt=1;
				$this->anzahl=$attr['ROWSPAN'];
			}
				
			if(isset($attr['COLSPAN']) && $attr['COLSPAN'] !=''){
				$this->tdwidth=38*$attr['COLSPAN'];
			}
			
			if(isset($attr['BGCOLOR']) && $attr['BGCOLOR'] != '') {
				$coul=hex2dec($attr['BGCOLOR']);
					$this->SetFillColor($coul['R'],$coul['G'],$coul['B']);
					$this->tdbgcolor=true;
			}

			$this->tdbegin=true;
			
			break;
		case 'TH': // TH-BEGIN
			
			if(isset($attr['WIDTH']) && $attr['WIDTH'] != '' ) $this->tdwidth=($attr['WIDTH']/4); else $this->tdwidth=38; // SET to your own width if you need bigger fixed cells
			if(isset($attr['HEIGHT']) && $attr['HEIGHT'] != '') $this->tdheight=($attr['HEIGHT']/6); else $this->tdheight=6; // SET to your own height if you need bigger fixed cells
			if(isset($attr['ALIGN']) && $attr['ALIGN'] != '' ) {
				$align=$attr['ALIGN'];		
				if($align=="LEFT") $this->tdalign="L";
				if($align=="CENTER") $this->tdalign="C";
				if($align=="RIGHT") $this->tdalign="R";
			}
			else $this->tdalign="L"; // SET to your own
			if(isset($attr['BGCOLOR']) && $attr['BGCOLOR'] != '') {
				$coul=hex2dec($attr['BGCOLOR']);
					//$this->SetFillColor(231,231,231);
					$this->SetFillColor($coul['R'],$coul['G'],$coul['B']);
					$this->tdbgcolor=true;
				}
			//$this->SetFillColor(231,231,231);
			$this->tdbegin=true;
			break;

		case 'HR':
			if( $attr['WIDTH'] != '' )
				$Width = $attr['WIDTH'];
			else
				$Width = $this->w - $this->lMargin-$this->rMargin;
			$x = $this->GetX();
			$y = $this->GetY();
			$this->SetLineWidth(0.2);
			$this->Line($x,$y,$x+$Width,$y);
			$this->SetLineWidth(0.2);
			$this->Ln(1);
			break;
		case 'STRONG':
			$this->SetStyle('B',true);
			break;
		case 'EM':
			$this->SetStyle('I',true);
			break;
		case 'B':
		case 'I':
		case 'U':
			$this->SetStyle($tag,true);
			break;
		case 'A':
			$this->HREF=$attr['HREF'];
			break;
		/*
		case 'IMG':
			if(isset($attr['SRC']) and (isset($attr['WIDTH']) or isset($attr['HEIGHT']))) {
				if(!isset($attr['WIDTH']))
					$attr['WIDTH'] = 0;
				if(!isset($attr['HEIGHT']))
					$attr['HEIGHT'] = 0;
				$this->Image($attr['SRC'], $this->GetX(), $this->GetY(), px2mm($attr['WIDTH']), px2mm($attr['HEIGHT']));
			}
			break;
		*/
		case 'BLOCKQUOTE':
		case 'BR':
			$this->Ln(5);
			break;
		case 'P':
			$this->Ln(10);
			break;
		case 'FONT':
			if (isset($attr['COLOR']) and $attr['COLOR']!='') {
				$coul=hex2dec($attr['COLOR']);
				$this->SetTextColor($coul['R'],$coul['G'],$coul['B']);
				$this->issetcolor=true;
			}
			if (isset($attr['FACE']) and in_array(strtolower($attr['FACE']), $this->fontlist)) {
				$this->SetFont(strtolower($attr['FACE']));
				$this->issetfont=true;
			}
			if (isset($attr['FACE']) and in_array(strtolower($attr['FACE']), $this->fontlist) and isset($attr['SIZE']) and $attr['SIZE']!='') {
				$this->SetFont(strtolower($attr['FACE']),'',$attr['SIZE']);
				$this->issetfont=true;
			}
		break;
	}
}

function CloseTag($tag)
{
	//Closing tag
	if($tag=='SUP') {
	}

	if($tag=='TD') { // TD-END
		$this->tdbegin=false;
		$this->tdwidth=0;
		$this->tdheight=0;
		$this->tdalign="L";
		$this->tdbgcolor=false;
	}
	if($tag=='TR') { // TR-END
		$this->Ln();
		$this->jetzt++;
		if($this->jetzt == $this->anzahl){
			$this->jetzt=0;
			$this->aktiv=0;
		}
	}
	if($tag=='TABLE') { // TABLE-END
		//$this->Ln();
		$this->tableborder=0;
	}

	if($tag=='STRONG')
		$tag='B';
	if($tag=='EM')
		$tag='I';
	if($tag=='B' or $tag=='I' or $tag=='U')
		$this->SetStyle($tag,false);
	if($tag=='A')
		$this->HREF='';
	if($tag=='FONT'){
		if ($this->issetcolor==true) {
			$this->SetTextColor(0);
		}
		if ($this->issetfont) {
			$this->SetFont('arial');
			$this->issetfont=false;
		}
	}
}

function SetStyle($tag,$enable)
{
	//Modify style and select corresponding font
	$this->$tag+=($enable ? 1 : -1);
	$style='';
	foreach(array('B','I','U') as $s)
		if($this->$s>0)
			$style.=$s;
	$this->SetFont('',$style);
}

function PutLink($URL,$txt)
{
	//Put a hyperlink
	$this->SetTextColor(0,0,255);
	$this->SetStyle('U',true);
	$this->Write(5,$txt,$URL);
	$this->SetStyle('U',false);
	$this->SetTextColor(0);
}

}//end of class

?>

Zuerst habe ich ein paar Variablen Deklariert und anschließend mit 0 und 1 Initialisiert.

In den Funktionen selbst habe ich folgende änderung vorgenommen:

function WriteHtml() :arrow: Die Abfrage nach dem Link gelöscht! Zeile :86 sein!
function OpenTag() :arrow: Im Case "TR" und "TD" abfragen hinzugefügt! Ab Zeile: 141
function closeTag() :arrow: Im Case "TR" Abfrage, Zurücksetzen und erhöhen um eins hinzugefügt! Zeile: 272

Dann sollte es funktionieren.
Des weiteren habe ich im TD bereich das ganze um den COLSPAN erweitert!
Die Gesammte datei ist oben im PHP-Tag zu sehen...

Und mal ne Frage an dich wie kann ich einen Automatischen Zeilenumbruch machen?
Das weiß ich selber och nicht! Versuch es mal mit der Methode Write()

Falls weitere Fragen sind, einfach stellen oder PN!

MFG
Papenburger