Social Media
Foren
Publizierung als PDF
|
Hi leute.
Ich habe mich mal daran gemacht eine Erweiterung zur Generierung einer PDF aus der aktuellen Seite zu erstellen. Gearbeitet habe ich dafür mit der freien php-Bibliothek FPDF.
Skript zur PDF-generierung mit einem rudimentären HTML parser. Läuft, ist aber noch stark erweiterbar. Die Variablenübergabe ist über einen Link von betreffender Seite mit $_GET gelöst.
Hier noch mal der Quelltextteil aus dem default-Skin
Habe die Klasse etwas erweitert, so das auch deutsche Umlaute im PDF dargestellt werden.
Ich habe mich mal daran gemacht eine Erweiterung zur Generierung einer PDF aus der aktuellen Seite zu erstellen. Gearbeitet habe ich dafür mit der freien php-Bibliothek FPDF.
Skript zur PDF-generierung mit einem rudimentären HTML parser. Läuft, ist aber noch stark erweiterbar. Die Variablenübergabe ist über einen Link von betreffender Seite mit $_GET gelöst.
PHP-Quelltext |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
<?php
Datenbankzugriff
$res = mysql_query ("SELECT content FROM cl_pages WHERE alias = '".$_GET["variable"]."'");
$dsatz = mysql_fetch_assoc($res);
define('FPDF_FONTPATH','font/');
require('../../system/thirdparty/fpdf17/fpdf.php');
class PDF_HTML extends FPDF
{
var $B=0;
var $I=0;
var $U=0;
var $HREF='';
var $ALIGN='';
function WriteHTML($html)
{
//HTML parser
$html=str_replace("", ' \n', $html);
$html=str_replace(" ", "", $html);
$html = str_replace("ä","ä",$html);
$html = str_replace("Ä","Ä",$html);
$html = str_replace("ü","ü",$html);
$html = str_replace("Ü","Ü",$html);
$html = str_replace("ö","ö",$html);
$html = str_replace("Ö","Ö",$html);
$html = str_replace("ß","ß",$html);
$html = str_replace("£","£",$html);
$html = str_replace('€',"€",$html);
$html = str_replace("§","§",$html);
$html = str_replace("′","'",$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);
elseif($this->ALIGN == 'center')
$this->Cell(0, 5, $e, 0, 1, 'C');
else
$this->Write(5, $e);
}
else
{
//Tag
if($e{0}=='/')
$this->CloseTag(strtoupper(substr($e, 1)));
else
{
//Extract properties
$a2=split(' ', $e);
$tag=strtoupper(array_shift($a2));
$prop=array();
foreach($a2 as $v)
if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$', $v, $a3))
$prop[strtoupper($a3[1])]=$a3[2];
$this->OpenTag($tag, $prop);
}
}
}
}
function OpenTag($tag, $prop)
{
//Opening tag
if($tag=='B' or $tag=='I' or $tag=='U')
$this->SetStyle($tag, true);
if($tag=='A')
$this->HREF=$prop['HREF'];
if($tag=='BR')
$this->Ln(5);
if($tag=='P')
$this->ALIGN=$prop['ALIGN'];
if($tag=='HR')
{
if( $prop['WIDTH'] != '' )
$Width = $prop['WIDTH'];
else
$Width = $this->w - $this->lMargin-$this->rMargin;
$this->Ln(2);
$x = $this->GetX();
$y = $this->GetY();
$this->SetLineWidth(0.4);
$this->Line($x, $y, $x+$Width, $y);
$this->SetLineWidth(0.2);
$this->Ln(2);
}
}
function CloseTag($tag)
{
//Closing tag
if($tag=='B' or $tag=='I' or $tag=='U')
$this->SetStyle($tag, false);
if($tag=='A')
$this->HREF='';
if($tag=='P')
$this->ALIGN='';
}
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);
}
//Kopfzeile
function Header()
{
//Logo
//$this->Image('http://images.contentlion.org/logos/logo-377-295.png',10,8,33);
//Arial fett 15
$this->SetFont('Arial','B',15);
//nach rechts gehen
$this->Cell(80);
//Titel
$this->Cell(30,10, $_GET["variable"],1,0,'C');
//Zeilenumbruch
$this->Ln(20);
$this->Ln(20);
}
//Fusszeile
function Footer()
{
//Position 1,5 cm von unten
$this->SetY(-15);
//Arial kursiv 8
$this->SetFont('Arial','I',8);
//Seitenzahl
$this->Cell(0,10,'Seite '.$this->PageNo().'/{nb}',0,0,'C');
}
}
$html = $dsatz['content'];
$pdf=new PDF_HTML();
$pdf->AliasNbPages();
$pdf->AddPage();
$pdf->SetLeftMargin(5);
$pdf->SetFont('Arial','',12);
$pdf->WriteHTML($html);
$pdf->Output();
?>
|
Hier noch mal der Quelltextteil aus dem default-Skin
PHP-Quelltext |
|
1 2 3 4 |
$alias = htmlentities(sys::getAlias());
?>
<a href="../../system/classes/createpdf.php?variable=<?PHP print ("$alias"); ?>">Mach mich PDF!</a>
|
Habe die Klasse etwas erweitert, so das auch deutsche Umlaute im PDF dargestellt werden.
|
Hab dir noch ein paar weitere Meldungen geschickt ;-)
Ich denke der PDF-Skin ist wirklich die beste Wahl.
Dort kannst du direkt auf den aktuellen Alias bzw. direkt auf den Content zugreifen.
Schau dir in der system/classes/skincontroller.php mal die Funktion getCurrentDesktopSkinName an. Da haben wir das mit dem blank-Skin schon ähnlich gemacht.
Im Footer dann der Titel des CMS und der Seite (und gerne auch nen Link zu uns ;-), aber da bin ich mir noch nicht sicher).
Ich denke der PDF-Skin ist wirklich die beste Wahl.
Dort kannst du direkt auf den aktuellen Alias bzw. direkt auf den Content zugreifen.
Schau dir in der system/classes/skincontroller.php mal die Funktion getCurrentDesktopSkinName an. Da haben wir das mit dem blank-Skin schon ähnlich gemacht.
Im Footer dann der Titel des CMS und der Seite (und gerne auch nen Link zu uns ;-), aber da bin ich mir noch nicht sicher).
|
@stevieswebsite Ich habe Dir eine "bereinigte Version der index.php vom PDF-Skin geschickt.
Gruss
Daniel
Gruss
Daniel
|
drin ja, update draußen noch nicht.
Update dauert noch ein klein wenig, weil ich gleichzeitig ne neue API dafür mitbringen möchte. Der Updater selbst würde es nicht schaffen, weil das zu viele Dateien sind.
Darin gibt's dann ne Testapi, mit der man updates vorher testen kann, sowie die Live-API. Beides dann über HTTPS.
Mehr dazu:
- http://blogs.contentlion.org/stefan-wien…ersion-und-php/
- http://blogs.contentlion.org/stefan-wien…ur-contentlion/
Update dauert noch ein klein wenig, weil ich gleichzeitig ne neue API dafür mitbringen möchte. Der Updater selbst würde es nicht schaffen, weil das zu viele Dateien sind.
Darin gibt's dann ne Testapi, mit der man updates vorher testen kann, sowie die Live-API. Beides dann über HTTPS.
Mehr dazu:
- http://blogs.contentlion.org/stefan-wien…ersion-und-php/
- http://blogs.contentlion.org/stefan-wien…ur-contentlion/
|
Entschuldigung für meine derzeitige Abwesenheit. Aber Schule war letzte Woche wichtiger. Jetzt erst mal 5 Wochen Ferien (mit 32 Jahren noch mal Sommerferien. Wer hätte das gedacht.). Naja die ersten zwei Wochen verbringe ich mit dem Streichen meines Hauses.
Also noch mal die Bitte um "Vergebung"
Gruß
Daniel
Also noch mal die Bitte um "Vergebung"
Gruß
Daniel