конфликт utf-8 tcpdf с cakeph 3

#php #cakephp-3.0 #tcpdf

#php #cakephp-3.0 #tcpdf

Вопрос:

Привет, сообщество, я использую плагин CakePdf с библиотекой tcpdf, и при создании pdf-файла он показывает мне следующую ошибку

 Error:
 Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not      supported, assuming utf-8 in G:Trabajos_Web_PHPdiplomasvendorcakephpcakephpsrcCorefunctions.php on line 69

  Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not supported, assuming utf-8 in G:Trabajos_Web_PHPdiplomasvendorcakephpcakephpsrcCorefunctions.php on line 69

  Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not supported, assuming utf-8 in G:Trabajos_Web_PHPdiplomasvendorcakephpcakephpsrcCorefunctions.php on line 69

 Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not supported, assuming utf-8 in G:Trabajos_Web_PHPdiplomasvendorcakephpcakephpsrcCorefunctions.php on line 69

 Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not supported, assuming utf-8 in G:Trabajos_Web_PHPdiplomasvendorcakephpcakephpsrcCorefunctions.php on line 69

Warning (2): htmlspecialchars() [<a href='http://php.net/function.htmlspecialchars'>function.htmlspecialchars</a>]: charset `ASCII' not supported, assuming utf-8 [COREsrcCorefunctions.php, line 69]
  

моя конфигурация такая

 Plugin::load('CakePdf', ['bootstrap' => true]);
Configure::write('CakePdf', [
    'engine' => 'CakePdf.Tcpdf',
    'encoding' => 'UTF-8'
    'download' => true
]);
  

в моем действии, которое генерирует pdf, это так

 public function pdfdo($names = null) {

        $file = new File(WWW_ROOT.'bd/'.'base_datos_do.json');
        $json = $file->read(TRUE,'r');
        $config = json_decode($json,TRUE);
        $this->set('config',$config);
        $persons = explode(',', $names);
        $this->set('lastnames',$persons);
        $this->viewBuilder()->setLayout('ajax');
        $this->viewBuilder()->setTemplate('pdf/pdfdo');
        $this->response->withType('application/pdf');
    }
  

внутри моего шаблона конфигурация такая, также примените функцию mb_internal_encoding (‘UTF-8’); чтобы сбросить завершение, но ошибка все равно продолжается

 $pdf = new TCPDF('L',PDF_UNIT,PDF_PAGE_FORMAT,TRUE,'UTF-8',FALSE);
$pdf->SetCreator(PDF_CREATOR);

$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
// build my pdf
// finalization of my pdf
mb_internal_encoding('UTF-8');
$pdf->Output('Diplomas-DO.pdf', 'D');
header('Content-Type: application/pdf; charset=utf-8');
  

пожалуйста, помогите мне решить проблему несколько дней, спасибо.

Ответ №1:

Недавно я создал pdf-файл с TCPDF и столкнулся с той же проблемой. Похоже, вы создаете свой PDF-файл напрямую с помощью движка TCPDF.

Эта ошибка возникает, когда CakePHP выдает ошибку до начала вывода PDF… например, это может быть ошибка «Попытка получить свойство не-объекта в …» или что-то в этом роде. Вы должны быть в состоянии увидеть информацию о конкретном сообщении об ошибке под предупреждениями htmlspecialchars().

Я предлагаю сначала проверить, правильно ли работает ваш pdf-файл … вместо вашего //build my pdf-кода создайте простую строку, например

         $pdf->setXY(13, 13);
        $pdf->Write(5, 'Test Hello');
  

Если это работает, значит, ваша конфигурация работает, и ошибка, вероятно, где-то в ваших переменных, поэтому начните создавать свой PDF-файл по частям, тестируя по ходу.

Я также добавлю, что я также решил использовать движок TCPDF напрямую, поэтому я не использовал плагин CakePDF (который отлично работает, но не соответствует моим потребностям для этой конкретной проблемы). Я могу предоставить больше информации об этом, если это необходимо.

Редактировать:

Я предоставлю некоторую информацию о том, как я использовал TCPDF непосредственно в своем проекте без CakePDF на случай, если вы или кто-либо сочтет это полезным.

Во-первых, я хотел использовать TCPDF engine напрямую по нескольким причинам:

  • Точное управление верхними и нижними колонтитулами

  • Возможность использовать функции масштабирования текста, подгонки ячеек TCPDF

  • более точное абсолютное позиционирование элементов

  • избегайте CSS.

Итак, я установил TCPDF непосредственно с помощью composer

 composer require tecnickcom/tcpdf
  

Добавлено это в app/vendor/cakephp-plugins.php

 'Tecnickcom/Tcpdf' => $baseDir . '/vendor/tecnickcom/tcpdf/'
  

Затем в app/config/bootstrap.php

 Plugin::load('Tecnickcom/Tcpdf', ['bootstrap' => true]);
  

Затем в app/config/routes.php

 Router::extensions(['pdf']);
  

Затем в app/src/controller/mycontroller.php , я создал метод outputpdf. В этом методе я настраиваю все коллекции данных для использования в формате pdf, затем

 $this->viewBuilder()->template('mypdf');
  

Затем в app/src/template/mycontroller /pdf / я создал mypdf.php . Этот файл содержит только этот код:

 header("Content-type:application/pdf");

$this->layout = 'mypdf';
  

Затем в app /src/template /layout /pdf / я создал файл mypdf.php . В этом файле я создал свой PDF-файл с данными из контроллера.

 header("Content-type:application/pdf");

// Extend the TCPDF class to create custom Header and Footer

class MYPDF extends TCPDF {
//And build the header and footer in here
}


$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

//And make all the body content here

$pdf->Output('mypdf.pdf', 'I');
  

Одним из недостатков этого подхода является использование шрифтов на иностранных языках, вам нужно добавлять и использовать нужные вам шрифты в папке app / vendor / tecnickcom / tcpdf / fonts, и это все, что доступно для вашего pdf.

Пожалуйста, не стесняйтесь критиковать или советовать по улучшению этого подхода.

Комментарии:

1. спасибо за ваш ответ, хорошо, прежде чем плагин напрямую использует класс как таковой, поскольку я думал, что ошибка, возможно, связана с тем, что прямое использование мигрирует в плагин, но постоянная ошибка

Ответ №2:

Я обнаружил, что ошибка связана с изображениями, которые я использую внутри pdf, одно из них я использую в качестве фона pdf, а другое похоже на маленькое изображение.

 $pdf = new TCPDF('L',PDF_UNIT,PDF_PAGE_FORMAT,TRUE,'UTF-8',FALSE);
$pdf->SetCreator(PDF_CREATOR);

$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
$fontname = TCPDF_FONTS::addTTFfont(WWW_ROOT.'font'.DS.'Mada'.DS.'Mada-Regular.ttf', 'TrueTypeUnicode', '', 96);
 $tagvs = array(
    'div'=> array(
        0 => array('h'=>0,'n' => 0),
        1 => array('h'=>0,'n' => 0)),
    'p'=> array(
        0 => array('h'=>0,'n' => 0),
        1 => array('h'=>0,'n' => 0)),
    'h2' => array(
        0 => array('h'=>0,'n' => 0),
        1 => array('h'=>0,'n' => 0)),
    'img' => array(
        0 => array('h'=>0,'n' => 0),
        1 => array('h'=>0,'n' => 0)
    )
     );
       //variable that has small image
       $imglogo = WWW_ROOT.'logos'.DS.'logoempresa.png';
        foreach ($lastnames as $names) {
    $pdf->AddPage();
    $bMargin = $pdf->getBreakMargin();
    $auto_page_break = $pdf->getAutoPageBreak();
    $pdf->SetAutoPageBreak(false, 0);
    //image for background
    $img = WWW_ROOT.'img'.DS.'Diploma_DO.png';
    $pdf->Image($img, 0, 0, 300, 210, 'png', '', '', false, 600, '', false, false, 0);

    $pdf->SetAutoPageBreak($auto_page_break, $bMargin);
    $pdf->setPageMark();
    $pdf->setHtmlVSpace($tagvs);
    $html_title =  '<table  cellspacing="0">'
            . '<tr style="text-aling:center;line-height:11px">'
            . '<td style="font-size: 37pt;font-weight: 600;color: #034bdb;color:#003275">'.$names.'</td>'
            . '</tr>'
            . '</table>';
    $html_text_content = '<div style="text-align: center">'
            . '<p style="color:#333;font-size: 16px;text-align: center">Ha completado con éxito el '.$config["Nombre-Taller-Curso"].',</p>'
            . '<p style="color:#333;font-size: 16px;text-align: center">efectuada el '.$config["Fecha-Inicio-Fin"].' de '.$config["Mes-Ano"].' con una duración de '.$config["Horas"].' Horas.</p>'
            . '</div>';
    $html_text_content_bussines = '<div style="text-align: center">'
            . '<p style="color:#333;font-size: 16px;text-align: center">Este taller ha sido diseñado especialmente para '.$config["Empresa"].'.</p>'
            . '</div>';
    $html_text_content_close = '<div style="text-align: center">'
            . '<p style="color:#333;font-size: 16px;">'.$config["Fecha-Curso-Ubicacion"].'</p>'
            . '</div>';

    //img tag that contains the small image
    $html_logo_bussines = '<img src="'.$imglogo.'" width="150" height="100">';

    $pdf->SetFont($fontname, 'B', 26, '',false);
    $pdf->writeHTMLCell(300,0,0,78,$html_title, '', 1, 0, true, 'C',true);
    $pdf->SetFont($fontname,'',14,'',false);
    $pdf->writeHTMLCell(300, 0, 0, 88, $html_text_content, '', 1, 0, true, 'C', true);
    $pdf->writeHTMLCell(300, 0, 0, 109, $html_text_content_bussines, '', 1, 0, true, 'C', true);
    $pdf->writeHTMLCell(300,0,0,125,$html_text_content_close,'',1,0,true,'C',true);

    //use of the small image
    $pdf->writeHTMLCell(300,0,0,155,'<div style="text-align:center">'.$html_logo_bussines.'<div>',0,0,0,true,'C',true);
    $pdf->lastPage();
}
  

ошибка продолжается, ошибка перестает отображаться, когда я комментирую строку, в которой

 $pdf->writeHTMLCell(300,0,0,155,'<div style="text-align:center">'.$html_logo_bussines.'<div>',0,0,0,true,'C',true);
  

Я не знаю, что я делаю не так, я прочитал документацию и эту функцию, если вы принимаете тег img.

Ответ №3:

Можете ли вы отладить свою переменную $imglogo, чтобы проверить, правильный ли путь к файлу?

Или попробуйте отобразить изображение с помощью функции $pdf-> Image()?

Обратите внимание, что TCPDF имеет параметр конфигурации в vendortecnickcomtcpdfconfigtcpdf_config.php:

 define ('K_PATH_IMAGES', 'C:\windowsfolder\htdocs\app\webroot\img\');
  

Таким образом, вы можете вызвать изображение в формате PDF через:

 $image_file = K_PATH_IMAGES.'imagefile.jpg';
  

Посмотрите, работает ли это…