## Integration of the Fpdf-class into wikka

I (gmb) found the wikini code in a cache. here it is...

<?php
/*
raw.php

version : test2

SEE PRINTED NOTES

This program is free software; you can redistribute it and/or modify
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/

define('FPDF_FONTPATH','/home/users/thierrybazzanella/html/font/');
require('fpdf.php');

// fonction hex2dec
// retourne un tableau associatif (clés : R,V,B) à
// partir d'un code html de couleur hexa (ex : #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['V']=\$vert;
\$tbl_couleur['B']=\$bleu;
return \$tbl_couleur;
}

//conversion pixel -> millimètre en 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);
}

// Surcharge de la CLASSE FPDF :

class PDF extends FPDF
{
var \$B;
var \$I;
var \$U;
var \$HREF;
var \$fontList;
var \$issetfont;
var \$issetcolor;

var \$WIKIPAGE;

function PDF(\$orientation='P',\$unit='mm',\$format='A4')
{
//Appel au constructeur parent
\$this->FPDF(\$orientation,\$unit,\$format);
//Initialisation
\$this->B=0;
\$this->I=0;
\$this->U=0;
\$this->HREF='';
\$this->fontlist=array("arial","times","courier","helvetica","symbol");
\$this->issetfont=false;
\$this->issetcolor=false;
}

function setWikiPage(\$page) {

\$this->WIKIPAGE=\$page;

}
function getWikiPage() {

return \$this->WIKIPAGE;

}

function WriteHTML(\$html)
{
//Parseur HTML
\$html=strip_tags(\$html,"<b><u><i><a><img><p><br><strong><em><font><tr><blockquote>"); //supprime tous les tags sauf ceux reconnus
\$html=str_replace("\n",' ',\$html); //remplace retour à la ligne par un espace
\$a=preg_split('/<(.*)>/U',\$html,-1,PREG_SPLIT_DELIM_CAPTURE); //éclate la chaîne avec les balises
foreach(\$a as \$i=>\$e)
{
if(\$i%2==0)
{
//Texte
if(\$this->HREF)
else
\$this->Write(5,stripslashes(txtentities(\$e)));
}
else
{
//Balise
if(\$e{0}=='/')
\$this->CloseTag(strtoupper(substr(\$e,1)));
else
{
//Extraction des attributs
\$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) //Balise ouvrante
{
switch(\$tag){
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 'TR':
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['V'],\$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;
}
break;
}
}

function CloseTag(\$tag) //Balise fermante
{
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)
{
//Modifie le style et sélectionne la police correspondante
\$this->\$tag+=(\$enable ? 1 : -1);
\$style='';
foreach(array('B','I','U') as \$s)
if(\$this->\$s>0)
\$style.=\$s;
\$this->SetFont('',\$style);
}

{
//Place un hyperlien
\$this->SetTextColor(0,0,255);
\$this->SetStyle('U',true);
\$this->Write(5,\$txt,\$URL);
\$this->SetStyle('U',false);
\$this->SetTextColor(0);
}

//En-tête
{
//Positionnement à 0,1 cm du haut
\$this->SetY(1);
//Police Arial italique 8
\$this->SetFont('Arial','I',8);
//Numéro de page
\$this->Cell(0,10,\$this->getWikiPage().' -   Page '.\$this->PageNo().'/{nb}',0,0,'C');
\$this->SetY(14);

}

//Pied de page
function Footer()
{
//Positionnement à 1,5 cm du bas
\$this->SetY(-15);
//Police Arial italique 8
\$this->SetFont('Arial','I',8);
//Numéro de page
\$this->Cell(0,10,'http://www.thierrybazzanella.com   -   Page '.\$this->PageNo().'/{nb}',0,0,'C');
}

//Chargement des données
{
//Lecture des lignes du fichier
\$lines=file(\$file);
\$data=array();
foreach(\$lines as \$line)
\$data[]=explode(';',chop(\$line));
return \$data;
}

//Tableau simple
{
//En-tête
\$this->Cell(40,7,\$col,1);
\$this->Ln();
//Données
foreach(\$data as \$row)
{
foreach(\$row as \$col)
\$this->Cell(40,6,\$col,1);
\$this->Ln();
}
}

//Tableau amélioré
{
//Largeurs des colonnes
\$w=array(40,35,45,40);
//En-tête
\$this->Ln();
//Données
foreach(\$data as \$row)
{
\$this->Cell(\$w[0],6,\$row[0],'LR');
\$this->Cell(\$w[1],6,\$row[1],'LR');
\$this->Cell(\$w[2],6,number_format(\$row[2],0,',',' '),'LR',0,'R');
\$this->Cell(\$w[3],6,number_format(\$row[3],0,',',' '),'LR',0,'R');
\$this->Ln();
}
//Trait de terminaison
\$this->Cell(array_sum(\$w),0,'','T');
}

//Tableau coloré
{
//Couleurs, épaisseur du trait et police grasse
\$this->SetFillColor(255,255,0);
\$this->SetTextColor(255);
\$this->SetDrawColor(128,0,0);
\$this->SetLineWidth(.3);
\$this->SetFont('','B');
//En-tête
\$w=array(40,35,45,40);
\$this->Ln();
//Restauration des couleurs et de la police
\$this->SetFillColor(224,235,255);
\$this->SetTextColor(0);
\$this->SetFont('');
//Données
\$fill=0;
foreach(\$data as \$row)
{
\$this->Cell(\$w[0],6,\$row[0],'LR',0,'L',\$fill);
\$this->Cell(\$w[1],6,\$row[1],'LR',0,'L',\$fill);
\$this->Cell(\$w[2],6,number_format(\$row[2],0,',',' '),'LR',0,'R',\$fill);
\$this->Cell(\$w[3],6,number_format(\$row[3],0,',',' '),'LR',0,'R',\$fill);
\$this->Ln();
\$fill=!\$fill;
}
\$this->Cell(array_sum(\$w),0,'','T');
}
}

//vérification de sécurité
if (!eregi("wakka.php", \$_SERVER['PHP_SELF'])) {
die ("acc&egrave;s direct interdit");
}

{
if (!\$this->page)
{
return;
}
else
{
if (\$_GET["save"]) {
// display raw page
echo \$this->page["body"];

\$filename = "setup/doc/".\$this->GetPageTag().".txt";
if (!\$fp = fopen(\$filename, 'w')) {
echo \$this->Format("//Impossible de créer le fichier (\$filename)//");
exit;
}

if (!fwrite(\$fp, \$this->page["body"])) {
echo  \$this->Format("//Impossible d'écrire dans le fichier (\$filename)//");
exit;
}
fclose(\$fp);

}

if (\$_GET["pdf"]) {
//Instanciation de la classe dérivée
\$pdf=new PDF();
\$pdf->AliasNbPages();
\$pdf->SetMargins(10, 10, 10);
\$pdf->setWikiPage (\$this->GetPageTag());
\$pdf->WriteHTML(\$this->Format(\$this->page["body"], "wakka"));
\$pdf->Output();
}

}
}
else
{
return;
}
?>

And the handler was called using the line....

http://www.thierrybazzanella.com/wakka.php?wiki=Accueil/raw&pdf=1

and here are the instructions....

"Elle est téléchargeable vers http://www.fpdf.org

INSTALLATION:

Téléchargez la librairie fpdf et dézippez-là dans un dossier.
Mettez le fichier fpdf.php et le dossier font à la racine de votre wiki.
Téléchargez le fichier handlers/page/raw.php livré ICI,éditez le, et définissez en absolu le chemin du dossier font de votre arborescence fichier.
Ligne 25 : define('FPDF_FONTPATH','/home/www/users/thierrybazzanella/www/html/font/');

Remplacer ce fichier par le vôtre en lieu et place. "

that were there.

• Thanks, Mike. That looks nicely implemented - though I don't see where the page is turned into HTML first; my guess is you need to run it through the formatter first (it looks like it's transforming HTML tags - not Wiki-markup tags - for printing as PDF). But it shouldn't be too hard to make it work. --JavaWoman

### Installing Fpdf

2. save the following code as handlers/page/pdf.php
<?php
/*

@author Thierry BAZZANELLA
@author Nils Lindenberg (changes for wikka, marked with NL)

*/

