PDF UNICODE: UFPDF + FPDF + HTML2FPDF (Solo per veri esperti di PHP)

Salve a tutti,

ho notato che moltissima gente su internet trova difficoltà con i pdf. Ci sono delle classi come fpdf che permettono di creare PDF veramente sofisticati. Ultimamente sto sviluppando un modulo che deve essere tradotto in diverse lingue e come al solito mi sono trovato con il problema UNICODE & UTF-8.

Creo già il file pdf con il supporto dell'html ma non so come si crea un pdf in GRECO oppure in SLOVENO o altre lingue. Qualcuno mi sa aiutare?

Grazie un finimondo  :bye:

Ulisse

inviato 10 anni fa
ulisse
X 0 X

Hai già visto qui?

http://www.acko.net/node/56

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ciao Gianni, si ho già visto ma non hanno trovato una risposta alla possibilità di legare le varie classi insieme. Mi sai dare una mano?!

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Non l'ho mai usato ma da quello che ho capito dovresti sostituire i file di FPDF con quelli di UFPDF, tutto quì. UFPDF non è altro che FPDF con il supporto nativo all'UTF-8.

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho provato ma niente da fare!

Io ho una tabella in html e dei dati utf-8 e non so come fare.   :idiot:

Scusami lo stress.

 :bye:

risposto 10 anni fa
ulisse
X 0 X

quindi gli script che usavi per creare i PDF non funzionano se sostituisci FPDF con UFPDF?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Si proprio così. Inoltre non so come legare la classe HTML2FPDF.  :idiot:

 :bye:

risposto 10 anni fa
ulisse
X 0 X
Inoltre non so come legare la classe HTML2FPDF

In che senso?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

io vorrei creare semplicemente la solita tabella html con i dati presi dal db in utf-8.  :idiot:

grazie

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Ma hai già provato ad usare HTML2FPDF?

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho usato HTML2PDF correttamente e mi crea il pdf ma appena uso una lingua diversa dall'italiano non mi appare niente.

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Niente da fare ci sto provando come non mai! Ma non ci riesco!

Come cavolo devo fare per creare un pdf con una semplice tabella in utf-8 ??  :tichedoff:

 :bye:

risposto 10 anni fa
ulisse
X 0 X

fossi in te lascerei perdere HTML2FPDF e farei tutto direttamente con FPDF, usando inizialmente un set di caratteri "standard". Ottenuto il risultato in queste condizioni proverei a sostituire FPDF con UFPDF ed ad impiegare l'UTF8

 :bye:

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Purtroppo non posso realizzare un modulo molto complesso con solo fpdf.  :'(

 :bye:

risposto 10 anni fa
ulisse
X 0 X

non è proprio così, vedessi cosa ho dovuto fare per un lavoro...

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ho tutto già pronto in html2PDF ho sudato freddo per diverse notti per un progetto a cui collaboro. Ma è possibile che non funzioni questo connubio fra UFPDF + FPDF + HTML2FPDF!?  :knuppel:

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Il problema purtroppo è sempre lo stesso: le funzioni per la gestione delle stringhe in PHP non supportano l'UTF8. E' necessario utilizzare delle funzioni "alternative" presenti in alcune estensioni.

Se una classe (FPDF o HTML2FPDF) fanno uso di funzioni "standard" allora non funzioneranno con l'UTF8  :dunno:

Dobbiamo aspettare PHP 6  :'(

risposto 10 anni fa
Gianni Tomasicchio
X 0 X

Ok non ci sono soluzioni.

Ti ho inviato un messaggio privato.

 :bye:

risposto 10 anni fa
ulisse
X 0 X

Ciao,

La ufpdf non sono riuscito a farla funzionare, le altre classi mi hanno dato quasi tutte problemi, con i caratteri.

Per la fpdf io ho risolto e mi funziona sul server che ha come charset utf-8.

Come ho risolto :

Fpdf + writehtml ( la trovi sul sito fpdf inviata da utenti)

Nel file fpdf.php nella funzione cell ad un certo punto viene verificato se esiste il contenuto della variabile $txt con un

if($txt!=='')

