Code

Randy Dustin. Web Developer.

Get Started generating PDF’s today! Part 3 – extending/reuse

August 25th, 2009

Extending FPDF

If you are new to FPDF you may want to start by reading Part 1: Installation and Part 2: Playing with the options.

We can extend the core FPDF library and set up some functions that we can reuse. For example, we want to present a report in a table. The table will need column headings so that we know what each column of data represents. We could build that into the file for this one report, but say we want another report, different heading names but the same basic structure. We can either replicate the entire file from the other report and change the heading values or we can extend FPDF and create a tableHeader function that accepts an array of heading values and creates the header on the fly. This approach will save us time as we add new reports.

//include the core fpdf library
include 'fpdf/fpdf.php';

//create our custom class
class Myfpdf extends FPDF
{
	//takes an array of values and prints them as text headers with a black border around each one
       function tableHeader($header)
	{
		foreach($header as $col)
		{
			$this->Cell(38,7,$col,1,0,'L',0);
		}
		$this->Ln();
	}
}

Now we want to use this to create a pdf. So in our index.php file we need to set up some values and generate the pdf.

//include our custom fpdf class
include 'my.fpdf.php';

//instantiate the class
$myFPDF = new Myfpdf();

//create the pdf
$myFPDF->AddPage();
$myFPDF->setTitle('Title');
$myFPDF->setFont('Arial', 'B', 15);

//set up the Header values and call it
$myFPDF->tableHeader(array('Header 1', 'Header 2', 'Header 3', 'Header 4'));

echo $myFPDF->Output('test_header.pdf','I');

There you have it, a reusable table head builder. Now you can use the same concept as above to output the table data.

Get Started generating PDF’s today! Part 2 – playing with the options

August 4th, 2009

If you haven’t read part 1 of the series, you might want to start there.

Options

Today we are going to talk about the options we have when creating a pdf with the FPDF library. We will cover:

  • Changing page orientation and size
  • Changing Font styles
  • Changing the size and style of text cells
  • The different options for saving the final product

Changing page orientation and size

When we initiate the FPDF class we can specify the page orientation, unit of measure and size. Page orientations options are: Landscape (L) and Portrait (P). Next we can set the unit of measure (used for everything except font sizes): Point (pt), Millimeter (mm), Centimeter (cm), and inch (in). To specify page size we have many options along with the ability to specify our own custom size. The options are: A3, A4, A5, Letter, and Legal.

So if we want to create a legal sized PDF in the landscape format, using millimeters as our unit of measure this is what it looks like:

$fpdf = new FPDF('L', 'mm', 'Legal');

Say we want a custom sized page, we need to specify the width and height in an array. The width and height values will use the specified unit of measure. Here is an example:

$fpdf = new FPDF('L', 'mm', array('250','400'));

Our page will be 250 millimeters wide and 400 millimeters high.

Changing font styles

Next we want to set the font and its styles. According to the FPDF website the standard fonts available are: Arial, Times, Courier, Symbol, and ZapfDingbats. We will use Times for this example. Now we can set the font style, the options include: Italic (I), Bold (B), or Regular (empty string). You can also specify a combination of these styles. We will use bold. Last, we want to set the font size (always in points). For this example we will set it at 22 points.

So, our example would look like this:

$fpdf->SetFont('Times','B',22);

Note: This can be used on a line by line basis to change the font in a pdf.

Changing the size and style of text cells

Now we need to write some text to our pdf. To do this we use the Cell function. There are a lot of options available when writing a text cell: Width, Height, text you want printed, border, where the current position should go after this cell, text alignment, whether the cell should have a background color or not, and a link for the text. For a complete list of the variables see the manual at fpdf.org. We want to output our name in text that is centered on the page, with no border and we want the cell to go to the next line after writing our name.

So, our example would look like this:

$fpdf->Cell(0,0,'Our Name',0,1,'C');

I have found it handy to have the cell page of the manual open for reference while building my pdfs. It helps me keep the options straight.

The different options for saving the final product

We’ve got our document ready and now we need to save it. We can specify the name for the file (I have found it best to specify a name without spaces such as file_name instead of file name) and the destination of the document. We have four destinations available: Inline (I) to the browser, Download (D) with the browser, Save (F) to a local file, and return the document as a String (S).

So, our example would look like this:

$fpdf->Output('file_name','D');

Note: I have found “D” to be the most consistent option across the different browsers.

This concludes our lesson for today. I hope this helps you get started playing with the options!

We will be continuing the series soon by extending FPDF to save us time.

Read Part 3 – Extending & Reuse

Get started generating PDF’s today! Part 1 – installation

July 28th, 2009

FPDF

FPDF describes itself as

FPDF is a PHP class which allows to generate PDF files with pure PHP, that is to say without using the PDFlib library. F from FPDF stands for Free: you may use it for any kind of usage and modify it to suit your needs.

Installation

  1. Download the library and place it in a directory accessible by your web server

    It generally makes sense to put it in an includes directory.

  2. Include it in your web application
    /* sample web app */
    //include the FPDF library
    require_once('includes/fpdf.php');
    
  3. Create the page
    //instantiate the object
    $fpdf = new FPDF();
    
    //create a page
    $fpdf->AddPage();
    
    //set the font, font-style, and size
    $fpdf->SetFont('Arial', 'B', 14);
    
    //create the text to be output and go to the next line
    $fpdf->Cell(22, 12, "Randy Dustin", 0,1);
    //the next line
    $fpdf->Cell(22, 12, "Pretty much the coolest person on Earth!");
    
    //create the page
    $fpdf->Output();
    

For more information and tutorials on building pdfs you can go to the FPDF website and reference their tutorials and the manual

We will be continuing this series soon with a closer look at our options when creating a page. Some things to look for are:

  • Changing page orientation and size
  • Changing Font styles
  • Changing the size and style of text cells
  • The different options for saving the final product

Read Part 2 – playing with the options

Timeclock: using FPDF to generate timesheets

April 9th, 2009

Background

Read background information on the design of the timeclock system!

Single vs. Multiple timesheets

Since each student’s timesheet is formated the same way, whether it is generated as a single timesheet or as part of multiple timesheets, I developed a class to create the timesheets.

Figure 1: A sample timesheet

Figure 1: A sample timesheet

In the class is a function called outputPDF which accepts one argument: an array of the timesheet values. Inside the function we begin creating the page.

function outputFPdf($app_data)
{
	$app_data;
	ob_start();
	$output = null;
	$output .= $this->fpdf->SetFont('Arial','B',15);
	$output .= $this->fpdf->Cell(80);
	$output .= $this->fpdf->Cell(30,10,'Complete Payroll Report',0,0,'C');
	$output .= $this->fpdf->Ln(8);
			$output .= $this->fpdf->SetFont('Arial','',10);
	$output .= $this->fpdf->Cell('',10,"Name: ".$app_data['name'],0,0,'C');
	$output .= $this->fpdf->Ln(6);
        <---- edited for brevity ---->
	ob_clean();
	return $output;
}

Now that we’ve got the timesheet ready let’s create a function that determines the timesheet type.

function createPdf($app_data, $type, $begin, $end, $section=null)
	{

There are a few things we want to accomplish with this function.

  • include and instantiate the fpdf library
    include 'includes/fpdf.php';
    $this->fpdf = new fpdfHelper();
  • Call the FPDF page numbering function and create the first page:
    $this->fpdf->AliasNbPages();
    $this->fpdf->AddPage();
  • Set the page title:
    $this->fpdf->setTitle('Complete Payroll Report');
  • check to see if the type is single and if so, generate the timesheet:
    if($type == 'single')
    {
    	//set the begin period and end period dates
    	$app_data['begin_period'] = $begin;
    	$app_data['end_period'] = $end;
    	//create the timesheet
    	$data = $this->outputPdf($app_data);
    	//get the current date so we can put it in the file name of the timesheet
    	$date = date("m_d_Y");
    	//create the file name with the employee's name and the date
    	$name = $app_data['name']."_".$date.".pdf";
    	//send it to the browser
    	echo $this->fpdf->fpdfOutput($name, $destination = 'd');
    }
  • if the type isn’t single check to see if it is multiple and if so, generate the timesheets:
    elseif($type == 'multiple')
    {
    	//get the current date to use in the file name
    	$date = date("m_d_Y");
    	//do stuff to get all apps in pdf
    	$data = null; //create variable to hold the timesheets as we generate them
    	//loop through the data and create a timesheet for each employee
    	foreach ($app_data as $app)
    	{
    		//set up begin and end date variables for the pay period
    		$app['begin_period'] = $begin;
    		$app['end_period'] = $end;
    		//generate timesheet for the current employee and store it in the data variable
    		$data .= $this->outputPdf($app);
    		//create a new page
    		$data .= $this->fpdf->AddPage();
    	}
    	//create the file name and include the name of the department (section) in it
    	$name = "payroll_report_".$section."_".$date.".pdf";
    	//send it to the browser
    	echo $this->fpdf->fpdfOutput($name, $destination = 'd');
    }
    }

So all together it looks like this:

function createPdf($app_data, $type, $begin, $end, $section=null)
{
	include 'includes/fpdf.php';
	$this->fpdf = new fpdfHelper();

	$this->fpdf->AliasNbPages();
	$this->fpdf->AddPage();

	$this->fpdf->setTitle('Complete Payroll Report');

	if($type == 'single')
	{
		//set the begin period and end period dates
		$app_data['begin_period'] = $begin;
		$app_data['end_period'] = $end;
		//create the timesheet
		$data = $this->outputPdf($app_data);
		//get the current date so we can put it in the file name of the timesheet
		$date = date("m_d_Y");
		//create the file name with the employee's name and the date
		$name = $app_data['name']."_".$date.".pdf";
		//send it to the browser
		echo $this->fpdf->fpdfOutput($name, $destination = 'd');
	}
	elseif($type == 'multiple')
	{
		//get the current date to use in the file name
		$date = date("m_d_Y");
		//do stuff to get all apps in pdf
		$data = null; //create variable to hold the timesheets as we generate them
		//loop through the data and create a timesheet for each employee
		foreach ($app_data as $app)
		{
			//set up begin and end date variables for the pay period
			$app['begin_period'] = $begin;
			$app['end_period'] = $end;
			//generate timesheet for the current employee and store it in the data variable
			$data .= $this->outputPdf($app);
			//create a new page
			$data .= $this->fpdf->AddPage();
		}
		//create the file name and include the name of the department (section) in it
		$name = "payroll_report_".$section."_".$date.".pdf";
		//send it to the browser
		echo $this->fpdf->fpdfOutput($name, $destination = 'd');
	}
}

© Copyright 2009 – 2010 Randy Dustin

Hosted by A Small Orange