Source Schnipsel und Know How
Je nach Möglichkeit und Zeit, versuche ich hier ein paar Dinge online zur Verfügung zu stellen, die der/die eine oder andere nützlich finden könnte. Es handelt sich dabei meistens um kleinere oder größere Probleme und deren Lösungen, denen ich im Laufe der Zeit begegnet bin. Für weitere Tipps und Anregungen bin ich immer dankbar.1. Zentriertes Layout mit divs
Jeder kennt das Problem, Tabellen sind veraltet, divs machen aber bei zentriertem Layout in manchen Browsern Probleme. Diese Kombination von HTML und CSS wird von mir meistens eingesetzt und funktioniert in der Regel ganz gut.
Das Stylesheet
html, body {
height: 100%; /* damit auch jeder Browser die Höhe auf 100% setzt*/
}
body{
/*es ist manchmal ganz hilfreich, einfach ein Hintergrundbild zu setzen, insbesondere dann, wenn 24 Zoll Bildschirme im Spiel sind und die Browserfenster größer gezogen werden als der Browser als 100% ansieht*/
background-position:center;
background-repeat:repeat-y;
text-align:center; /*damit die IE den content-Layer auch in die Mitte setzen*/
}
div.content{
text-align:left; /*Text wieder linksbündig setzen*/
width:865px;
margin:0px auto; /*mittig zentriert für Gecko*/
min-height: 100%; /*wichtig, damit Geckos den Layer auch ausdenen bei mehr Inhalt*/
height:auto !important; /* Gecko */
height:100%; /* IE */
}
HTML-Quelltext
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!--Kopfangaben-->
</head>
<body>
<!--Layer fuer Zentrierung-->
<div class="content">
<!--Hier der mittig zentrierte Inhalt der Seite-->
</div>
</body>
</html>
html, body {
height: 100%; /* damit auch jeder Browser die Höhe auf 100% setzt*/
}
body{
/*es ist manchmal ganz hilfreich, einfach ein Hintergrundbild zu setzen, insbesondere dann, wenn 24 Zoll Bildschirme im Spiel sind und die Browserfenster größer gezogen werden als der Browser als 100% ansieht*/
background-position:center;
background-repeat:repeat-y;
text-align:center; /*damit die IE den content-Layer auch in die Mitte setzen*/
}
div.content{
text-align:left; /*Text wieder linksbündig setzen*/
width:865px;
margin:0px auto; /*mittig zentriert für Gecko*/
min-height: 100%; /*wichtig, damit Geckos den Layer auch ausdenen bei mehr Inhalt*/
height:auto !important; /* Gecko */
height:100%; /* IE */
}
HTML-Quelltext
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<!--Kopfangaben-->
</head>
<body>
<!--Layer fuer Zentrierung-->
<div class="content">
<!--Hier der mittig zentrierte Inhalt der Seite-->
</div>
</body>
</html>
2. Ergänzung zur FPDF Erweiterung FPDF::WriteHTML
Bei der genannten Erweiterung treten Probleme mit Singelton Tags (wie z.B. <br \>) und nicht validem Quelltext auf. D.h., wenn sich ein weiterer Tag (ein Umbruch, Span, etc.) in eine Überschrift eingeschlichen hat (<b><span>Text</span></b>).
Die eingefügte Funktion cleanHTML filtert mittels regulärer Ausdrücke einige dieser Fälle und sorgt auch dafür, dass ein </div> durch einen Zeilenumbruch ersetzt wird.
Falls jemand die Liste der reg. Ausdrücke um weitere, sinnvolle Strings ergänzen kann und möchte, wäre es nett, wenn man mir (zur weiteren Verbesserung meiner eigenen PDF-Funktionen) diese unter Kontakt zukommen ließe.
Die erweiterte FPDF-Klasse PDF inkl. Funktion cleanHTML
<?php
define('FPDF_FONTPATH','fpdf/font/');
require('fpdf.php');
class PDF extends FPDF
{
var $B;
var $I;
var $U;
var $HREF;
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='';
}
function WriteHTML($html)
{
//HTML parser
$html=str_replace("\n",'',$html);
$a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
foreach($a as $i=>$e)
{
if($i%2==0)
{
//Text
if($this->HREF)
$this->PutLink($this->HREF,$e);
else
$this->Write(14,$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
if($tag=='B' or $tag=='I' or $tag=='U')
$this->SetStyle($tag,true);
if($tag=='A')
$this->HREF=$attr['HREF'];
if($tag=='BR')
$this->Ln(14);
}
function CloseTag($tag)
{
//Closing tag
if($tag=='B' or $tag=='I' or $tag=='U')
$this->SetStyle($tag,false);
if($tag=='A')
$this->HREF='';
}
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(14,$txt,$URL);
$this->SetStyle('U',false);
$this->SetTextColor(0);
}
function cleanHTML($str)
{
$needles = array("/<br \/\>/","/<strong\>/","/<\/strong\>/","/\ /","/<\/div\>/","/<\/p\>/");
$sub = array("<br>","<b>","</b>"," ","<br>","<br>");
$c = preg_replace($needles,$sub,$str);
$c = strip_tags($c,'<b>,<a>,<u>,<i>,<br>');
return $c;
}
}
?>
<?php
define('FPDF_FONTPATH','fpdf/font/');
require('fpdf.php');
class PDF extends FPDF
{
var $B;
var $I;
var $U;
var $HREF;
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='';
}
function WriteHTML($html)
{
//HTML parser
$html=str_replace("\n",'',$html);
$a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
foreach($a as $i=>$e)
{
if($i%2==0)
{
//Text
if($this->HREF)
$this->PutLink($this->HREF,$e);
else
$this->Write(14,$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
if($tag=='B' or $tag=='I' or $tag=='U')
$this->SetStyle($tag,true);
if($tag=='A')
$this->HREF=$attr['HREF'];
if($tag=='BR')
$this->Ln(14);
}
function CloseTag($tag)
{
//Closing tag
if($tag=='B' or $tag=='I' or $tag=='U')
$this->SetStyle($tag,false);
if($tag=='A')
$this->HREF='';
}
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(14,$txt,$URL);
$this->SetStyle('U',false);
$this->SetTextColor(0);
}
function cleanHTML($str)
{
$needles = array("/<br \/\>/","/<strong\>/","/<\/strong\>/","/\ /","/<\/div\>/","/<\/p\>/");
$sub = array("<br>","<b>","</b>"," ","<br>","<br>");
$c = preg_replace($needles,$sub,$str);
$c = strip_tags($c,'<b>,<a>,<u>,<i>,<br>');
return $c;
}
}
?>