Subito dopo ho inserito queste righe

$txt = htmlentities($txt, ENT_COMPAT, 'UTF-8');
$txt = str_replace('€', chr(128), $txt);
$txt=html_entity_decode($txt);

Ho fatto varie prove e così funziona non mi da problemi io uso come font l'Arial

Ti segnalo inoltre la classe dompdf che funziona decisamente bene, la trovo meno elastica della fpdf.

 :bye:

risposto 10 anni fa
Lokki
modificato 10 anni fa
X 0 X

Grazie Lokki ci provo e ti faccio sapere.  :bye:

risposto 10 anni fa
ulisse
X 0 X

Ciao Loki,

mi sto apprestando a modificare la classe ma mi sorge una domanda che riguarda i fonts. Come imposto il font Arial così?

            $pdf = new UFPDF();
            $pdf->Open();
            $pdf->SetTitle("UFPDF is Cool.\nŨÆƤÄ?Æ Ä±Å¡ ÄÅ?Å?Ĺ");
            $pdf->SetAuthor('Steven Wittens');
            $pdf->AddFont('arial', '', 'arial.php');
            $pdf->AddPage();
            $pdf->SetFont('vera', '', 32);
            $pdf->Write(12, "UFPDF is Cool.\n");
            $pdf->Write(12, "ŨÆƤÄ?Æ");
            $pdf->Write(12, "ıš ÄÅ?Å?Ĺ.\n");
            $pdf->Close();
            $pdf->Output('unicode.pdf', 'F');

Grazie

Ulisse

risposto 10 anni fa
ulisse
X 0 X

No io ho usato la fpdf standard non la ufpdf, quindi settato i font arial di default non serve che gli ridefinisci.

Per la conversione dell'HTML ho usato la classe writehtml, e poi applicato le mofiiche che ho postato l'altra volta.

Con questa modifica intercetti la stringa prima della generazione del pdf e diciamo che la rendi "indipendente dal charset" convertendola negli htmlenttities.

Alla fine spiegarlo è molto più complicato che realizzarlo :-)

Se hai problemi scrivi pure e al limite ti posto i miei script.

Ciao  :bye:

risposto 10 anni fa
Lokki
X 0 X

Ciao Lokki,

quello che desidero realizzare è una semplice tabella con 2 colonne. i dati provengono da un database utf_general_ci in UTF8.

So che è troppo ma un aiutino?  :'(

                 
                         Pagella |                 
                                 |                 
                   Dati Studente |                 
                  Nome & Cognome | Alessio Del Duca 
                           Città | Roma
                           Stato | Italia           
                        Telefono | 06892424         
             Pagella dell'ultimo |           
                    quadrimestre |                 
                                 |                 
                        Italiano | 6,5                
                          Storia | 5,8                
                      Matematica | 7,4                
                                 |                 
                 Giudizio Finale |                 
                                 | Testo testo testo testo testo  
                                 | Testo testo testo testo testo  
                                 | Testo testo testo testo testo  
                                 | Testo testo testo testo testo  
                                 | Testo testo testo testo testo  
                                 | Testo testo testo testo testo  
                                 | Testo testo testo testo testo  
                                 | Testo testo testo testo testo 

 :bye:

