Hướng dẫn sử dụng thư viện TCPDF để tạo file PDF online

Hiện nay, có rất nhiều ứng dụng web đưa ra các tài liệu văn bản dưới dạng hóa đơn, hợp đồng hoặc chỉ là một trang web dưới dạng PDF. Có một vài class PHP mà có thể dùng để tạo file PDF trực tuyến, và một trong số chúng là TCPDF. Bài hướng dẫn này sẽ chỉ cho bạn thấy làm thế nào để sử dụng TCPDF class khi tạo một hóa đơn đơn giản.

tcpdf

Tại sao lại là TCPDF mà không phải là một PDF class khác ?

TCPDF được dựa trên FPDF class, một dự án cơ bản được viết dựa trên PHP4. Sau một vài năm, TCPDF phát triển và có nhiều tính năng hơn FPDF and và được viết trên PHP5 (đương nhiên là cả trên PHP4). TCPDF vài bộ tài liệu khá tuyệt và đương nhiên là có cả ví dụ cho tất cả các công việc bạn có thể làm với PDF nữa, như: hỗ trợ WriteHTML và RTL, Multiple column, Javascript và Form, Bookmark(Table of Content), Multicell complex alignment, Barcodes, Set PDF viewer display preferences, EPS/AI vectorial images và nhiều cái nữa.

Zend Framework cũng có PDF class

Đúng vậy, kế hoạch đầu tiên đó là viết bài hướng dẫn này với Zend Framwork, nhưng sau khi viết được một vài dòng mã tôi nhận ra rằng PDF class bị thiếu mất một vài hàm quan trọng, như MultiCell, được sử dụng để bọc lấy nhiều hàng của một đoạn văn bản. MultiCell yêu cầu một vài hàm mà tôi đoán rằng nó là Zend_Pdf_Cell cách đây 2 năm và tôi không thể tìm được các nào làm việc với phiên bản core cho tới tận bây giờ. Tôi rất là thích Zend Framework nhưng không phải với việc tạo file PDF, PDF class của Zend có quá nhiều hạn chế. 😦

3. Bắt đầu

Bây giờ mình sẽ chỉ cho các bạn cách sử dụng tcpdf như nào: Ví dụ mình đưa ra ở đây là tạo file PDF gồm có logo(ở header), một vài dòng nội dung, một hộp thông tin và vài dòng nội dung ở cuối file (footer).

Trong mã nguồn chúng ta sẽ include thêm một vài file PHP, tiếp đến là tạo 1 class nhỏ được extend để tạo header,footer và một vài một vài phương thức để hỗ trợ cho việc tạo textbox (không làm thì là mặc định trong config nhé).

require_once('tcpdf/config/lang/eng.php');
require_once('tcpdf/tcpdf.php');

class MYPDF extends TCPDF {
	public function Header() {
		$this->setJPEGQuality(90);
		$this->Image('logo.png', 120, 10, 75, 0, 'PNG', 'http://www.finalwebsites.com');

	}
	public function Footer() {
		$this->SetY(-15);
		$this->SetFont(PDF_FONT_NAME_MAIN, 'I', 8);
		$this->Cell(0, 10, 'finalwebsites.com - PHP Script Resource, PHP classes and code for web developer', 0, false, 'C');
	}
	public function CreateTextBox($textval, $x = 0, $y, $width = 0, $height = 10, $fontsize = 10, $fontstyle = '', $align = 'L') {
		$this->SetXY($x+20, $y); // 20 = margin left
		$this->SetFont(PDF_FONT_NAME_MAIN, $fontstyle, $fontsize);
		$this->Cell($width, $height, $textval, 0, false, $align);
	}
}

Phương thức header chỉ chứa có duy nhất hai hàm, một là để cài đặt chất lượng hình ảnh của logo và hai là để xác định vị trí của logo (kèm theo hyperlink) theo như đoạn mã ta viết ở trên thì logo sẽ nằm ở (x=120, Y=10, z=75).

Tất cả các tọa độ được đo bằng Millimet và chiều cao cho hình ảnh được tính dựa theo đoạn mã. Bên trong phương thức footer chúng ta đang sử dụng một số phương thức TCPDF cơ bản để xác định vị trí , phông chữ / kiểu và các cột với đoạn văn bản ở footer. Phương thức thứ ba ( CreateTextBox ) chỉ là một nhóm các chức năng TCPDF giúp cho dễ dàng hơn để đặt một số hộp văn bản vào tài liệu PDF . Lưu ý, các PDF_FONT_NAME_MAIN biến hằng được định nghĩa bên trong file TCPDF config, nằm bên trong thư mục config.

Tiêu đề

Đoạn mã dưới đây sẽ tạo ra một đối tượng TCPDF với các giá trị mặc định, PDF metadata sẽ lấy các giá trị đã được định nghĩa sẵn, một trang mới được tạo ra và tiêu đề sẽ chứa các thông tin được tạo ra bằng một phương thức do chúng ta định nghĩa.

// create a PDF object
$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// set document (meta) information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Olaf Lederer');
$pdf->SetTitle('TCPDF Example');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, tutorial');

