$pdf_html variable are holding html content to add on each pdf pages. The problem is the inline font size not working. If i change it to any large font size number nothing working rather taking a default font size always. please check the below codes.
Is there anything wrong on my html deceleration? any suggestion?
Note: I have to write each html tag as absolute position which is defined on stylesheet but not inline.
$defaultConfig = (new \Mpdf\Config\ConfigVariables())->getDefaults();
$defaultFontConfig = (new \Mpdf\Config\FontVariables())->getDefaults();
$storage_path = storage_path();
$stylesheet = file_get_contents($storage_path.'/fonts/style_pdf_custom.css');
$mpdf = new \Mpdf\Mpdf([
'dpi' => 144,
'tempDir' => $storage_path . '/app/public/documents/completed/pages',
'fontDir' => array_merge($defaultConfig['fontDir'], [
$storage_path . '/fonts'
]),
'fontdata' => $defaultFontConfig['fontdata'] + [
'greatvibes' => [
'R' => 'GreatVibes-Regular.ttf',
],
'montezregular' => [
'R' => 'Montez-Regular.ttf',
],
'sacramentoregular' => [
'R' => 'Sacramento-Regular.ttf',
]]
]);
$mpdf->WriteHTML($stylesheet,1);
foreach($available_documents as $key => $doc){
$pages = $this->appRepo->getDocumentPages($doc->id, $doc->envelope_id);
$sourceFilename = $doc->filename_system_generated;
$mpdf->SetSourceFile($storage_path . "/app/public/documents/" . $sourceFilename);
foreach($pages as $k => $page){
$elements = json_decode($page->elements);
$mpdf->AddPage();
$importedPage = $mpdf->importPage($page->page_no);
$mpdf->useTemplate($importedPage, ['adjustPageSize' => true]);
$pdf_html = '<div class="common-block" style="width:203px; left:158px;top:243px;height:28px;justify-content: left;color:black;font-size:22px;font-weight: bold; "> Mr. Admin</div><div class="common-block" style="width:247px; left:739px;top:365px;height:40px;justify-content: left;color:black;font-size:24px; ">Checking Font Size</div>';
$mpdf->WriteHTML($pdf_html, \Mpdf\HTMLParserMode::HTML_BODY);
}
}
$tempname = time().$filename;
$mpdf->Output($storage_path. "/app/public/documents/temp/" . $tempname, "F");
After doing research last couple of days i can figure out the problem why the font size not working properly inside a div with absolute position.
When your html content have absolute position and you have set a fixed height, width then what ever font-size you set it will not exceed the div and mpdf auto adjust the font-size but while on relative position any font-size always works as it define.
So finally i have adjust the div width and height then i found the actual font-size changes are working well on a div with position:absolute
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...
My html to pdf conversion using wkhtmlpdf working fine without the <style> tag
but when I include the style tag it's not working that means not generating the pdf some one help me to solve this issue or let me know how to include my style.css in this format.
The way I handle this is as follows--
<?php
// create some HTML content
$html = '<!DOCTYPE html><html><head>
<style>
body {
margin: 0;
padding: 0;
}
...
</style></head><body>
<!-- Your body content -->
</body></html>';
$options = array(
"no-outline",
"binary" => "/usr/local/bin/wkhtmltopdf",
"margin-top" => ".25in",
"margin-right" => ".25in",
"margin-bottom" => ".55in",
"margin-left" => ".25in",
"zoom" => 1
);
$footer = '<!DOCTYPE html><html><head></head><body>...</body></html>';
$page_options = array('footer-html' => $footer);
$pdf->addPage($html, $page_options);
$pdf->saveAs('MY_PDF_NAME.pdf');
Hope this helps!
Best,
-Rush
Im using Yii framework, and Im using EYiiPdf extension.
I have to view an image in Pdf output file but I got this Error:
ERREUR n°6 : Impossible de charger l'image /images/big-logo.png
in
/protected/vendor/html2pdf/html2pdf.class.php(1319)
this is mu code :
in controller:
$html2pdf = Yii::app()->ePdf->HTML2PDF();
$html2pdf->WriteHTML($this->renderPartial('index', true));
$html2pdf->Output();
and this the image tag in view
<img src="/images/big-logo.png" alt="logo" style="width: 190px; height: 70px">
the image folder and image exist.
this is my folder structure
images
js
css
protected
--->controoler
--->views
--------->pdf
------------->index.php
and the same image tag with same image path working in any other view file but if use the HTML2PDF it return that error
Thank
I solved my problem by:
in html2pdf.class.php file at line 5602. by adding the server Document Root to image source.
protected function _tag_open_IMG($param)
{
$src = str_replace('&', '&', $param['src']);
$documentRoot = $_SERVER['DOCUMENT_ROOT']; // get server document root
$src = $documentRoot. '/' . $src; //aapend server document root to the image soure
$this->parsingCss->save();
$this->parsingCss->value['width'] = 0;
$this->parsingCss->value['height'] = 0;
$this->parsingCss->value['border'] = array('type' => 'none', 'width' => 0, 'color' => array(0, 0, 0));
$this->parsingCss->value['background'] = array('color' => null, 'image' => null, 'position' => null, 'repeat' => null);
$this->parsingCss->analyse('img', $param);
$this->parsingCss->setPosition();
$this->parsingCss->fontSet();
$res = $this->_drawImage($src, isset($param['sub_li']));
if (!$res) return $res;
$this->parsingCss->load();
$this->parsingCss->fontSet();
$this->_maxE++;
return true;
}
In this case html2pdf.class.php just take the image path instead of url, actually you dont need to change the library code, just need...
<img src="<?=Yii::getPathOfAlias('webroot').'/images/big-logo.png'?>">
for background image...
<div style="background-image: url(<?=Yii::getPathOfAlias('webroot').'/images/big-logo.png'?>)">
...
</div>
I'm using PHP & HTML2PDF lib to generate pdf files.But what I'm trying to do is to generate a pdf file with the pageSize (width/height) as html content size. How can I achieve this?
My html content is:
<page format="432x240" orientation="L" backcolor="#FFFFFF" style="font: arial;">
<div class="image">
<span class="firstname">$fname</span>
<span class="lastname">$lname</span>
</div>
The css for image class is:
position: relative;width: 100%; /* for IE 6 */ background-image: url(../img/test.png);height: 240px; width: 432px;top: 50%;
And my PHP code is:
$html2pdf = new HTML2PDF('P', 'A4', 'en', true, 'UTF-8', 0);
$html2pdf->pdf->SetDisplayMode('fullpage');
$contentTpl = $this->renderPartial('template_01', array('fname' => $firstname, 'lname' => $lastname), true);
$html2pdf->writeHTML(utf8_encode($contentTpl));
Here is the solution for this problem:
$html2pdf = new HTML2PDF('P', array($width_in_mm,$height_in_mm), 'en', true, 'UTF-8', array(0, 0, 0, 0));
Width and Height should be in MM. If your using inches convert it to MM.
Formula:
$width_in_mm = $width_in_inches * 25.4;
$height_in_mm = $height_in_inches * 25.4;
Don't round it off. Used the exact conversion even if it has a decimal point.
Hope this answer will solve your problem.