与cakephp冲突utf-8 tcpdf 3

Hi community I'm using plugin CakePdf with the library tcpdf and when generating the pdf it shows me the following error

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]

my configuration is like this

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

within my action which generates the pdf is this way

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

inside my template the configuration is this way, also apply the function mb_internal_encoding ('UTF-8'); to reset the enconding but still the error continues

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

please help I go several days with the problem thanks.

I recently made a pdf with TCPDF and had the same problem. It looks like you're building your PDF with the TCPDF engine directly.

This error happens when CakePHP throws an error before the PDF output can begin... for example, it could be a "Trying to get a property of a non-object in...." error or something like that. You should be able to see the specific error message info below the htmlspecialchars() warnings.

I suggest checking to make sure your pdf is working correctly first... instead of your //build my pdf code, make a simple line like

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

If that works, then your configuration is working and the error is likely in your variables somewhere, so start building your pdf piece by piece, testing as you go.

I'll also add that I also chose to use the TCPDF engine directly, so I didn't use the CakePDF plugin (which works great but didn't meet my needs for this particular problem). I can provide more info on this if needed.

EDIT:

I'll provide some info on how I used TCPDF directly in my project without CakePDF in case you or anyone finds it helpful.

First, I wanted to use TCPDF engine directly for a few reasons:

  • Precise control of headers and footers

  • Able to use the text scaling, FIT CELL functions of TCPDF

  • more precise absolute positioning of elements

  • avoid CSS.

So I installed TCPDF directly with composer

composer require tecnickcom/tcpdf

Added this to app/vendor/cakephp-plugins.php

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

Then in app/config/bootstrap.php

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

Then in app/config/routes.php

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

Then in app/src/controller/mycontroller.php, I created the method outputpdf. In that method, I set all the data collections to be used in the pdf, then

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

Then in app/src/template/mycontroller/pdf/ i created the mypdf.php. This file contains only this code:

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

$this->layout = 'mypdf';

Then in app/src/template/layout/pdf/ I created the file mypdf.php. In this file I built my PDF with the data from the controller.

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

One downside with this approach is with foreign language fonts, you need to add and use the fonts you need in the app/vendor/tecnickcom/tcpdf/fonts folder, and those are all that are available for your pdf.

Please feel free to critique or advise on improvements to this approach.

I found the error is with the images that I use inside the pdf, one of them I use as the background of the pdf and another one is like a small image.

$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();
}

the error continues, the error stops showing when I comment the line where the

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

I do not know what I'm doing wrong I read the documentation and this function if you accept the img tag.

Can you debug your $imglogo variable to see if the file path is correct?

Or, try displaying the image with the $pdf->Image() function?

Note that TCPDF has a configuration option in vendor\tecnickcom\tcpdf\config\tcpdf_config.php:

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

So you can call the image in the PDF via:

$image_file = K_PATH_IMAGES.'imagefile.jpg';

See if that works...