// add a page
$pdf->AddPage();

// create address box
$pdf->CreateTextBox('Customer name Inc.', 0, 55, 80, 10, 10, 'B');
$pdf->CreateTextBox('Mr. Tom Cat', 0, 60, 80, 10, 10);
$pdf->CreateTextBox('Street address', 0, 65, 80, 10, 10);
$pdf->CreateTextBox('Zip, city name', 0, 70, 80, 10, 10);

// invoice title / number
$pdf->CreateTextBox('Invoice #201012345', 0, 90, 120, 20, 16);

// date, order ref
$pdf->CreateTextBox('Date: '.date('Y-m-d'), 0, 100, 0, 10, 10, '', 'R');
$pdf->CreateTextBox('Order ref.: #6765765', 0, 105, 0, 10, 10, '', 'R');

Các dòng nội dung

Bây giờ chúng ta sẽ tạo ra các thông tin về sản phầm mà chúng ta muốn in vào hóa đơn PDF. Đầu tiên chúng ta tạo một vài tiêu đề và sau đó dùng một vòng lặp để đưa ra các thông tin được lưu trong mảng $order.

// list headers
$pdf->CreateTextBox('Quantity', 0, 120, 20, 10, 10, 'B', 'C');
$pdf->CreateTextBox('Product or service', 20, 120, 90, 10, 10, 'B');
$pdf->CreateTextBox('Price', 110, 120, 30, 10, 10, 'B', 'R');
$pdf->CreateTextBox('Amount', 140, 120, 30, 10, 10, 'B', 'R');

$pdf->Line(20, 129, 195, 129);

// some example data
$orders[] = array('quant' => 5, 'descr' => '.com domain registration', 'price' => 9.95);
$orders[] = array('quant' => 3, 'descr' => '.net domain name renewal', 'price' => 11.95);
$orders[] = array('quant' => 1, 'descr' => 'SSL certificate 256-Byte encryption', 'price' => 99.95);
$orders[] = array('quant' => 1, 'descr' => '25GB VPS Hosting, 200GB Bandwidth', 'price' => 19.95);

$currY = 128;
$total = 0;
foreach ($orders as $row) {
	$pdf->CreateTextBox($row['quant'], 0, $currY, 20, 10, 10, '', 'C');
	$pdf->CreateTextBox($row['descr'], 20, $currY, 90, 10, 10, '');
	$pdf->CreateTextBox('$'.$row['price'], 110, $currY, 30, 10, 10, '', 'R');
	$amount = $row['quant']*$row['price'];
	$pdf->CreateTextBox('$'.$amount, 140, $currY, 30, 10, 10, '', 'R');
	$currY = $currY+5;
	$total = $total+$amount;
}
$pdf->Line(20, $currY+4, 195, $currY+4);

Sau header và sau danh sách các sản phẩm của hóa đơn ta tạo 1 dòng trống. Trong vòng lặp, chúng ta sử dụng biến $currY để tăng giá trị của Y thêm 5 ứng với mỗi một dòng mới. Mỗi dòng được tính toán bằng PHP và tăng dần theo mỗi vòng lặp.

Chân trang và thông tin

Đầu tiên, chúng ta tạo tất cả các hàng sử dụng các giá trị ở biến $total mà đã được tạo từ lúc trước. Sau đó chúng ta có MultiCell, thứ mà có thể giữ lại các điều khoản hoặc chỉ là một vài thông tin. Bạn có thể sử dụng mã HTML ở cell này cũng khá tốt, ví dụ như cho liên kết đến Trang các điều khoản và điều kiện của bạn.

// output the total row
$pdf->CreateTextBox('Total', 20, $currY+5, 135, 10, 10, 'B', 'R');
$pdf->CreateTextBox('$'.number_format($total, 2, '.', ''), 140, $currY+5, 30, 10, 10, 'B', 'R');

// some payment instructions or information
$pdf->setXY(20, $currY+30);
$pdf->SetFont(PDF_FONT_NAME_MAIN, '', 10);
$pdf->MultiCell(175, 10, '<em>Lorem ipsum dolor sit amet, consectetur adipiscing elit</em>.
Vestibulum sagittis venenatis urna, in pellentesque ipsum pulvinar eu. In nec <a href="http://www.google.com/">nulla libero</a>, eu sagittis diam. Aenean egestas pharetra urna, et tristique metus egestas nec. Aliquam erat volutpat. Fusce pretium dapibus tellus.', 0, 'L', 0, 1, '', '', true, null, true);

//Close and output PDF document
$pdf->Output('test.pdf', 'F');

Cuối cùng chúng ta gọi đến phương thức để đưa ra file PDF dưới tên gọi là test.pdf và gửi file này đến cho trình duyệt

Đây chỉ là 1 ví dụ để cho các bạn cách đơn giản để tạo ra một file PDF online. Trước khi các bạn bắt tay vào làm, bạn hãy xem các ví dụ TCPDF có sẵn trong thư viện để biết các sử dụng các hàm và các phương thức có sẵn một cách hợp lý.

Nguồn : http://www.web-development-blog.com/archives/create-pdf-documents-online-with-tcpdf/