2016-01-25 36 views
6

Ive installato il plugin "CakePDF" seguente documentazione: https://github.com/FriendsOfCake/CakePdfCakePHP 3.x, TCPDF, htmlspecialchars

Ora voglio costruire il primo PDF e Ive ha ottenuto il seguente errore:

enter image description here

Questa è la mia configurazione nel bootstrap.php:

Configure::write('CakePdf', [ 
    'engine' => 'CakePdf.Tcpdf', 
    'margin' => [ 
     'bottom' => 15, 
     'left' => 50, 
     'right' => 30, 
     'top' => 45 
    ], 
    'download' => true, 
    'encoding' => 'UTF-8' 
]); 

l'unico codice di Ive scritto è la seguente nel templat e:

$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); 

Questo è il codice dalla linea 68 in functions.php:

function h($text, $double = true, $charset = null) 
    { 
     if (is_string($text)) { 
      //optimize for strings 
     } elseif (is_array($text)) { 
      $texts = []; 
      foreach ($text as $k => $t) { 
       $texts[$k] = h($t, $double, $charset); 
      } 
      return $texts; 
     } elseif (is_object($text)) { 
      if (method_exists($text, '__toString')) { 
       $text = (string)$text; 
      } else { 
       $text = '(object)' . get_class($text); 
      } 
     } elseif (is_bool($text)) { 
      return $text; 
     } 

     static $defaultCharset = false; 
     if ($defaultCharset === false) { 
      $defaultCharset = mb_internal_encoding(); 
      if ($defaultCharset === null) { 
       $defaultCharset = 'UTF-8'; 
      } 
     } 
     if (is_string($double)) { 
      $charset = $double; 
     } 
     return htmlspecialchars($text, ENT_QUOTES | ENT_SUBSTITUTE, ($charset) ? $charset : $defaultCharset, $double); 
    } 

sto assolutamente confuso e riesco a trovare alcuna soluzione. Qualcuno ha un'idea?

+0

In base al messaggio di errore, si utilizza la codifica ASCII per la propria app ('App.encoding'). È questo il caso? E se è così, perché lo stai facendo? Se questo non è il caso, controlla se 'mb_internal_encoding()' è correttamente invocato nel bootstrap delle tue app e se può essere cancellato in un altro punto della tua app. – ndm

+0

Sì, ovviamente sto usando ASCII. Ma perché? Ho aggiunto il codice di function.php nel mio post. – Leyla

+0

Su una nota correlata, perché stai creando un'istanza TCPDF manualmente nel tuo modello di visualizzazione? CakePDF lo fa automaticamente. – ndm

risposta

0

Come hai immaginato, il problema è/era che la classe TCPDF ha pasticciato con mb_internal_encoding(), che viene utilizzata nella funzione CakePHP h() per determinare la codifica predefinita dell'app, nel caso in cui non venga passato un argomento esplicito come argomento.

Non sono un esperto di TCPDF, non l'ho usato da secoli, ma da una rapida occhiata alla fonte attuale, sto avendo un momento difficile per capire perché si trucchi con la codifica interna del tutto, dal momento che il solo la funzione mb_* utilizzata dalla libreria è mb_convert_encoding(), in cui vengono passati entrambi gli argomenti di codifica, quindi la codifica interna non viene utilizzata affatto. Detto questo, lo segnalerei come un bug/problema agli sviluppatori di TCPDF.

Ad ogni modo, si sta verificando questo problema solo perché si utilizza CakePDF nel modo sbagliato. Non è necessario creare manualmente istanze del motore PDF, questo è ciò che CakePDF fa automaticamente per te, che è praticamente l'intero punto del plug-in, astrae la creazione del PDF in modo tale che è sufficiente creare l'HTML corretto nei modelli di visualizzazione. In tal modo si eviteranno anche i problemi di codifica con TCPDF che si verificano attualmente, poiché il modello di visualizzazione viene reso prima dello l'istanza del motore PDF viene creata.

tl; dr

Per farla breve, costruire solo il codice HTML nel vostro modello di vista, e se effettivamente bisogno di avere accesso ad un'istanza del motore PDF perché c'è qualcosa che devi fare che può essere raggiunto solo che modo, quindi CakePDF non è il plug-in che stai cercando.

+0

Lo riferirò, grazie per questo consiglio. È facile come sembra? Devo solo creare l'HTML che voglio nel modello e CakePDF fa il resto per me? Quello è strano. – Leyla

+0

A proposito: la rimozione delle if-condizioni nei metodi di costruzione e decostruzione in tcpdf.php risolve il problema con 'ASCII'. – Leyla

+0

@Leyla Sì, è esattamente come funziona CakePDF, si configura il motore e si costruisce l'HTML, e CakePDF fa il resto. – ndm

0

Penso, ho trovato il colpevole. Il metodo di costruzione di TCPDF imposta mb_internal_encoding su ASCII. (Linea tcpdf.php 1838)

ho trovato un suggerimento nei commenti: Please note that this method sets the mb_internal_encoding to ASCII, so if you are using the mbstring module functions with TCPDF you need to correctly set/unset the mb_internal_encoding when needed.

Ma ora ho bisogno di un consiglio come utilizzare TCPDF e mb_internal_encoding correttamente (senza problemi con torta o TCPDF).

Scusa per aver chiesto, sono un principiante assoluto. ;)

7

Dopo aver tentato di trovare ed eseguire il debug lo stesso errore per più di un'ora, ho appena reimpostare il valore su UTF-8 dopo l'utilizzo di TCPDF - e tutto funziona come prima:

$pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false); 

///...create, save, display your pdf 

// Reset the encoding forced from tcpdf 
mb_internal_encoding('UTF-8'); 

Ho anche provato il ripristino direttamente dopo la chiamata di new TCPDF e tutto andava bene, anche. Non so cosa potrebbe andare storto con questo reset :) I miei PDF sembrano ancora gli stessi dopo questo, ma le e-mail vengono inviate di nuovo.

+0

sì, questo ha funzionato anche a me – Ayman

+0

Buono! (Attenzione, a volte veniamo lanciati da un'eccezione nella classe, quindi ho dovuto provare a catturare prima di resettare la codifica) –