risposto 10 anni fa
ulisse
X 0 X
<?php
require(fpdf.php);
class PDF extends FPDF
{
   var $B=0;
   var $I=0;
   var $U=0;
   var $HREF='';
   var $ALIGN='';
   function WriteHTML($html)
   {
      //HTML 
      //$html=str_replace('<br />','#br#',$html);
      $html=str_replace('<span style="font-weight: bold;">','<b>',$html);
      $html=str_replace('<span style="font-style: italic;">','<i>',$html);
      $html=str_replace('<div style="text-align: justify;">','',$html);
      $html=str_replace('</span>','</b></i>',$html);
      $html=str_replace("&nbsp;",' ',$html);
      $html=str_replace("\n",' ',$html);
      /*
      $html=strip_tags($html);
      $html=str_replace("#br#",'<br />',$html);
      $html=str_replace("#b#",'<b>',$html);
      $html=str_replace("#i#",'<i>',$html);
      $html=str_replace("#/span#",'</b></i>',$html);
      */
      $a=preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
      foreach($a as $i=>$e)
      {
         if($i%2==0)
         {
            //Text
            if($this->HREF)
            $this->PutLink($this->HREF,$e);
            elseif($this->ALIGN == 'center')
            $this->Cell(0,5,$e,0,1,'C');
            else
            $this->Write(5,$e);
         }
         else
         {
            //Tag
            if($e{0}=='/')
            $this->CloseTag(strtoupper(substr($e,1)));
            else
            {
               //Extract properties
               $a2=split(' ',$e);
               $tag=strtoupper(array_shift($a2));
               $prop=array();
               foreach($a2 as $v)
               if(ereg('^([^=]*)=["\']?([^"\']*)["\']?$',$v,$a3))
               $prop[strtoupper($a3[1])]=$a3[2];
               $this->OpenTag($tag,$prop);
            }
         }
      }
   }
   function OpenTag($tag,$prop)
   {
      //Opening tag
      if($tag=='B' or $tag=='I' or $tag=='U')
      $this->SetStyle($tag,true);
      if($tag=='A')
      $this->HREF=$prop['HREF'];
      if($tag=='BR')
      $this->Ln(5);
      if($tag=='P')
      $this->ALIGN=$prop['ALIGN'];
      if($tag=='HR')
      {
         if( $prop['WIDTH'] != '' )
         $Width = $prop['WIDTH'];
         else
         $Width = $this->w - $this->lMargin-$this->rMargin;
         $this->Ln(2);
         $x = $this->GetX();
         $y = $this->GetY();
         $this->SetLineWidth(0.4);
         $this->Line($x,$y,$x+$Width,$y);
         $this->SetLineWidth(0.2);
         $this->Ln(2);
      }
   }
   function CloseTag($tag)
   {
      //Closing tag
      if($tag=='B' or $tag=='I' or $tag=='U')
      $this->SetStyle($tag,false);
      if($tag=='A')
      $this->HREF='';
      if($tag=='P')
      $this->ALIGN='';
   }
   function SetStyle($tag,$enable)
   {
      //Modify style and select corresponding font
      $this->$tag+=($enable ? 1 : -1);
      $style='';
      foreach(array('B','I','U') as $s)
      if($this->$s>0)
      $style.=$s;
      $this->SetFont('',$style);
   }
}
$text='qui metti l\'HTML che vuoi convertire in pdf nel tuo caso la tabella con le sue colonne';
$pdf = new PDF();
$pdf->AliasNbPages();
$pdf->AddPage();
$pdf->Ln(2);
$pdf->SetFont('Arial', '', 8);
$pdf->WriteHTML($text);
$pdf->Output();
?>

Questo è una parte dello script che uso ho tolto le funzione header e footer ma le puoi tranquillamente reintegrare.

Applica questo script più le modifiche all' fpdf.php e vedrai che ci riesci.

Ciao

risposto 10 anni fa
Lokki
X 0 X

Ciao Lokki,

beh possiamo dire che ci abbiamo provato ... ma senza successo.  :'(

Non riesco a venirne a capo.

Questa soluzione non funziona con GRECO e cirillici vari.

$txt = htmlentities($txt, ENT_COMPAT, 'UTF-8');
        $txt = str_replace('&euro;', chr(128), $txt);
        $txt=html_entity_decode($txt);

Help  :'(

risposto 10 anni fa
ulisse
X 0 X

Ho provato con italiano e tedesco ....

Mi spiace, ma non saprei proprio come aiutarti.

risposto 10 anni fa
Lokki
X 0 X

Ciao Lokki, grazie comunque... spero che nel post appena realizzato: Progetto: ... possiamo trovare una risposta.  :bye:

risposto 10 anni fa
ulisse
X 0 X

Ragazzi ho il vostro stesso problema con fpdf...non supporta UTF-8. Volgio usare ufpdf,ma non riesco. Ho letto il file README ma non riesco cmq...dice di fare delle conversioni per i font....Qualcuno potrebbe spiegarmi come fare?

risposto 10 anni fa
tidus8
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda