Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] domPdf windows-1250 export problem
Forum PHP.pl > Forum > PHP
john_doe
Witajcie,

z uwagi na specyfikę środowiska projektu muszę używać kodowania windows-1250 - czyli wszystkie widoki mam tak kodowane.
Próbuję użyć domPDF w taki sposób
  1. function generate_pdf($object, $filename='', $direct_download = TRUE)
  2. {
  3.  
  4. require_once 'dompdf/dompdf_config.inc.php';
  5.  
  6. $dompdf = new DOMPDF();
  7. //$dompdf->load_html($object, 'windows-1250');
  8. $dompdf->load_html(iconv('Windows-1250','UTF-8', $object));
  9. $dompdf->render();
  10.  
  11. if( $direct_download )
  12. {
  13.  
  14. $dompdf->stream($filename);
  15.  
  16. }
  17. else{
  18.  
  19. return $dompdf->output();
  20.  
  21. }
  22.  
  23. }


i teraz to co zakomentowane nie działa tzn. tworzy pdf ale przy próbie otwarcia go dostaję error.
w takiej postaci jak teraz plik się generuje, mogę go otworzyć jednak polskich znaków brak.

jakieś doświadczenia? wskazówki? bardzo proszę smile.gif
sabat24
Drugi parametr w funkcji load_html w oryginalnej wersji nie był w ogóle używany.

Podmień sobie ten fragment w pliku include/dompdf.cls.php

  1. function load_html($str, $encoding = FALSE, $auto_detect = TRUE) {
  2. $this->save_locale();
  3.  
  4. // FIXME: Determine character encoding, switch to UTF8, update meta tag. Need better http/file stream encoding detection, currently relies on text or meta tag.
  5. mb_detect_order('auto');
  6.  
  7. if ($encoding === FALSE && $auto_detect === TRUE) {
  8. $_encoding = strtoupper(mb_detect_encoding($str));
  9. } else if ($encoding !== FALSE) {
  10. $_encoding = strtoupper($encoding);
  11. }
  12.  
  13. if (empty($_encoding)) {
  14. $metatags = array(
  15. '@<meta\s+http-equiv="Content-Type"\s+content="(?:[\w/\+]+)(?:;\s*?charset=([^\s"]+))?@i',
  16. '@<meta\s+content="(?:[\w/\+]+)(?:;\s*?charset=([^\s"]+))"?\s+http-equiv="Content-Type"@i',
  17. '@<meta [^>]*charset\s*=\s*["\']?\s*([^"\' ]+)@i',
  18. );
  19.  
  20. foreach($metatags as $metatag) {
  21. if (preg_match($metatag, $str, $matches)) break;
  22. }
  23.  
  24. if (empty($encoding)) {
  25. if (isset($matches[1])) {
  26. $_encoding = strtoupper($matches[1]);
  27. } else {
  28. $_encoding = 'UTF-8';
  29. }
  30. } else {
  31. if (isset($matches[1])) {
  32. $_encoding = strtoupper($matches[1]);
  33. } else {
  34. $_encoding = 'auto';
  35. }
  36. }
  37.  
  38. if (isset($matches[1])) {
  39. $str = preg_replace('/charset=([^\s"]+)/i', 'charset=UTF-8', $str);
  40. } else {
  41. $str = str_replace('<head>', '<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">', $str);
  42. }
  43. }
  44.  
  45.  
  46. if ($_encoding !== 'UTF-8') {
  47. if ($_encoding == 'WINDOWS-1250') {
  48. $str = iconv('UTF-8', $_encoding, $str);
  49. $str = strtr($str, $this->_PL_WIN_SPECIFIC, $this->_PL_ISO_SPECIFIC);
  50. } else {
  51. $str = mb_convert_encoding($str, 'UTF-8', $_encoding);
  52. }
  53. }
  54.  
  55. // remove BOM mark from UTF-8, it's treated as document text by DOMDocument
  56. // FIXME: roll this into the encoding detection using UTF-8/16/32 BOM (http://us2.php.net/manual/en/function.mb-detect-encoding.php#91051)?
  57. if (substr($str, 0, 3) == chr(0xEF).chr(0xBB).chr(0xBF)) {
  58. $str = substr($str, 3);
  59. }
  60.  
  61. // Parse embedded php, first-pass
  62. if ( DOMPDF_ENABLE_PHP ) {
  63. eval("?" . ">$str");
  64. $str = ob_get_clean();
  65. }
  66.  
  67. // if the document contains non utf-8 with a utf-8 meta tag chars and was
  68. // detected as utf-8 by mbstring, problems could happen.
  69.  
  70.  
  71.  
  72. if ( $_encoding !== 'UTF-8' ) {
  73. $re = '/<meta ([^>]*)((?:charset=[^"\' ]+)([^>]*)|(?:charset=["\'][^"\' ]+["\']))([^>]*)>/i';
  74. $str = preg_replace($re, '<meta $1$3>', $str);
  75. }


Na początku dodaj do klasy
  1. private $_PL_WIN_SPECIFIC = "\xa5\x8c\x8f";
  2. private $_PL_ISO_SPECIFIC = "\xa1\xa6\xac";


Wywołujesz to:
  1. load_html($zmienna_z_tekstem, 'windows-1250');


$auto_detect jest dla moich potrzeb, więc możesz to zignorować.
Z htmla, który wrzucasz do funkcji najlepiej wywal "charset="
Całość ma być w UTF-8.

Być może będziesz musiał też podmienić class.pdf.php na ten, o którym tutaj mowa: http://bukox.pl/php/dompdf-i-polskie-znakie/

U mnie działa to i na Unixowych systemach i pod Windowsem.

Jeżeli chcesz używać skryptów PHP wewnętrznie i generować z nich polskie znaki, to musisz jeszcze zamienić w pliku include/php_evaluator.cls.php
z
  1. eval(utf8_decode($code));

na
  1. eval($code);


To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.