How to add a custom paper size on FPDF? - php

I am using FPDF to create a document. My problem is the paper size requirement is 8.5 by 13 inches. Is there a way to add a custom page size. I tried searching still no avail. When I used 'Legal' the printing is warped.
$pdf = new myPDF('P','in',[8.5,13]);
$pdf->AddPage('P', 'Legal', 0);
$pdf->SetMargins('15', '20', '15');
$pdf->SetFont('Arial', 'B', 12);
$pdf->Ln(5);
$pdf->Cell(0, 5, 'PAGE 1', 0, 1, 'C');
$pdf->AddPage('P', 'Legal', 0);
$pdf->Cell(0, 5, 'PAGE ', 0, 1, 'C');

As the documentation says, when you create the instance the 3rd parameter may be an array that specifies the width and height. So you may use:
$pdf = new myPDF('P','in',[8.5,13]);

Related

FPDF Put Header + Styling on Auto Page Break Pages

I'm using $pdf->SetAutoPageBreak(true); to auto break long outputs over multiple pages but I have some styling that I would like to apply to the auto-created pages:
// HEADER ------------------------------------------------------------------
$pdf->SetTextColor( $headerColour[0], $headerColour[1], $headerColour[2] );
$pdf->SetFont( 'Arial', '', 17 );
$pdf->Cell( 0, 15, $reportName, 0, 0, 'C' );
$pdf->Ln( 16 );
$pdf->SetLineWidth(7);
$pdf->SetDrawColor($col_r, $col_g, $col_b);
$pdf->Line(0, 0, 0, 300);
$pdf->SetLineWidth(0.5);
$pdf->Line(20, 26, 210-20, 26);
$pdf->SetTextColor( 0,0,0 );
$pdf->SetFont( 'Arial', 'B', 24 );
$pdf->Cell( 0, 15, 'Results', 0, 0, 'C' );
$pdf->Line(20, 40, 210-20, 40);
$pdf->Ln( 16 );
$pdf->Write( 6, $file ); // This is about 3 pages long worth of text
This adds a header-style block to the top of the page as well as a border on the left hand side all the way down the page. How can I replicate this on each page when the data is too big?
You can create extend class to automatically create the header.
Please check the example at http://www.fpdf.org/en/tutorial/tuto2.htm OR FPDF Tutorial for more information for the others sample.

TCPDF draw circle with border and fill

I'm using TCPDF in my php application, but I'm not finding a way to draw a circle with black border and filled with another color;
here my code:
$style_bollino = array('width' => 0.25, 'dash' => 0, 'color' => array(0, 0, 0));
$this->SetAlpha(1);
$this->Circle(35, 100, 4, 0, 360, 'C', $style_bollino, array(210, 0, 0));
I tried also to change 'C' parameter to 'F' or null but I didn't get the result.
I'm not able to figure out what I'm missing
kind regards,
Matt
According to one of their examples, there's a one-liner way to do it, just pass 'DF' to $style parameter:
$this->Circle(35, 100, 4, 0, 360, 'DF', $style_bollino, array(210, 0, 0));
For a list of options for this parameter, check the PHPDoc in TCPDF_STATIC::getPathPaintOperator() function.
This seems like a fairly straightforward requirement but I can't work out how to do it in one line either.
However, it's pretty simple to fill the circle and then draw another stroked circle on top of it.
foreach (array("F", "S") as $fill_style) {
$this->Circle(35, 100, 4, 0, 360, $fill_style, $style_bollino, array(210, 0, 0));
}

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 font spacing too wide

I have this code that has worked in the past:
$pdf = new TCPDF('L', 'In', 'LETTER', true);
$pdf->SetPrintHeader(false);
$pdf->SetPrintFooter(false);
$pdf->SetFont('Times','B',11);
$pdf->AddPage();
$pdf->SetLeftMargin(0.5);
$pdf->SetLineWidth(.04);
$pdf->Rect(.5, .5, 10, 7.5);
$pdf->SetLineWidth(.01);
$pdf->Rect(.55, .55, 9.89, 7.39);
$pdf->setFont('Times', 'BI', 31);
$pdf->SetXY(0.5,0.9);
$pdf->Cell( 9.75, 0.5, 'Certificate of Completion',0,1,'C');
$pdf->setFont('Helvetica', 'B', 11);
$pdf->SetXY(0.5,1.75);
$pdf->Cell( 9.75, 0.2, 'Course Work or Training in Infection Control',0,1,'C');
$pdf->Cell( 9.75, 0.2, 'Approved by', 0, 1, 'C');
$pdf->Cell( 9.75, 0.2, 'The New York State Department of Health &', 0, 1, 'C');
$pdf->Cell( 9.75, 0.2, 'The New York State Department of Education', 0, 1, 'C');
Now the output looks like this:
I tried adding this:
$pdf->setFontSpacing(100);
but the script failed to execute.
What is wrong?
The version of TCPDF on the site was old.
I updated to the latest version and the problem went away.

Categories