2016-01-25 33 views
6

Ive zainstalowane wtyczki "CakePDF" następującą dokumentacją: https://github.com/FriendsOfCake/CakePdfCakePHP 3.x, TCPDF, htmlspecialchars

teraz chcę zbudować pierwszy PDF i Ive got następujący błąd:

enter image description here

to jest moja konfiguracja w bootstrap.php:

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

Kod tylko Ive napisane jest po jednym w tEmPLat e:

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

Jest to kod od linii 68 w 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); 
    } 

jestem absolutnie mylić i can not znaleźć żadnego rozwiązania. Czy ktoś ma pomysł?

+0

Zgodnie z komunikatem o błędzie, używasz kodowania "ASCII" dla aplikacji ("App.encoding"). Czy tak jest? A jeśli tak, dlaczego to robisz? Jeśli tak nie jest, to sprawdź, czy 'mb_internal_encoding()' jest prawidłowo wywoływany w twoim bootstrapie aplikacji i czy może zostać przesłonięty w innym miejscu w twojej aplikacji. – ndm

+0

Tak, oczywiście używam ASCII. Ale dlaczego? Dodałem kod funkcji.php do mojego postu. – Leyla

+0

W powiązanej notatce, dlaczego tworzysz instancję TCPDF ręcznie w szablonie widoku? CakePDF robi to automatycznie. – ndm

Odpowiedz

0

Jak już zorientowali, problem jest/było to, że mes klasy TCPDF z mb_internal_encoding(), który jest używany w CakePHPs h() funkcję określić kodowanie domyślne aplikacje, w przypadku braku wyraźnego jeden jest przekazywany jako argument.

Nie jestem ekspertem od TCPDF, nie używałem go od wieków, ale od szybkiego przyjrzenia się bieżącemu źródłu, ciężko mi zrozumieć, dlaczego w ogóle się to koliduje z wewnętrznym kodowaniem, ponieważ tylko funkcja mb_*, której używa biblioteka, to mb_convert_encoding(), gdzie oba argumenty kodowania są przekazywane, więc wewnętrzne kodowanie w ogóle nie jest używane. Powiedziawszy to, zgłosiłbym to jako błąd/problem do programistów TCPDF.

W każdym razie ten problem występuje tylko dlatego, że używasz CakePDF w niewłaściwy sposób. Nie ma potrzeby ręcznego tworzenia instancji silnika PDF, to właśnie CakePDF automatycznie robi dla ciebie, co jest prawie całym sednem wtyczki, streszcza tworzenie PDF, więc potrzebujesz tylko zbudować odpowiedni HTML w szablonach widoku. W ten sposób unikniesz również problemów z kodowaniem w TCPDF, którego obecnie doświadczasz, ponieważ szablon widoku jest renderowany przed tworzeniem instancji mechanizmu PDF.

tl; dr

Krótko mówiąc, budować tylko HTML w widoku szablonu, a jeśli rzeczywiście trzeba mieć dostęp do instancji silnika PDF, ponieważ istnieje coś trzeba zrobić, że można osiągnąć tylko, że sposób, a następnie CakePDF nie jest wtyczką, której szukasz.

+0

Poinformuję o tym, dziękuję za poradę. Czy to tak proste, jak się wydaje? Muszę tylko stworzyć HTML, który chcę w szablonie, a CakePDF zrobi dla mnie resztę? To jest dziwne. – Leyla

+0

Nawiasem mówiąc: Usunięcie warunków if w metodach konstruktora i dekonstruktora w tcpdf.php rozwiązuje problem za pomocą 'ASCII'. – Leyla

+0

@Leyla Tak, właśnie tak działa CakePDF, konfigurujesz silnik i budujesz kod HTML, a CakePDF zajmuje się resztą. – ndm

0

Myślę, że znalazłem winnego. Metoda konstruktora TCPDF ustawia mb_internal_encoding na ASCII. (Linia tcpdf.php 1838)

znalazłem wskazówkę w komentarzach: 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.

Ale teraz potrzebuję porady, jak używać TCPDF i mb_internal_encoding prawidłowo (bez problemów z ciasta lub TCPDF).

Przepraszamy za pytanie, jestem absolutnie początkujący. ;)

7

Po starając się znaleźć i debugować ten sam błąd przez ponad godzinę, po prostu zresetować wartość UTF-8 po wykorzystaniu TCPDF - i wszystko działa jak przedtem:

$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'); 

Próbowałem też resetowania bezpośrednio po wywołaniu new TCPDF i wszystko było w porządku. Nie wiem, co może pójść nie tak z tym resetem :) Moje pliki PDF nadal wyglądają tak samo, ale e-maile są wysyłane ponownie.

+0

tak to działało dla mnie też – Ayman

+0

Dobrze! (Uwaga! Czasami jesteśmy wykluczani z wyjątków w klasie, więc musiałem spróbować złapać, zanim zresetuję kodowanie) –