Generare PDF da righe HTML - FPDF

Emix

Utente Attivo
15 Feb 2010
596
0
16
Salve a tutti,
ho letto sul manuale come fare per leggere delle righe html e riportarle nel pdf...
Ho un problema...
A me le righe html di provenienza sono indefinite... nel senso che ho degli array... inoltre ogni riga è costituita da 4 colonne..

Come faccio per far si che legga un array e stampi a video le righe di provenienza? Inoltre... è possibile fare in modo che ogni pagina nuova (quindi se il foglio è pieno e genera la seconda pagina) includa un header e un footer che gli do io ???

Allego l'esempio del manuale :

PHP:
<?php
require('fpdf.php');
//function hex2dec
//returns an associative array (keys: R,G,B) from
//a hex html code (e.g. #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 -> millimeter at 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);
}
////////////////////////////////////

class PDF_HTML extends FPDF
{
//variables of html parser
var $B;
var $I;
var $U;
var $HREF;
var $fontList;
var $issetfont;
var $issetcolor;

function PDF_HTML($orientation='P', $unit='mm', $format='A4')
{
    //Call parent constructor
    $this->FPDF($orientation,$unit,$format);
    //Initialization
    $this->B=0;
    $this->I=0;
    $this->U=0;
    $this->HREF='';
    $this->fontlist=array('arial', 'times', 'courier', 'helvetica', 'symbol');
    $this->issetfont=false;
    $this->issetcolor=false;
}

function WriteHTML($html)
{
    //HTML parser
    $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)
        {
            //Text
            if($this->HREF)
                $this->PutLink($this->HREF,$e);
            else
                $this->Write(5,stripslashes(txtentities($e)));
        }
        else
        {
            //Tag
            if($e[0]=='/')
                $this->CloseTag(strtoupper(substr($e,1)));
            else
            {
                //Extract attributes
                $a2=explode(' ',$e);
                $tag=strtoupper(array_shift($a2));
                $attr=array();
                foreach($a2 as $v)
                {
                    if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
                        $attr[strtoupper($a3[1])]=$a3[2];
                }
                $this->OpenTag($tag,$attr);
            }
        }
    }
}

function OpenTag($tag, $attr)
{
    //Opening tag
    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']) && (isset($attr['WIDTH']) || 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']) && $attr['COLOR']!='') {
                $coul=hex2dec($attr['COLOR']);
                $this->SetTextColor($coul['R'],$coul['V'],$coul['B']);
                $this->issetcolor=true;
            }
            if (isset($attr['FACE']) && in_array(strtolower($attr['FACE']), $this->fontlist)) {
                $this->SetFont(strtolower($attr['FACE']));
                $this->issetfont=true;
            }
            break;
    }
}

function CloseTag($tag)
{
    //Closing tag
    if($tag=='STRONG')
        $tag='B';
    if($tag=='EM')
        $tag='I';
    if($tag=='B' || $tag=='I' || $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)
{
    //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);
}

}//end of class
?>

PHP:
<?php
require('source.php');