//(NL) changed for wikka
define('FPDF_FONTPATH','font/');
require_once('3rdparty/plugins/fpdf/fpdf.php');

// fonction hex2dec
// retourne un tableau associatif (clés : R,V,B) à
// partir d'un code html de couleur hexa (ex : #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['V']=\$vert;
\$tbl_couleur['B']=\$bleu;
return \$tbl_couleur;
}

//conversion pixel -> millimètre en 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);
}

// Surcharge de la CLASSE FPDF :

class PDF extends FPDF
{
var \$B;
var \$I;
var \$U;
var \$HREF;
var \$fontList;
var \$issetfont;
var \$issetcolor;

var \$WIKIPAGE;

function PDF(\$orientation='P',\$unit='mm',\$format='A4')
{
//Appel au constructeur parent
\$this->FPDF(\$orientation,\$unit,\$format);
//Initialisation
\$this->B=0;
\$this->I=0;
\$this->U=0;
\$this->HREF='';
\$this->fontlist=array("arial","times","courier","helvetica","symbol");
\$this->issetfont=false;
\$this->issetcolor=false;
}

function setWikiPage(\$page) {

\$this->WIKIPAGE=\$page;

}
function getWikiPage() {

return \$this->WIKIPAGE;

}

function WriteHTML(\$html)
{
//Parseur HTML
\$html=strip_tags(\$html,"<b><u><i><a><img><p><br><strong><em><font><tr><blockquote>"); //supprime tous les tags sauf ceux reconnus
\$html=str_replace("\n",' ',\$html); //remplace retour à la ligne par un espace
\$a=preg_split('/<(.*)>/U',\$html,-1,PREG_SPLIT_DELIM_CAPTURE); //éclate la chaîne avec les balises
foreach(\$a as \$i=>\$e)
{
if(\$i%2==0)
{
//Texte
if(\$this->HREF)
else
\$this->Write(5,stripslashes(txtentities(\$e)));
}
else
{
//Balise
if(\$e{0}=='/')
\$this->CloseTag(strtoupper(substr(\$e,1)));
else
{
//Extraction des attributs
\$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) //Balise ouvrante
{
switch(\$tag){
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 'TR':
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['V'],\$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;
}
break;
}
}

function CloseTag(\$tag) //Balise fermante
{
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)
{
//Modifie le style et sélectionne la police correspondante
\$this->\$tag+=(\$enable ? 1 : -1);
\$style='';
foreach(array('B','I','U') as \$s)
if(\$this->\$s>0)
\$style.=\$s;
\$this->SetFont('',\$style);
}

{
//Place un hyperlien
\$this->SetTextColor(0,0,255);
\$this->SetStyle('U',true);
\$this->Write(5,\$txt,\$URL);
\$this->SetStyle('U',false);
\$this->SetTextColor(0);
}

//En-tête
{
//Positionnement à 0,1 cm du haut
\$this->SetY(1);
//Police Arial italique 8
\$this->SetFont('Arial','I',8);
//Numéro de page
\$this->Cell(0,10,\$this->getWikiPage().' -   Page '.\$this->PageNo().'/{nb}',0,0,'C');
\$this->SetY(14);

}

//Pied de page
function Footer()
{
//Positionnement à 1,5 cm du bas
\$this->SetY(-15);
//Police Arial italique 8
\$this->SetFont('Arial','I',8);
//Numéro de page
\$this->Cell(0,10,'http://www.thierrybazzanella.com   -   Page '.\$this->PageNo().'/{nb}',0,0,'C');
}

//Chargement des données
{
//Lecture des lignes du fichier
\$lines=file(\$file);
\$data=array();
foreach(\$lines as \$line)
\$data[]=explode(';',chop(\$line));
return \$data;
}

//Tableau simple
{
//En-tête
\$this->Cell(40,7,\$col,1);
\$this->Ln();
//Données
foreach(\$data as \$row)
{
foreach(\$row as \$col)
\$this->Cell(40,6,\$col,1);
\$this->Ln();
}
}

//Tableau amélioré
{
//Largeurs des colonnes
\$w=array(40,35,45,40);
//En-tête
\$this->Ln();
//Données
foreach(\$data as \$row)
{
\$this->Cell(\$w[0],6,\$row[0],'LR');
\$this->Cell(\$w[1],6,\$row[1],'LR');
\$this->Cell(\$w[2],6,number_format(\$row[2],0,',',' '),'LR',0,'R');
\$this->Cell(\$w[3],6,number_format(\$row[3],0,',',' '),'LR',0,'R');
\$this->Ln();
}
//Trait de terminaison
\$this->Cell(array_sum(\$w),0,'','T');
}

//Tableau coloré
{
//Couleurs, épaisseur du trait et police grasse
\$this->SetFillColor(255,255,0);
\$this->SetTextColor(255);
\$this->SetDrawColor(128,0,0);
\$this->SetLineWidth(.3);
\$this->SetFont('','B');
//En-tête
\$w=array(40,35,45,40);
\$this->Ln();
//Restauration des couleurs et de la police
\$this->SetFillColor(224,235,255);
\$this->SetTextColor(0);
\$this->SetFont('');
//Données
\$fill=0;
foreach(\$data as \$row)
{
\$this->Cell(\$w[0],6,\$row[0],'LR',0,'L',\$fill);
\$this->Cell(\$w[1],6,\$row[1],'LR',0,'L',\$fill);
\$this->Cell(\$w[2],6,number_format(\$row[2],0,',',' '),'LR',0,'R',\$fill);
\$this->Cell(\$w[3],6,number_format(\$row[3],0,',',' '),'LR',0,'R',\$fill);
\$this->Ln();
\$fill=!\$fill;
}
\$this->Cell(array_sum(\$w),0,'','T');
}
}

/* (NL) does not work with wikka
//vérification de sécurité
if (!eregi("wakka.php", \$_SERVER['PHP_SELF'])) {
die ("acc&egrave;s direct interdit");
}
*/

{
/* (NL) we want pdf -eport - *.txt would be another handler
if (!\$this->page)
{
return;
}
else
{
if (\$_GET["save"]) {
// display raw page
echo \$this->page["body"];

\$filename = "setup/doc/".\$this->GetPageTag().".txt";
if (!\$fp = fopen(\$filename, 'w')) {
echo \$this->Format("//Impossible de créer le fichier (\$filename)//");
exit;
}

if (!fwrite(\$fp, \$this->page["body"])) {
echo  \$this->Format("//Impossible d'écrire dans le fichier (\$filename)//");
exit;
}
fclose(\$fp);

}

if (\$_GET["pdf"]) { */

//Instanciation de la classe dérivée
\$pdf=new PDF();
\$pdf->AliasNbPages();
\$pdf->SetMargins(10, 10, 10);
\$pdf->setWikiPage (\$this->GetPageTag());
\$pdf->WriteHTML(\$this->Format(\$this->page["body"], "wakka"));
\$pdf->Output();
//}

//}
}
else
{
return;
}
?>

3. Change the following thing in wikka.php
a) no computing time (i.e. after line 385 if you are using 1.1.6.5):
change
if (!preg_match("/(xml|raw|mm)\$/", \$method))

to
if (!preg_match("/(xml|raw|mm|pdf)\$/", \$method))

b) we want no header and footer, therefore change in libs/Wakka.class.php
add after the following code (i.e. after line 1750 if you are using 1.1.6.5)
// raw page handler
elseif (\$this->method == "raw")
{
print(\$this->Method(\$this->method));
}

//page to pdf - handler
elseif (\$this->method == "pdf")
{
print(\$this->Method(\$this->method));
}

4. Notice that the real work has only begun ;)

CategoryDevelopmentHandlers, CategoryDevelopmentArchitecture