Tcpdf writeHTMLCell without overlapping boxes - php

I am creating a pdf with text images (1 image per page), and I need to add some boxes to the left and/or right of the image explaining some expressions from the image (using specific Y coordinates)
the problem is that sometimes the expressions are on the same row, and if I use the same Y coordinate when using writeHTMLCell or any other method that uses the Y as parameter, they will overlap
My question is .. is there a way of adding multiple boxes, without them overlapping?
$pdf->writeHTMLCell(50, 0, '', '10', 'First box', 1, 1, 0, true, 'J');
$pdf->writeHTMLCell(50, 0, '', '20', 'Second box', 1, 1, 0, true, 'J');
$pdf->writeHTMLCell(50, 0, '', '21', 'Third box', 1, 1, 0, true, 'J');
$pdf->writeHTMLCell(50, 0, '', '35', 'Fourth box box', 1, 1, 0, true, 'J');
$pdf->writeHTMLCell(50, 0, '', '38', 'Fifth box box', 1, 1, 0, true, 'J');

Related

How can draw dotted line in pdf using php and TCPDF?

I need to draw a horizontal dotted line in pdf using TCPDF. I tried:
$style = array('width' => 0.1, 'cap' => 'butt', 'join' => 'miter', 'dash' => 1, 'color' => array(0, 0, 0));
$pdf->Line(5, 50, 100, 50, $style);
I used the dash parameter. When I set it to 1 it draws short dashes, but I need dots. I did not find an explanation of the style parameters or any manual on the internet.
Please use the below code for the draw horizontal dotted line in pdf using TCPDF and apply a style to it.
<?php
require_once('tcpdf.php');
// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
// disable header and footer
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
// set font
$pdf->SetFont('helvetica', '', 10);
// add a page
$pdf->AddPage();
//set 'width' => 0.1, 'dash' => '1,1,1,1' as per your requirement
$style = array('width' => 0.5, 'dash' => '2,2,2,2', 'phase' => 0, 'color' => array(255, 0, 0));
// Line
$pdf->Text(5, 4, 'Line examples');
$pdf->Line(5, 20, 200, 20, $style);
//Close and output PDF document
$pdf->Output('line_example.pdf', 'I');
I hope this helps!
You can have dots, if you want to.
Just set the cap to round in the style properties:
$style = array('width' => 0.5, 'cap => 'round', 'dash' => '2,2,2,2', 'phase' => 0, 'color' => array(255, 0, 0));

How to manually position a barcode in tcpdf

I'm trying to add some barcodes programmatically in a pdf file but I think I'm not understanding something correctly regarding positioning.Here's my code
$pdf = new TCPDF("L", "mm", array(80, 40), true, 'UTF-8', false);
$pdf->SetMargins(3, 3, 3);
// remove default header/footer
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);
$pdf->setFontSubsetting(true);
$pdf->SetFont('freeserif', '', 12);
foreach ($barcodes as $barcode){
$pdf->AddPage();
$x = $pdf->GetX();
$y = $pdf->GetY();
$style = array(
'border' => true,
'hpadding' => 'auto',
'vpadding' => 'auto',
'fgcolor' => array(0,0,0),
'bgcolor' => false, //array(255,255,255),
'text' => true,
'font' => 'helvetica',
'fontsize' => 8,
'stretchtext' => 4
);
//$pdf->Cell(30, 1, 'EAN 13', 0, 1);
$pdf->write1DBarcode($barcode, 'EAN13', '5', '6', '60', 14, 0.4, $style, 'N');
}
The result I get is like the image or in any way not even close to outputting the barcode where I'd like it to be and I have no clue why. I'd appreciate any help
if i use
$pdf->write1DBarcode($barcode, 'EAN13', '5', '5', '60', 14, 0.4, $style, 'N');
There is no empty pdf page but the barcode is still really high. I'd like it to go like 1/3 from top around 14mm that's why I was trying to fiddle with the y variable in write1DBarcode
After lots of fiddling around I found it.
Adding
$pdf->SetAutoPageBreak(TRUE, 0);
Made the autobreak behave correctly
My guess is that a bottom margin set by default that was messing around the alignment vertically that can't be set using $pdf->SetMargins. In any case problem solved for me. Thanks for trying to help
Use Below code
<?php $params = $pdf->serializeTCPDFtagParameters(array('5027010247321', 'C39', '', '', 80, 30, 0.4, array('position'=>'S', 'border'=>true, 'padding'=>4, 'fgcolor'=>array(0,0,0), 'bgcolor'=>array(255,255,255), 'text'=>true, 'font'=>'helvetica', 'fontsize'=>8, 'stretchtext'=>4), 'N'));
?>
And paste these below line where you want tcpdf baarcode
<tcpdf method="write1DBarcode" params="<?php echo $params; ?>" />
Visit [https://www.youtube.com/watch?v=flXFPbKRmUo][2]

TCPDF Make content jump a page

Right now I'm working on a Symfony web app, and it is using TCPDF to print receipts. I would like to know if there is a way/method to know how long is part of my content and compare it to the rest of the empty page. If the content is larger than the rest of the page, it would give a add another page and put the content there.
For example, I have 3 tables in my first page. If the first two tables occupy 80% of the page, and the third will ocupy 50%, compare those 50% to the 20% remaining of the first page, and since the content is bigger than the rest of the page, add another page and put table 3 there.
I don't have any code to show right now, but I am asking now since this is something I will have to do in the future (and I know there have been alot of problems with overlapping tables)
There's a function I use called public function checkHeights() that, as the name suggests, checks the heights of an element in TCPDF.
public function checkHeights($pdf, $array, $checkHeight = 10){
$max_height = 0;
foreach($array AS $item){
$current_height = $pdf->getStringHeight($item["width"], $item["text"], false, true, '', 1);
if($current_height >= $max_height){
$max_height = $current_height;
}
}
$page_height = $pdf->getPageHeight();
$margins = $pdf->getMargins();
if($pdf->GetY() + $max_height >= ($page_height - $margins["bottom"] - $checkHeight)){
$size = $pdf->getFontSizePt();
$style = $pdf->getFontStyle();
$pdf->SetFont('helvetica', 'I', 6.5, '', true);
$pdf->SetColor("text", 155, 155, 155);
$pdf->Cell(0, 0, 'Continued...', 'T', 0, 'R', 0, '', 0, false, 'T', 'T');
$pdf->SetFont('helvetica', $style, $size, '', true);
$pdf->SetColor("text", 0, 0, 0);
$pdf->addPage();
$pdf->Cell(0, 0, '', 'B', 1, 'R', 0, '', 0, false, 'T', 'T');
}
return $max_height;
}
It accepts 3 variables: Your $pdf object, an array of arrays containing cell information and the height (space from the bottom) to check against.
There are two ways to use this function. Firstly, checking to see if a single Cell will take up the remaining space on a given page:
self::checkHeights($pdf, array(array("width" => 0, "text" => "")));
If there isn't enough space, it will save your font and style settings and add a small Continued... to the right side of your page.
Secondly, passing in the contents of a row (or list of Multicell items):
$height = Self::checkHeights($pdf, array(array("width" => 45, "text" => "Example"), array("width" => 54, "text" => "Example"), array("width" => 52, "text" => "Example"), array("width" => 26, "text" => "Example"), array("width" => 0, "text" => "Example")));
In this example, the current row item has 5 cells, with widths of 45, 54, 52, 26 and 0 (0 being the remaining horizontal space). It also takes into account cell wrapping (ie making the row grow in height to accommodate text overflow) and will add the Continued... text if it's too long.
Once you have $height defined and a new page added (if necessary), you would create your row of Multicells:
$pdf->MultiCell(45, $height, "Example", 'L', 'L', 0, 0, '', '', true, 0, false, true, $height, 'M');
$pdf->MultiCell(54, $height, "Example", 0, 'R', 0, 0, '', '', true, 0, false, true, $height, 'M');
$pdf->MultiCell(52, $height, "Example", 0, 'R', 0, 0, '', '', true, 0, false, true, $height, 'M');
$pdf->MultiCell(26, $height, "Example", 0, 'C', 0, 0, '', '', true, 0, false, true, $height, 'M');
$pdf->MultiCell(0, $height, "Example", 'R', 'R', 0, 1, '', '', true, 0, false, true, $height, 'M');
Refer to the TCPDF documentation for using ->MultiCell() function, but the important ones are the ones that use $height and the last one, which is vertical alignment.
Essentially, checkHeights() is a way to construct cells in a row that all have the same height, based on the content, but also a way to check if a cell will use up the remaining vertical space on the page, and add a page before outputting a new cell. If you need more clarification, let me know.

Tcpdf multiple bookmarks on single page

Is it possible to have PDF with multiple Bookmarks on one page? I have a page with multipe tables, and each table need to be bookmarked. These tables may increase and go on next page.
The documentation supports explains how to do this here.
The syntax is as follows:
// Bookmark($txt, $level=0, $y=-1, $page='', $style='', $color=array(0,0,0))
$pdf->AddPage();
$pdf->Bookmark('Paragraph 1.1', 1, 0, '', '', array(0,0,0));
$pdf->Cell(0, 10, 'Paragraph 1.1', 0, 1, 'L');
$pdf->Bookmark('Paragraph 1.2', 1, 0, '', '', array(0,0,0));
$pdf->Cell(0, 10, 'Paragraph 1.2', 0, 1, 'L');

TCPDF footer how to add columns

I'm using TCPDF and got the following function that adds page number to the footer. However this only centers the page numbering, i want to be able to add a description on the left and a reference number on the right. So in other words 3 columns, left column being left aligned with description, middle column with page number and centered and right column with reference number and right aligned.
class MYPDF extends TCPDF {
// Page footer
public function Footer() {
// Position at 15 mm from bottom
$this->SetY(-15);
// Set font
$this->SetFont('Calibri', '', 8);
// Page number
$pageNumbers = 'Page '.$this->getAliasNumPage().' of '.$this->getAliasNbPages();
$this->Cell(0, 10, $pageNumbers, 0, false, 'C', 0, '', 0, false, 'T', 'M');
}
}
Easiest thing to do is create three separate cells, one for each item, as follows:
$this->Cell(30, 10, 'Description', 1, false, 'C', 0, '', 0, false, 'T', 'M');
$this->Cell(130, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 1, false, 'C', 0, '', 0, false, 'T', 'C');
$this->Cell(30, 10, 'Reference number', 1, false, 'C', 0, '', 0, false, 'T', 'M');
This will create footer looking like this (I turned $border to '1' so the border shows how the cell structure works). Of course you can adjust the sizes of the different cells if you need more space for the content.

Categories