if(isset($_POST['text']))
{
    $pdf=new PDF_HTML();
    $pdf->SetFont('Arial','',12);
    $pdf->AddPage();
    $text=$_POST['text'];
    if(ini_get('magic_quotes_gpc')=='1')
        $text=stripslashes($text);
    $pdf->WriteHTML($text);
    $pdf->Output();
    exit;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>HTML2PDF</title>
<style type="text/css">
input, textarea {
    font-family: lucida console;
    font-size: 9pt;
    border: 1px solid #B0B0B0;
}
body {
    font-family: lucida console;
    font-size: 9pt;
    background-color: #F0F0F0;
}
</style>
</head>
<body>
<h1>HTML2PDF</h1>
<div style="border: 1px solid black">
Supported tags are the following:
<ul type="square">
<li>&lt;br&gt; and &lt;p&gt;</li>
<li>&lt;b&gt;, &lt;i&gt; and &lt;u&gt;</li>
<li>&lt;img&gt; (src and width (or height) are mandatory)</li>
<li>&lt;a&gt; (href is mandatory)</li>
<li>&lt;font&gt;: possible attributes are
<ul>
<li>color: hex color code</li>
<li>face: available fonts are: arial, times, courier, helvetica, symbol</li>
</ul>
</li>
</ul>
To display these tags without interpreting them, use &amp;lt; and &amp;gt;
</div><br>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" target="_blank">
Content:<br>
<textarea name="text" cols="80" rows="15"></textarea><br><br>
<input type="submit" value="Generate PDF">
</form>
</body>
</html>
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Ti consiglio vivamente la libreria dompdf che puoi trovare QUI, e QUI ci sono dei pratici e facili esempi di utilizzo
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
ho dato uno sguard a ciò che mi hai linkato... Io detta in tutta sincerità ho necessità che l'input del documento pdf sia un array...
mi spiego...

Io ho N campi in input cosi composti:

Codice_______________________Barcode__________________Prezzo

Dove ognuno di questi viene rimpieto X volte... quindi potrei avere :


001________123_______10€
002________456_______11€
003________789_______12€

Chiaramente i campi si chiamano : codice[],Barcode[],Prezzo[].

Non ho visto nulla al riguardo... è fattibile?

PPS Header e Footer sarebbero addirittura statici... o cmq li recupero tramite mysql...
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
Basta che stampi tutto l'array contenente l'html desiderato, esempio
PHP:
$dompdf->load_html(implode($html_array));

Oppure se sono molteplici li gestisci e alla fine passi una stringa finale elaborata come vuoi te
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
in teoria sono 4 gli array.. uno per ogni colonna... li gestisco ok... ma come li passo a dom? hai qualcosa per parlare in tempo reale? ts\msn\skype etc?
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
in teoria sono 4 gli array.. uno per ogni colonna... li gestisco ok... ma come li passo a dom? hai qualcosa per parlare in tempo reale? ts\msn\skype etc?
In che senso come li passi a dom? Una volta generata l'istanza della classe passi al load_html() la stringa finale elaborata, fai il render e decidi se scaricare il file tramite il metodo stream oppure salvarti da qualche parte il pdf prendendo il risultato del metodo output()

ps:no, non mi piacciono i chat/voip client
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
sarò deficente io... ma non capisco... riesci a farmi un esempio? magari prendendone uno gia fatto...
 

Emix

Utente Attivo
15 Feb 2010
596
0
16
stavo provando ad usare fpdf con uno script abbastanza semplice ma non capisco perche non visualizzo nulla... posto la pagina...

PHP:
<?php
define('FPDF_FONTPATH','../fpdf/font/');
require('../fpdf/fpdf.php');
$pdf=new FPDF('P','mm','A4');
$pdf->AddPage();
$pdf->SetFont('Arial','B',16);
$barcode=$_POST[barcodeart];
$descrizione=$_POST[descrizione];
$quantita=$_POST[quantita];
$prezzo=$_POST[prezzo];
for($i=0;$i<COUNT($barcode);$i++)
{
$pdf->Cell(60,40,$i.')'.$barcode[$i],0,1);
$pdf->Cell(70,40,$i.')'.$descrizione[$i],0,1);
$pdf->Cell(80,40,$i.')'.$quantita[$i],0,1);
$pdf->Cell(90,40,$i.')'.$prezzo[$i],0,1);
    }    
$pdf->Output();
?>
 

Nefyt

Utente Attivo
17 Apr 2012
1.102
0
0
PHP:
//etc....
//crei una nuova istanza
$dompdf = new DOMPDF();
//gli passi la stringa con gli array elaborati del html da convertire su pdf
$dompdf->load_html($array_elaborati);
//renderizzi
$dompdf->render();
//lo salvi, se non vuoi fare il download tramite stream()
file_put_contents('mio_pdf.pdf',$dompdf->output());
Mi pare semplice da capire l'esempio no?
 
Ultima modifica:

Emix

Utente Attivo
15 Feb 2010
596
0
16
Sto provando ad utilizzare FPDF.. Mi sembra più facile e più completo... Riesco a visualizzare in output la costruzione della tabella ma non vedo i dati all'interno... posto le due pagine che ho creato...

Pagina provapdf.php:
Si occupa di prendere i valori della pagina precedente e creare l'output.

PHP:
<?php
define('FPDF_FONTPATH','../fpdf/font/');
//require('../fpdf/fpdf.php');
include('pdf.php');
@ $array_barcode=$_POST['barcodeart_vecchi'];
@ $array_descrizione=$_POST['descrizione'];
@ $array_quantita=$_POST['quantita'];
@ $array_prezzo=$_POST['prezzo'];
for ($i = 0; $i <= sizeof($array_barcode); $i++) {
$data[] = array($array_barcode[$i], $array_descrizione[$i],$array_quantita[$i],$array_prezzo[$i] );
    }    
$h1_heading = "DdT n° 1";
$pdf=new PDF('P','mm','A4');
    $pdf->AliasNbPages();
    $pdf->SetFont('Times','B',12);

    $w = $pdf->GetStringWidth($h1_heading)+40;
    $pdf->AddPage();
    $pdf->Cell($w,-12,$h1_heading, 0,1,'C');
    $pdf->Ln(25);
    //Column titles
    $header=array('Barcode','Descrizione','Quantita','Prezzo');
   $pdf->SetFont('Arial','B',16);
    //Header
    // make an array for the column widths
	$w=array(25,30,25);
    // call the table creation method
    $pdf->BuildTable($header,$data,$w);
    $pdf->Output();
?>

Questa invece è la classe che ho creato per la creazione della tabella e dell'header etc..
PHP:
<?php 

require('../fpdf/fpdf.php');

class PDF extends FPDF { 

    function Header() {     
        $timestamp = time();            
        $this->SetX(110);
        $this->Cell(90,10,date("Y/m/d h:i:s A ",$timestamp), 0,0,'C');
        $this->Ln(30);
    }

    function Footer()       {
        $this->SetY(-15);
        $this->SetFont('Arial','I',8);
        $this->Cell(0,10,'Page '
        .$this->PageNo().'/{nb}',0,0,'C');
    }       

    function BuildTable($header,$data,$w) {
        $this->SetFillColor(255,153,51);
        $this->SetTextColor(165,42,42);
        $this->SetDrawColor(244,81,61);
        $this->SetLineWidth(.1);
        $this->SetFont('','B',8);

        for($i=0;$i<count($header);$i++) 
            $this->Cell($w[$i],7,$header[$i],1,0,'C',1);

        $this->Ln();

        $this->SetFillColor(255,204,102);
        $this->SetTextColor(0,0,100);
        $this->SetFont('');
        $fill=true; 

        foreach($data as $row) {
            $fill =! $fill;
            if($fill==0){
                for($i = 0; $i<count($header); $i++ ){
                    // restore normal color settings
                    $this->SetFillColor(255,255,153);
                    $this->SetTextColor(244,81,61);
                    $this->SetFont('');
                    $this->Cell($w[$i],6,$row[$i],1,0,'C',true);
                }
                $this->Ln();
            } else {
                for($i = 0; $i<count($header); $i++ ){
                    // restore normal color settings
                    $this->SetFillColor(255,204,102);
                    $this->SetTextColor(244,81,61);
                    $this->SetFont('');
                    $this->Cell($w[$i],6,$row[$i],1,0,'C',true);
                }
                $this->Ln();
            }
        }
        $this->Cell(array_sum($w),0,'','T');
    }
}
?>

il risulatato che vedo in output è il seguente :

Immagine.png

Dove caspita sbaglio?
 
Discussioni simili
Autore Titolo Forum Risposte Data
cris8380 [PHP] Generare file pdf con inserimento dati PHP 34
G PHP e Microsoft Teams: generare link videocall PHP 15
Tommy03 Generare file PHP dopo registrazione PHP 2
A [PHP] Generare nomi dei file con lettere minuscole e vocali senza accenti PHP 2
webmachine [PRESTASHOP] Come generare secure_key CMS (Content Management System) 1
V (Vendo) Metodo generare Like facebook Annunci servizi di Social Media Marketing 4
Joker37 Generare file txt con php estraendo codice html. PHP 4
cris8380 Generare immagine barcode PHP 1
V Generare array da ciclo while e prendere valori casuali PHP 4
T campo data+ora: estrarre l'ora senza generare una stringa MS Access 2
Devil-94 Generare una lista di link Javascript 1
neo996sps [PHP e funzioni con PDO] Funzione per generare corpo tabella PHP 1
D generare "tessera iscrizione" PHP 5
P Generare hash sha1 Classic ASP 2
S Generare pagina dopo il caricamento di un dato PHP 6
C Generare una tabella e trasformarla in una immagine PHP 2
M Aiuto per una libreria per generare grafici PHP 1
A Ciclo per generare etichette PHP 0
G Generare XML in base ai valori get XML 0
A [RISOLTO]Come generare query dinamica PHP-MYSQL PHP 2
M Classe in php 4 per generare file in Excel PHP 4
K creare uno script in php , per generare in modo automatico query PHP 2
ypsilon86 Generare il nome del tag ID e NAME in modo sequenziale PHP 17
D Generare numeri interi casuali compresi in [1;k] Java 0
L Generare pagine PHP 8
Z generare pagina da template con php PHP 2
A Generare un punto "nelle vicinanze " di un altro. PHP 0
L generare classifiche top 10 PHP 1
U Generare bolle di trasporto con php PHP 3
E Generare automaticamente links... PHP 5
P Generare pagine successive dopo una ricerca Classic ASP 5
C generare thumbnail PHP 4
$ Generare script per funzione tempo Javascript 0
metalgemini generare codice numerico Classic ASP 4
D Programma per generare i calendari Windows e Software 2
I cartella sottocartella apri o scarica file pdf PHP 1
G Come modificare un pdf in php PHP 1
FDF182 Inserire pdf in db PHP 3
E Scrivere una data corrente in un pdf PHP 1
X unire più file in un pdf Windows e Software 2
8 Javascript - PDF Form Javascript 0
B javascript per problemi con pdf e Safari Javascript 0
B Crea pdf da tabella mysql "ultima riga modificata" MySQL 4
zorro file PDF non visualizzo niente PHP 9
I eliminazione file pdf PHP 0
M Visualizzare file PDF con link preso dal DB PHP 0
D File pdf che non si aprono .... PHP 1
S Modificare intestazione documento pdf con LO Draw Linux e Software 0
B Google Analytics - track visualizzazioni pdf Google Analytics 0
P Librerie pdf dompdf o tcpdf. PHP 8

Discussioni simili