конфликт utf-8 tcpdf с cakeph 3 - PullRequest
0 голосов
/ 09 апреля 2019

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

Error:
 Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not      supported, assuming utf-8 in G:\Trabajos_Web_PHP\diplomas\vendor\cakephp\cakephp\src\Core\functions.php on line 69

  Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not supported, assuming utf-8 in G:\Trabajos_Web_PHP\diplomas\vendor\cakephp\cakephp\src\Core\functions.php on line 69

  Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not supported, assuming utf-8 in G:\Trabajos_Web_PHP\diplomas\vendor\cakephp\cakephp\src\Core\functions.php on line 69

 Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not supported, assuming utf-8 in G:\Trabajos_Web_PHP\diplomas\vendor\cakephp\cakephp\src\Core\functions.php on line 69

 Warning: htmlspecialchars() [function.htmlspecialchars]: charset `ASCII' not supported, assuming utf-8 in G:\Trabajos_Web_PHP\diplomas\vendor\cakephp\cakephp\src\Core\functions.php on line 69

Warning (2): htmlspecialchars() [<a href='http://php.net/function.htmlspecialchars'>function.htmlspecialchars</a>]: charset `ASCII' not supported, assuming utf-8 [CORE\src\Core\functions.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');

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

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Я обнаружил, что ошибка связана с изображениями, которые я использую внутри 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.

0 голосов
/ 15 апреля 2019

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

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

Обратите внимание, чтоTCPDF имеет опцию конфигурации в vendor \ tecnickcom \ tcpdf \ config \ tcpdf_config.php:

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

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

$image_file = K_PATH_IMAGES.'imagefile.jpg';

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

0 голосов
/ 10 апреля 2019

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

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

Я предлагаю проверить, чтобы убедиться, что ваш pdf сначала работает правильно ... вместо того, чтобы // строить мой pdf-код, сделайте простую строку, такую ​​как

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

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

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

EDIT:

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

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

  • Точный контроль колонтитулов

  • Можно использовать масштабирование текста, функции FIT CELL в 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 / rout.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.

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

...