Deutschland United States United Kingdom
ContentLion - Open Source CMS

Publizierung als PDF

Publizierung als PDF

Wer schon Erfahrung damit hat, kann sich daran ja mal wagen. Wäre zumindest cool.
Vielleicht sogar mit Angabe eines Headers und Footers, so dass man dort quasi sein eigenes Design erstellen kann.

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.

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("&nbsp;"""$html);
        $html str_replace("&auml;","ä",$html);
    $html str_replace("&Auml;","Ä",$html);
    $html str_replace("&uuml;","ü",$html);
    $html str_replace("&Uuml;","Ü",$html);
    $html str_replace("&ouml;","ö",$html);
    $html str_replace("&Ouml;","Ö",$html);
    $html str_replace("&szlig;","ß",$html);
    $html str_replace("&pound;","£",$html);
    $html str_replace('&euro;',"€",$html);
    $html str_replace("&sect;","§",$html);
    $html str_replace("&prime;","'",$html);
        $a=preg_split('/<(.*)>/U'$html, -1PREG_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(05$e01'C');
                else
                    $this->Write(5$e);
            }
            else
            {
                //Tag
                if($e{0}=='/')
                    $this->CloseTag(strtoupper(substr($e1)));
                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($tagtrue);
        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->$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($tagfalse);
        if($tag=='A')
            $this->HREF='';
        if($tag=='P')
            $this->ALIGN='';
    }

    function SetStyle($tag$enable)
    {
        //Modify style and select corresponding font
        $this->$tag+=($enable : -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(00255);
        $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 bin der Meinung das wir jetzt das PDF Feature einbauen können, oder? Erstellung funktioniert und seit heute und nach mehreren Tests auch die canonical-Tags

Gute Idee, wär auch cool das als Standardfunktionalität einzubauen und nicht als Plugin oder ?

Ist ja schon geschehen XD Ich sollte auch erst meine Mail checken. Werds mal einbauen und in Kürze mitm Update verteilen.

Gute Idee, wär auch cool das als Standardfunktionalität einzubauen und nicht als Plugin oder ?

Ist als Corefunktion konzipiert. ^^ :thumbsup:

Ich bau mal noch mod_rewrite mit ein, dann braucht man einfach nur .pdf statt .html zu verwenden und bekommt nen PDF ;-)
Wenns fertig ist, mach ich in nächster Zeit nen Update fertig.

@stevieswebsite Ich habe Dir eine "bereinigte Version der index.php vom PDF-Skin geschickt.

Gruss
Daniel

muss ich demnächst noch einbauen.

Ist das jetzt schon drin? :D
Und ist das Update schon draußen? (Ich habe mir ja das aktuelle CMS von der Startseite geholt und noch kein Update bekommen. ^^ )

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/

:S 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

5 Wochen Sommerferien? Da kann man glatt neidisch werden^^

Auszeit sei dir gegönnt, bist ja auch fast von Anfang an schon dabei ;-)

Gruß Stefan

Bin ab nächste Woche Samstag auch für 2 Wochen im Urlaub. ;)