Revision history for WikkaToPDF
Revision [23023]
Last edited on 2016-05-20 07:38:44 by NilsLindenberg [Replaces old-style internal links with new pipe-split links.]Additions:
(More generally, an ##/export## handler could give the user the choice about the preferred [[WikkaFilters | export format]]). There are several GPL-licensed Java and php solution for generating PDFs on the fly.
~~-[[http://www.fpdf.org/ | FPDF]] --- a PHP class, which allows to generate PDF files without using the PDFlib library.
~~-[[http://www.pc4p.net/ | PC4P]] --- a PDF class for PHP.
~~-[[http://sourceforge.net/projects/pdf-php | PDF-PHP]] --- Create pdf documents using PHP, but without installing any modules. Comprises a base class which performs all the pdf creation, and an extension class (ezPdf) to allow simple document creation.
~~-[[http://www.ros.co.nz/pdf/ | R&OS pdf class]] --- a PHP class which will allow the easy production of simple pdf documents.
~~-[[http://www.tufat.com/script19.htm | html2pdf]] --- a PHP package that converts web pages to pdf, including css and images.
~~-[[http://xml.apache.org/fop/ | FOP (Formatting Objects Processor) ]] --- (GPL) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, SVG, XML (area tree representation), Print, AWT, MIF and TXT. The primary output target is PDF.
~~-[[http://www.xwiki.org/xwiki/bin/view/Dev/XWikiPDFExport | XWiki PDF Export]] --- An implementation of FOP for [[http://www.xwiki.org/ | XWiki]].
~~&Mike, I tried the R&OS pdf class and it is fairly easy to set up. The example in he readme file for database tables works straight out of the box. Just change the database settings and the SQL to query the database and your almost there. (A SQL query like **select tag,body from main_wikka_pages where tag="HomePage" and latest="y"';** gives you output like [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php | this]] Of course, it shows that we need to handle the hyperlink formatting too. --JamesMcl .
~&FYI: wikini conversation re [[http://www.wikini.net/wakka.php?wiki=WikiToPdf | wiki2pdf]]...already a wikini handler developed....see [[http://www.thierrybazzanella.com/index.php?2004/10/30/9-handler-pdf | here]]...might be easier to just adapt since GPL. I tested it in wikini and it worked okay. --GmBowen
~~&Looks like there is no code yet - as far as I can deduce from the [[http://www.wikini.net/wakka.php?wiki=WikiToPdf | wiki2pdf]] page the project is still in the conceptual stage? http://www.thierrybazzanella.com/ only redirects to another (Flash-only) site. --JavaWoman
~~&Mike, I just tried the R & OS pdf class. It works well straight out of the box. Change the database settings and the SQL query to something like **select tag,body from wikka_pages where tag="HomePage" and latest="y"** and you get [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php | this]]. Obviously, the hyperlink formatting will need to be addressed too. --JamesMcl
I think that a better way to investigate would be to look at the [[http://www.tufat.com/script19.htm | html2pdf]] package. This package seems to do pretty well with css and images. It is backended by gostscript to convert the page to postscript then to pdf. The downfall for this package is that it seems to be quite cpu intensive while generating the pdf. You can see a demo of it at [[http://pdf.shroom.net]].
~~-[[http://www.fpdf.org/ | FPDF]] --- a PHP class, which allows to generate PDF files without using the PDFlib library.
~~-[[http://www.pc4p.net/ | PC4P]] --- a PDF class for PHP.
~~-[[http://sourceforge.net/projects/pdf-php | PDF-PHP]] --- Create pdf documents using PHP, but without installing any modules. Comprises a base class which performs all the pdf creation, and an extension class (ezPdf) to allow simple document creation.
~~-[[http://www.ros.co.nz/pdf/ | R&OS pdf class]] --- a PHP class which will allow the easy production of simple pdf documents.
~~-[[http://www.tufat.com/script19.htm | html2pdf]] --- a PHP package that converts web pages to pdf, including css and images.
~~-[[http://xml.apache.org/fop/ | FOP (Formatting Objects Processor) ]] --- (GPL) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, SVG, XML (area tree representation), Print, AWT, MIF and TXT. The primary output target is PDF.
~~-[[http://www.xwiki.org/xwiki/bin/view/Dev/XWikiPDFExport | XWiki PDF Export]] --- An implementation of FOP for [[http://www.xwiki.org/ | XWiki]].
~~&Mike, I tried the R&OS pdf class and it is fairly easy to set up. The example in he readme file for database tables works straight out of the box. Just change the database settings and the SQL to query the database and your almost there. (A SQL query like **select tag,body from main_wikka_pages where tag="HomePage" and latest="y"';** gives you output like [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php | this]] Of course, it shows that we need to handle the hyperlink formatting too. --JamesMcl .
~&FYI: wikini conversation re [[http://www.wikini.net/wakka.php?wiki=WikiToPdf | wiki2pdf]]...already a wikini handler developed....see [[http://www.thierrybazzanella.com/index.php?2004/10/30/9-handler-pdf | here]]...might be easier to just adapt since GPL. I tested it in wikini and it worked okay. --GmBowen
~~&Looks like there is no code yet - as far as I can deduce from the [[http://www.wikini.net/wakka.php?wiki=WikiToPdf | wiki2pdf]] page the project is still in the conceptual stage? http://www.thierrybazzanella.com/ only redirects to another (Flash-only) site. --JavaWoman
~~&Mike, I just tried the R & OS pdf class. It works well straight out of the box. Change the database settings and the SQL query to something like **select tag,body from wikka_pages where tag="HomePage" and latest="y"** and you get [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php | this]]. Obviously, the hyperlink formatting will need to be addressed too. --JamesMcl
I think that a better way to investigate would be to look at the [[http://www.tufat.com/script19.htm | html2pdf]] package. This package seems to do pretty well with css and images. It is backended by gostscript to convert the page to postscript then to pdf. The downfall for this package is that it seems to be quite cpu intensive while generating the pdf. You can see a demo of it at [[http://pdf.shroom.net]].
Deletions:
~~-[[http://www.fpdf.org/ FPDF]] --- a PHP class, which allows to generate PDF files without using the PDFlib library.
~~-[[http://www.pc4p.net/ PC4P]] --- a PDF class for PHP.
~~-[[http://sourceforge.net/projects/pdf-php PDF-PHP]] --- Create pdf documents using PHP, but without installing any modules. Comprises a base class which performs all the pdf creation, and an extension class (ezPdf) to allow simple document creation.
~~-[[http://www.ros.co.nz/pdf/ R&OS pdf class]] --- a PHP class which will allow the easy production of simple pdf documents.
~~-[[http://www.tufat.com/script19.htm html2pdf]] --- a PHP package that converts web pages to pdf, including css and images.
~~-[[http://xml.apache.org/fop/ FOP (Formatting Objects Processor) ]] --- (GPL) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, SVG, XML (area tree representation), Print, AWT, MIF and TXT. The primary output target is PDF.
~~-[[http://www.xwiki.org/xwiki/bin/view/Dev/XWikiPDFExport XWiki PDF Export]] --- An implementation of FOP for [[http://www.xwiki.org/ XWiki]].
~~&Mike, I tried the R&OS pdf class and it is fairly easy to set up. The example in he readme file for database tables works straight out of the box. Just change the database settings and the SQL to query the database and your almost there. (A SQL query like **select tag,body from main_wikka_pages where tag="HomePage" and latest="y"';** gives you output like [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php this]] Of course, it shows that we need to handle the hyperlink formatting too. --JamesMcl .
~&FYI: wikini conversation re [[http://www.wikini.net/wakka.php?wiki=WikiToPdf wiki2pdf]]...already a wikini handler developed....see [[http://www.thierrybazzanella.com/index.php?2004/10/30/9-handler-pdf here]]...might be easier to just adapt since GPL. I tested it in wikini and it worked okay. --GmBowen
~~&Looks like there is no code yet - as far as I can deduce from the [[http://www.wikini.net/wakka.php?wiki=WikiToPdf wiki2pdf]] page the project is still in the conceptual stage? http://www.thierrybazzanella.com/ only redirects to another (Flash-only) site. --JavaWoman
~~&Mike, I just tried the R & OS pdf class. It works well straight out of the box. Change the database settings and the SQL query to something like **select tag,body from wikka_pages where tag="HomePage" and latest="y"** and you get [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php this]]. Obviously, the hyperlink formatting will need to be addressed too. --JamesMcl
I think that a better way to investigate would be to look at the [[http://www.tufat.com/script19.htm html2pdf]] package. This package seems to do pretty well with css and images. It is backended by gostscript to convert the page to postscript then to pdf. The downfall for this package is that it seems to be quite cpu intensive while generating the pdf. You can see a demo of it at [[http://pdf.shroom.net]].
Revision [18542]
Edited on 2008-01-28 00:11:56 by NilsLindenberg [Modified links pointing to docs server]No Differences
Additions:
>>**See also**:
WikkaFilters
FpdfIntegration
>>::c::
==== Html2pdf ====
WikkaFilters
FpdfIntegration
>>::c::
==== Html2pdf ====
Deletions:
==== Htnml2pdf ====
Additions:
==== FPDF ====
====Concept====
====R & OS pdf class====
~~&Mike, I just tried the R & OS pdf class. It works well straight out of the box. Change the database settings and the SQL query to something like **select tag,body from wikka_pages where tag="HomePage" and latest="y"** and you get [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php this]]. Obviously, the hyperlink formatting will need to be addressed too. --JamesMcl
~~~&Having a second look, some of the text seems to be missing from the page, I don't know why yet, may be something to do with the page layout --JamesMcl
~~~~&Maybe it's expecting an HTML document? It looks like lots of text is just cut off - but it's unformatted wiki source, so there really //is// no "page layout" - just a stream of plain text. I'd try running the wiki page through the formatter before feeding it to the PDF converter. BTW, what does "R & OS" stand for? --JavaWoman
~~~~~&JavaWoman, I am not sure how you run a wiki page through the formatter. I don't know what "R & OS" stands for as the site that the class is on, http://www.ros.co.nz/ doesn't say on the web page. By the way DarTar, the PDF-PHP class is the same as the "R & OS" class. One is on the SourceForge site, the other on http://www.ros.co.nz/--JamesMcl
~~~~~~&Looking at the readme file on the http://www.ros.co.nz/ site it seems it does not expect any HTML at all, you need to do all the formatting yourself from raw data. Not so easy to do if what you need is a PDP equivalent of a rendered HTML page... Looks like FPDF is easier to implement. That said, you can run a wiki page (or any bit of code) through the formatter by just passing the code as a parameter to the formatter: %%(php)$output = $this->Format($input);%% --JavaWoman
~~~~~~~&Thanks for the explanation JavaWoman, but it's way over my head. Regarding the class, I agree, FPDF seems to be the way to go. --JamesMcl
==== Htnml2pdf ====
====Concept====
====R & OS pdf class====
~~&Mike, I just tried the R & OS pdf class. It works well straight out of the box. Change the database settings and the SQL query to something like **select tag,body from wikka_pages where tag="HomePage" and latest="y"** and you get [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php this]]. Obviously, the hyperlink formatting will need to be addressed too. --JamesMcl
~~~&Having a second look, some of the text seems to be missing from the page, I don't know why yet, may be something to do with the page layout --JamesMcl
~~~~&Maybe it's expecting an HTML document? It looks like lots of text is just cut off - but it's unformatted wiki source, so there really //is// no "page layout" - just a stream of plain text. I'd try running the wiki page through the formatter before feeding it to the PDF converter. BTW, what does "R & OS" stand for? --JavaWoman
~~~~~&JavaWoman, I am not sure how you run a wiki page through the formatter. I don't know what "R & OS" stands for as the site that the class is on, http://www.ros.co.nz/ doesn't say on the web page. By the way DarTar, the PDF-PHP class is the same as the "R & OS" class. One is on the SourceForge site, the other on http://www.ros.co.nz/--JamesMcl
~~~~~~&Looking at the readme file on the http://www.ros.co.nz/ site it seems it does not expect any HTML at all, you need to do all the formatting yourself from raw data. Not so easy to do if what you need is a PDP equivalent of a rendered HTML page... Looks like FPDF is easier to implement. That said, you can run a wiki page (or any bit of code) through the formatter by just passing the code as a parameter to the formatter: %%(php)$output = $this->Format($input);%% --JavaWoman
~~~~~~~&Thanks for the explanation JavaWoman, but it's way over my head. Regarding the class, I agree, FPDF seems to be the way to go. --JamesMcl
==== Htnml2pdf ====
Deletions:
==== More Discussion ====
Revision [9899]
Edited on 2005-07-08 13:31:51 by NilsLindenberg [copied parts about FPDF to FpdfIntegration]Deletions:
%%(php)<?php
/*
raw.php
version : test2
SEE PRINTED NOTES
Copyright 2004 Thierry BAZZANELLA
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
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)
$this->PutLink($this->HREF,$e);
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);
function PutLink($URL,$txt)
//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
function LoadData($file)
//Lecture des lignes du fichier
$lines=file($file);
$data=array();
foreach($lines as $line)
$data[]=explode(';',chop($line));
return $data;
//Tableau simple
function BasicTable($header,$data)
//En-tête
foreach($header as $col)
$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é
function ImprovedTable($header,$data)
//Largeurs des colonnes
$w=array(40,35,45,40);
//En-tête
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C');
$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é
function FancyTable($header,$data)
//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);
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C',1);
$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ès direct interdit");
if ($this->HasAccess("read"))
if (!$this->page)
{
return;
}
else
{
if ($_GET["save"]) {
header("Content-type: text/plain");
// 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->AddPage();
$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
~~&Mike, I just tried the R & OS pdf class. It works well straight out of the box. Change the database settings and the SQL query to something like **select tag,body from wikka_pages where tag="HomePage" and latest="y"** and you get [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php this]]. Obviously, the hyperlink formatting will need to be addressed too. --JamesMcl
~~~&Having a second look, some of the text seems to be missing from the page, I don't know why yet, may be something to do with the page layout --JamesMcl
~~~~&Maybe it's expecting an HTML document? It looks like lots of text is just cut off - but it's unformatted wiki source, so there really //is// no "page layout" - just a stream of plain text. I'd try running the wiki page through the formatter before feeding it to the PDF converter. BTW, what does "R & OS" stand for? --JavaWoman
~~~~~&JavaWoman, I am not sure how you run a wiki page through the formatter. I don't know what "R & OS" stands for as the site that the class is on, http://www.ros.co.nz/ doesn't say on the web page. By the way DarTar, the PDF-PHP class is the same as the "R & OS" class. One is on the SourceForge site, the other on http://www.ros.co.nz/--JamesMcl
~~~~~~&Looking at the readme file on the http://www.ros.co.nz/ site it seems it does not expect any HTML at all, you need to do all the formatting yourself from raw data. Not so easy to do if what you need is a PDP equivalent of a rendered HTML page... Looks like FPDF is easier to implement. That said, you can run a wiki page (or any bit of code) through the formatter by just passing the code as a parameter to the formatter: %%(php)$output = $this->Format($input);%% --JavaWoman
~~~~~~~&Thanks for the explanation JavaWoman, but it's way over my head. Regarding the class, I agree, FPDF seems to be the way to go. --JamesMcl
====Installing Fpdf====
1. download the fpdf-package and put it's content into ##3rdparty/plugins/fpdf##
2. save the following code as ##handlers/page/pdf.php##
%%(php)
/*
Copyright 2004 Thierry BAZZANELLA
@license GNU GPL
@author Thierry BAZZANELLA
@author Nils Lindenberg (changes for wikka, marked with NL)
*/
//(NL) changed for wikka
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)
$this->PutLink($this->HREF,$e);
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);
function PutLink($URL,$txt)
//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
function LoadData($file)
//Lecture des lignes du fichier
$lines=file($file);
$data=array();
foreach($lines as $line)
$data[]=explode(';',chop($line));
return $data;
//Tableau simple
function BasicTable($header,$data)
//En-tête
foreach($header as $col)
$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é
function ImprovedTable($header,$data)
//Largeurs des colonnes
$w=array(40,35,45,40);
//En-tête
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C');
$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é
function FancyTable($header,$data)
//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);
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C',1);
$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ès direct interdit");
*/
if ($this->HasAccess("read"))
/* (NL) we want pdf -eport - *.txt would be another handler
if (!$this->page)
{
return;
}
else
{
if ($_GET["save"]) {
header("Content-type: text/plain");
// 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->AddPage();
$pdf->WriteHTML($this->Format($this->page["body"], "wakka"));
$pdf->Output();
//}
//}
else
return;
3. Change the following two things in ##wikka.php##
a) no computing time (near the bottom of the file):
**change**
%%(php)
if (!preg_match("/(xml|raw|mm)$/", $method))
to
%%(php)
if (!preg_match("/(xml|raw|mm|pdf)$/", $method))
b) we want no header and footer (a little bit above)
**add** after:
%%(php)
// raw page handler
elseif ($this->method == "raw")
{
header("Content-type: text/plain");
print($this->Method($this->method));
}
%%(php)
//page to pdf - handler
elseif ($this->method == "pdf")
{
print($this->Method($this->method));
}
4. Notice that the real work has only begun ;)
Revision [9360]
Edited on 2005-06-21 20:33:52 by AdamCrews [copied parts about FPDF to FpdfIntegration]Additions:
~~-[[http://www.tufat.com/script19.htm html2pdf]] --- a PHP package that converts web pages to pdf, including css and images.
==== More Discussion ====
I think that a better way to investigate would be to look at the [[http://www.tufat.com/script19.htm html2pdf]] package. This package seems to do pretty well with css and images. It is backended by gostscript to convert the page to postscript then to pdf. The downfall for this package is that it seems to be quite cpu intensive while generating the pdf. You can see a demo of it at [[http://pdf.shroom.net]].
I invision this as a action that can be added to a float box and the pdf is returned when a user click on a pdf icon or something along these lines.
I also think that some code should be added to cache a generated pdf, and serve the cached pdf if the page has not changed since the pdf was generated.
-AdamCrews
==== More Discussion ====
I think that a better way to investigate would be to look at the [[http://www.tufat.com/script19.htm html2pdf]] package. This package seems to do pretty well with css and images. It is backended by gostscript to convert the page to postscript then to pdf. The downfall for this package is that it seems to be quite cpu intensive while generating the pdf. You can see a demo of it at [[http://pdf.shroom.net]].
I invision this as a action that can be added to a float box and the pdf is returned when a user click on a pdf icon or something along these lines.
I also think that some code should be added to cache a generated pdf, and serve the cached pdf if the page has not changed since the pdf was generated.
-AdamCrews
Additions:
CategoryDevelopmentHandlers CategoryDevelopmentArchitecture
Deletions:
Revision [7845]
Edited on 2005-05-03 16:23:08 by NilsLindenberg [headers, installation of fpdf (hopefully ;)]Additions:
==== Some references ====
==== Discussion ====
====Installing Fpdf====
1. download the fpdf-package and put it's content into ##3rdparty/plugins/fpdf##
2. save the following code as ##handlers/page/pdf.php##
%%(php)
@license GNU GPL
@author Thierry BAZZANELLA
@author Nils Lindenberg (changes for wikka, marked with NL)
//(NL) changed for wikka
require_once('3rdparty/plugins/fpdf/fpdf.php');
/* (NL) does not work with wikka
/* (NL) we want pdf -eport - *.txt would be another handler
if ($_GET["pdf"]) { */
//Instanciation de la classe dérivée
//}
//}
3. Change the following two things in ##wikka.php##
a) no computing time (near the bottom of the file):
**change**
%%(php)
if (!preg_match("/(xml|raw|mm)$/", $method))
to
%%(php)
if (!preg_match("/(xml|raw|mm|pdf)$/", $method))
b) we want no header and footer (a little bit above)
**add** after:
%%(php)
// raw page handler
elseif ($this->method == "raw")
{
header("Content-type: text/plain");
print($this->Method($this->method));
}
%%(php)
//page to pdf - handler
elseif ($this->method == "pdf")
{
print($this->Method($this->method));
}
4. Notice that the real work has only begun ;)
==== Discussion ====
====Installing Fpdf====
1. download the fpdf-package and put it's content into ##3rdparty/plugins/fpdf##
2. save the following code as ##handlers/page/pdf.php##
%%(php)
@license GNU GPL
@author Thierry BAZZANELLA
@author Nils Lindenberg (changes for wikka, marked with NL)
//(NL) changed for wikka
require_once('3rdparty/plugins/fpdf/fpdf.php');
/* (NL) does not work with wikka
/* (NL) we want pdf -eport - *.txt would be another handler
if ($_GET["pdf"]) { */
//Instanciation de la classe dérivée
//}
//}
3. Change the following two things in ##wikka.php##
a) no computing time (near the bottom of the file):
**change**
%%(php)
if (!preg_match("/(xml|raw|mm)$/", $method))
to
%%(php)
if (!preg_match("/(xml|raw|mm|pdf)$/", $method))
b) we want no header and footer (a little bit above)
**add** after:
%%(php)
// raw page handler
elseif ($this->method == "raw")
{
header("Content-type: text/plain");
print($this->Method($this->method));
}
%%(php)
//page to pdf - handler
elseif ($this->method == "pdf")
{
print($this->Method($this->method));
}
4. Notice that the real work has only begun ;)
Deletions:
== Discussion ==
Additions:
~~~~~~~&Thanks for the explanation JavaWoman, but it's way over my head. Regarding the class, I agree, FPDF seems to be the way to go. --JamesMcl
Additions:
~~~~~~&Looking at the readme file on the http://www.ros.co.nz/ site it seems it does not expect any HTML at all, you need to do all the formatting yourself from raw data. Not so easy to do if what you need is a PDP equivalent of a rendered HTML page... Looks like FPDF is easier to implement. That said, you can run a wiki page (or any bit of code) through the formatter by just passing the code as a parameter to the formatter: %%(php)$output = $this->Format($input);%% --JavaWoman
Additions:
~~~~~&JavaWoman, I am not sure how you run a wiki page through the formatter. I don't know what "R & OS" stands for as the site that the class is on, http://www.ros.co.nz/ doesn't say on the web page. By the way DarTar, the PDF-PHP class is the same as the "R & OS" class. One is on the SourceForge site, the other on http://www.ros.co.nz/--JamesMcl
Additions:
~~~~&Maybe it's expecting an HTML document? It looks like lots of text is just cut off - but it's unformatted wiki source, so there really //is// no "page layout" - just a stream of plain text. I'd try running the wiki page through the formatter before feeding it to the PDF converter. BTW, what does "R & OS" stand for? --JavaWoman
Additions:
~~~&Having a second look, some of the text seems to be missing from the page, I don't know why yet, may be something to do with the page layout --JamesMcl
Additions:
~~&Mike, I tried the R&OS pdf class and it is fairly easy to set up. The example in he readme file for database tables works straight out of the box. Just change the database settings and the SQL to query the database and your almost there. (A SQL query like **select tag,body from main_wikka_pages where tag="HomePage" and latest="y"';** gives you output like [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php this]] Of course, it shows that we need to handle the hyperlink formatting too. --JamesMcl .
~~&Mike, I just tried the R & OS pdf class. It works well straight out of the box. Change the database settings and the SQL query to something like **select tag,body from wikka_pages where tag="HomePage" and latest="y"** and you get [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php this]]. Obviously, the hyperlink formatting will need to be addressed too. --JamesMcl
~~&Mike, I just tried the R & OS pdf class. It works well straight out of the box. Change the database settings and the SQL query to something like **select tag,body from wikka_pages where tag="HomePage" and latest="y"** and you get [[http://www.jamesmcl.co.uk/ezpdf/ezpdf.php this]]. Obviously, the hyperlink formatting will need to be addressed too. --JamesMcl
Additions:
~&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
Revision [7494]
Edited on 2005-04-23 01:36:14 by GmBowen [reply to JW re: the code that was missing]Additions:
I (gmb) found the wikini code in a cache. here it is.....
%%(php)<?php
/*
raw.php
version : test2
SEE PRINTED NOTES
Copyright 2004 Thierry BAZZANELLA
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
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)
$this->PutLink($this->HREF,$e);
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);
function PutLink($URL,$txt)
//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
function LoadData($file)
//Lecture des lignes du fichier
$lines=file($file);
$data=array();
foreach($lines as $line)
$data[]=explode(';',chop($line));
return $data;
//Tableau simple
function BasicTable($header,$data)
//En-tête
foreach($header as $col)
$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é
function ImprovedTable($header,$data)
//Largeurs des colonnes
$w=array(40,35,45,40);
//En-tête
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C');
$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é
function FancyTable($header,$data)
//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);
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C',1);
$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ès direct interdit");
if ($this->HasAccess("read"))
if (!$this->page)
{
return;
}
else
{
if ($_GET["save"]) {
header("Content-type: text/plain");
// 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->AddPage();
$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.
%%(php)<?php
/*
raw.php
version : test2
SEE PRINTED NOTES
Copyright 2004 Thierry BAZZANELLA
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
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)
$this->PutLink($this->HREF,$e);
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);
function PutLink($URL,$txt)
//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
function LoadData($file)
//Lecture des lignes du fichier
$lines=file($file);
$data=array();
foreach($lines as $line)
$data[]=explode(';',chop($line));
return $data;
//Tableau simple
function BasicTable($header,$data)
//En-tête
foreach($header as $col)
$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é
function ImprovedTable($header,$data)
//Largeurs des colonnes
$w=array(40,35,45,40);
//En-tête
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C');
$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é
function FancyTable($header,$data)
//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);
for($i=0;$i<count($header);$i++)
$this->Cell($w[$i],7,$header[$i],1,0,'C',1);
$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ès direct interdit");
if ($this->HasAccess("read"))
if (!$this->page)
{
return;
}
else
{
if ($_GET["save"]) {
header("Content-type: text/plain");
// 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->AddPage();
$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.
Additions:
1) make a concept for ExportToPdf
~&FYI: wikini conversation re [[http://www.wikini.net/wakka.php?wiki=WikiToPdf wiki2pdf]]...already a wikini handler developed....see [[http://www.thierrybazzanella.com/index.php?2004/10/30/9-handler-pdf here]]...might be easier to just adapt since GPL. I tested it in wikini and it worked okay. --GmBowen
~&I sure hope somebody grabbed this code as it's not there any more. If you have it, please let me know. I have a php coder working for me the next 2 months who may be able to adapt it for wikka. --GmBowen
~~&Looks like there is no code yet - as far as I can deduce from the [[http://www.wikini.net/wakka.php?wiki=WikiToPdf wiki2pdf]] page the project is still in the conceptual stage? http://www.thierrybazzanella.com/ only redirects to another (Flash-only) site. --JavaWoman
~~&I've looked at the page but forgot to grab the code (I darkly remember the beeing of code on the page) --NilsLindenberg
~&FYI: wikini conversation re [[http://www.wikini.net/wakka.php?wiki=WikiToPdf wiki2pdf]]...already a wikini handler developed....see [[http://www.thierrybazzanella.com/index.php?2004/10/30/9-handler-pdf here]]...might be easier to just adapt since GPL. I tested it in wikini and it worked okay. --GmBowen
~&I sure hope somebody grabbed this code as it's not there any more. If you have it, please let me know. I have a php coder working for me the next 2 months who may be able to adapt it for wikka. --GmBowen
~~&Looks like there is no code yet - as far as I can deduce from the [[http://www.wikini.net/wakka.php?wiki=WikiToPdf wiki2pdf]] page the project is still in the conceptual stage? http://www.thierrybazzanella.com/ only redirects to another (Flash-only) site. --JavaWoman
~~&I've looked at the page but forgot to grab the code (I darkly remember the beeing of code on the page) --NilsLindenberg
Additions:
>>See also: WikkaFilters>>::c::
Deletions:
Additions:
~~-[[http://sourceforge.net/projects/pdf-php PDF-PHP]] --- Create pdf documents using PHP, but without installing any modules. Comprises a base class which performs all the pdf creation, and an extension class (ezPdf) to allow simple document creation.
Additions:
== Some references ==
~-**PHP**
~~-[[http://www.fpdf.org/ FPDF]] --- a PHP class, which allows to generate PDF files without using the PDFlib library.
~~-[[http://www.pc4p.net/ PC4P]] --- a PDF class for PHP.
~~-[[http://www.ros.co.nz/pdf/ R&OS pdf class]] --- a PHP class which will allow the easy production of simple pdf documents.
~-**Java**
~~-[[http://xml.apache.org/fop/ FOP (Formatting Objects Processor) ]] --- (GPL) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, SVG, XML (area tree representation), Print, AWT, MIF and TXT. The primary output target is PDF.
~~-[[http://www.xwiki.org/xwiki/bin/view/Dev/XWikiPDFExport XWiki PDF Export]] --- An implementation of FOP for [[http://www.xwiki.org/ XWiki]].
~-**PHP**
~~-[[http://www.fpdf.org/ FPDF]] --- a PHP class, which allows to generate PDF files without using the PDFlib library.
~~-[[http://www.pc4p.net/ PC4P]] --- a PDF class for PHP.
~~-[[http://www.ros.co.nz/pdf/ R&OS pdf class]] --- a PHP class which will allow the easy production of simple pdf documents.
~-**Java**
~~-[[http://xml.apache.org/fop/ FOP (Formatting Objects Processor) ]] --- (GPL) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, SVG, XML (area tree representation), Print, AWT, MIF and TXT. The primary output target is PDF.
~~-[[http://www.xwiki.org/xwiki/bin/view/Dev/XWikiPDFExport XWiki PDF Export]] --- An implementation of FOP for [[http://www.xwiki.org/ XWiki]].
Deletions:
~-[[http://www.fpdf.org/ FPDF]] --- a PHP class, which allows to generate PDF files without using the PDFlib library.
~-[[http://xml.apache.org/fop/ FOP (Formatting Objects Processor) ]] --- (GPL) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, SVG, XML (area tree representation), Print, AWT, MIF and TXT. The primary output target is PDF.
~-[[http://www.xwiki.org/xwiki/bin/view/Dev/XWikiPDFExport XWiki PDF Export]] --- An implementation of FOP for [[http://www.xwiki.org/ XWiki]].
~-
Additions:
===== Exporting Wiki content to PDF =====
<<See also: WikkaFilters<<::c::
I'm opening this page for a prelilminary discussion on how to generate PDFs from Wiki content.
An appropriate implementation of this feature would probably be a ##/pdf## handler allowing a user to generate a PDF from a given page.
(More generally, an ##/export## handler could give the user the choice about the preferred [[WikkaFilters export format]]). There are several GPL-licensed Java and php solution for generating PDFs on the fly.
== Some useful references ==
~-[[http://www.fpdf.org/ FPDF]] --- a PHP class, which allows to generate PDF files without using the PDFlib library.
~-[[http://xml.apache.org/fop/ FOP (Formatting Objects Processor) ]] --- (GPL) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, SVG, XML (area tree representation), Print, AWT, MIF and TXT. The primary output target is PDF.
~-[[http://www.xwiki.org/xwiki/bin/view/Dev/XWikiPDFExport XWiki PDF Export]] --- An implementation of FOP for [[http://www.xwiki.org/ XWiki]].
~-
== Discussion ==
CategoryDevelopment
<<See also: WikkaFilters<<::c::
I'm opening this page for a prelilminary discussion on how to generate PDFs from Wiki content.
An appropriate implementation of this feature would probably be a ##/pdf## handler allowing a user to generate a PDF from a given page.
(More generally, an ##/export## handler could give the user the choice about the preferred [[WikkaFilters export format]]). There are several GPL-licensed Java and php solution for generating PDFs on the fly.
== Some useful references ==
~-[[http://www.fpdf.org/ FPDF]] --- a PHP class, which allows to generate PDF files without using the PDFlib library.
~-[[http://xml.apache.org/fop/ FOP (Formatting Objects Processor) ]] --- (GPL) is the world's first print formatter driven by XSL formatting objects (XSL-FO) and the world's first output independent formatter. It is a Java application that reads a formatting object (FO) tree and renders the resulting pages to a specified output. Output formats currently supported include PDF, PCL, PS, SVG, XML (area tree representation), Print, AWT, MIF and TXT. The primary output target is PDF.
~-[[http://www.xwiki.org/xwiki/bin/view/Dev/XWikiPDFExport XWiki PDF Export]] --- An implementation of FOP for [[http://www.xwiki.org/ XWiki]].
~-
== Discussion ==
CategoryDevelopment
Deletions:
As you've probably guessed my name is James and I'm from Edinburgh in Scotland.
I am interested in Wikka following on from my brief experience with Wakka, which now appears to be defunct.
Wakka like Wikka was being developed to include similar features to those that are being discussed and developed on this site. One developer was TomG who had managed to develop the code to include user groups, e-mail, registration and administration functions.
One of Tom's sites can be seen at [[http://www.soul-dynamics.com/HomePage Soul Dynamics]]
CategoryUsers