ในตอนที่ 7 ผมได้แสดงวิธีการปรับแต่ง footer ไว้ นิดนึง ย้ำว่านิดนึงเพราะว่า default footer เขาทำไว้ดีอยู่แล้ว มีเส้น มีแสดงเลขหน้า เรียกว่าถ้าต้องการแบบ minimal ก็พอเพียง

แต่ถ้าหากว่าเราต้องการมากกว่าคำว่า minimal ก็ต้องนี่เลย custom footer มันซะ เพิ่มรูป เพิ่ม contact เพิ่มเส้น กำหนดตำแหน่งแสดงตัวเลขหน้า

ว่าแล้วก็ดูโค้ดก่อนแล้วค่อยอธิบาย

<?php

require_once('vendor/autoload.php');

// Extend the TCPDF class to create custom Header and Footer
class MYPDF extends TCPDF {

    //Page header
    public function Header() {
        // Logo
        $this->Image(dirname(__FILE__).'/images/mym.png', 175, 5, 18);
        // Set font
        $this->SetFont('helvetica', 'B', 20);
        // Title
        $this->SetX(145);
        $this->Cell(20, 0, 'Select2web inc', 0, false, 'R');

        $this->Ln();
        $this->SetFont('helvetica', '', 10);
        
        $this->SetX(145);
        $this->Cell(20, 0, 'Email : [email protected]', 0, false, 'R');

        $this->Ln();

        $this->SetX(145);
        $this->Cell(20, 0, 'Mobile : 0854354212', 0, false, 'R');
    }


    // Page footer
    public function Footer()
    {
        $this->SetY(-15);

        $this->Line(17, $this->GetY(), 193, $this->GetY());

        $this->Image(dirname(__FILE__).'/images/mym.png', 30, $this->GetY(), 10);
        
        // Set font
        $this->SetFont('helvetica', 'I', 8);

        // Contact
        $this->setX(40);
        $this->Cell(0, 10, 'www.select2web.com', 0, false, 'L');

        // Page number
        $this->Cell(0, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'R');
    }

}


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

// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Nicola Asuni');
$pdf->SetTitle('TCPDF Example 001');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, test, guide');


// set header
$pdf->setPrintHeader(true);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);

// Set footer
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

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


// Print text
$pdf->MultiCell(0, 0, '
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus sit amet auctor leo. Aliquam tincidunt felis sem. Pellentesque finibus elit non diam venenatis, eu dictum nulla vehicula. Aenean tristique, sapien hendrerit tincidunt fringilla, orci enim pharetra purus, eu molestie quam libero sit amet massa. Pellentesque cursus lorem sed diam euismod, a eleifend tortor rhoncus. Pellentesque maximus lorem id fringilla vestibulum. Donec at augue quis urna auctor faucibus. Mauris consequat aliquet vulputate. Maecenas fermentum nibh nec ante blandit luctus. Phasellus vestibulum neque nec dui posuere iaculis. Integer non aliquam justo. Etiam sit amet erat odio. Suspendisse tincidunt et arcu sit amet pellentesque. Quisque luctus scelerisque augue vitae fringilla. Pellentesque vel orci a arcu volutpat elementum.

Curabitur vehicula augue ac leo malesuada auctor. Donec nibh ligula, aliquet sit amet lacinia in, dictum et urna. Ut ullamcorper tortor vitae est hendrerit commodo. Aliquam aliquam est dui, a cursus mi vestibulum in. Pellentesque gravida sed neque feugiat aliquet. Nullam luctus lobortis enim non molestie. Suspendisse ultricies suscipit augue nec interdum. Fusce tellus ipsum, maximus et mollis ac, vulputate ut ipsum. Nam aliquam justo congue, lobortis odio eget, tincidunt felis. Nullam sagittis ornare elit, nec viverra est bibendum sed. Pellentesque molestie eu massa eget condimentum. Integer quis velit a ante sollicitudin sodales. Quisque placerat neque sed sodales aliquam.

Quisque et suscipit mauris. Proin accumsan magna vitae facilisis tincidunt. Maecenas at urna maximus, ultrices ipsum quis, vestibulum felis. Vivamus pellentesque, enim vitae ultrices venenatis, neque dolor volutpat ipsum, sed fringilla nisi ligula cursus dolor. Maecenas fringilla neque nec dui luctus, vulputate consequat nunc volutpat. Nulla lacinia malesuada rutrum. In purus risus, fermentum sed ultricies at, dapibus id quam. Integer id urna sit amet purus tincidunt blandit eu nec arcu. Nunc efficitur libero sit amet porttitor mattis.

Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris dui mauris, suscipit a lacinia id, tincidunt et lacus. Vestibulum laoreet in lorem eu tincidunt. Donec quis posuere dolor, non rutrum libero. Fusce vel enim dolor. Morbi rutrum eu massa et luctus. Fusce congue ipsum nunc, vel ornare ante lacinia a. Proin fermentum urna a nisi accumsan, et tincidunt diam pharetra. Curabitur imperdiet hendrerit dignissim.

Cras ac vestibulum metus, id faucibus dolor. Sed in justo fringilla, accumsan justo ac, tincidunt libero. Nunc ultrices sagittis enim a accumsan. Fusce faucibus iaculis nulla. Curabitur malesuada porta arcu, sed auctor ex. Donec sit amet molestie velit. Curabitur at maximus dui, eu tempor augue.

Donec bibendum placerat tempus. Phasellus ac consectetur nunc, ac mattis orci. Nunc iaculis vel mauris sed bibendum. Proin a lorem sem. Suspendisse nec neque eu velit auctor congue. Aenean in nibh eu nunc cursus imperdiet. Vestibulum posuere sapien et facilisis mollis. Nam ultricies varius odio, sed bibendum magna.

Maecenas mattis elementum arcu, sit amet suscipit magna mollis id. Praesent porta tempus placerat. Etiam nisi ex, malesuada eu molestie id, malesuada ac nibh. Vivamus ut turpis ac ligula euismod hendrerit. Cras malesuada quis mi eget elementum. Nullam non placerat elit. Duis vehicula metus mauris, mollis placerat felis volutpat vitae. Mauris id sapien in nibh pharetra tincidunt eu ut orci. Phasellus id elit tellus. Quisque pretium leo porta finibus blandit. Proin ut pharetra sem, vel luctus est.

Aliquam ac felis in ipsum facilisis interdum. In vitae orci metus. Donec fringilla porttitor ante id mollis. Etiam euismod pretium lectus vel semper. Sed mollis orci neque, non ornare massa egestas sit amet. Donec in cursus elit. In feugiat vitae massa et pharetra.

Fusce hendrerit, nibh non rutrum faucibus, odio velit egestas lorem, et dapibus odio arcu eget libero. Praesent ultrices eleifend justo. In quis bibendum leo, nec lacinia nunc. Suspendisse fermentum felis quis ante congue, quis faucibus mauris iaculis. Vestibulum condimentum lorem sed erat finibus faucibus. Phasellus mollis felis nec semper ornare. Ut vel molestie enim. Praesent posuere leo nisl, vitae tincidunt elit convallis blandit. Sed lorem sem, pretium eget sodales non, venenatis quis velit. Sed urna dolor, tincidunt ac egestas ut, ultricies in neque. Vestibulum a ipsum quam. In non turpis ac urna mollis sodales. Quisque pellentesque laoreet suscipit. Suspendisse potenti. Phasellus ut varius lectus.

Morbi ullamcorper leo sit amet augue volutpat, id porta mi dignissim. Maecenas eget nunc quam. Morbi maximus luctus quam quis tincidunt. Nunc diam eros, aliquet sit amet nulla et, imperdiet dapibus massa. Suspendisse tincidunt est sit amet neque semper molestie. Sed id vulputate arcu. Ut eleifend ac lorem eget tempor. Nulla vel facilisis sem, a porta sem. Nulla posuere tempor odio. Interdum et malesuada fames ac ante ipsum primis in faucibus. Mauris sollicitudin ipsum a nibh suscipit, sit amet convallis erat luctus. Suspendisse eget est vitae nisi tincidunt fermentum. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
');

// ---------------------------------------------------------

// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output('hello-tcpdf.pdf', 'I');
$pdf->Close();

หน้าตา footer ออกมาดังภาพ

โค้ดที่ทำให้เราได้ผลลัพธ์ตามภาพคือ


// Page footer
public function Footer()
{
    $this->SetY(-15);

    $this->Line(17, $this->GetY(), 193, $this->GetY());

    $this->Image(dirname(__FILE__).'/images/mym.png', 30, $this->GetY(), 10);
    
    // Set font
    $this->SetFont('helvetica', 'I', 8);

    // Contact
    $this->setX(40);
    $this->Cell(0, 10, 'www.select2web.com', 0, false, 'L');

    // Page number
    $this->Cell(0, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'R');
}

เมธอด Footer นี้จะทำการ override default footer เขียนเสียใหม่ตามที่ใจเราต้องการ

$this->SetY(-15);

คำสั่ง SetY(-15) เป็นการสั่งให้เลื่อนเคอเซอร์ไปตำแหน่งแกน Y ห่างจากขอบด้านล่างกระดาษ 15 มิลลิเมตร คือคำสั่งติดลบเนี่ยมันจะง่ายกว่าสั่งให้ขยับลงมาจากขอบด้านบนเท่านั้นเท่านี้ ซึ่งต้องค่อยขยับกันทีละน้อยกว่าจะลงตัว

$this->Line(17, $this->GetY(), 193, $this->GetY());

จากนั้นตีเส้นจากจุด XY 17,กับตำแหน่งของเคอเซอร์แกน Y เนื่องจากคำสั่งบนเราได้กำหนดให้เลื่อนเคอเซอร์แกน Y มารอไว้ที่ตำแหน่งที่ต้องการแล้ว เราก็เพียงแค่หยิบค่าตำแหน่งนั้นมาใช้งานด้วยคำสั่ง GetY()

ไปสิ้นสุดที่จุด XY 193,กับตำแหน่งของเคอเซอร์แกน Y

เราก็จะได้เส้นๆหนึ่งมา

$this->Image(dirname(__FILE__).'/images/mym.png', 30, $this->GetY(), 10);

เพิ่มรูปโลโกเข้าไปที่ตำแหน่งแกน X=30 แกน Y=GetY() ขนาดโลโก 10 พิกเซลล์

$this->SetFont('helvetica', 'I', 8);

ใช้ฟ้อนต์ helvatica ตัวเอียงขนาด 8 พ้อยต์

$this->setX(40);

ขยับเคอร์เซอร์แกน X จากซ้ายไป 40 มิลลิเมตร เพื่อทำกั้นหน้า 40 มิล.

$this->Cell(0, 10, 'www.select2web.com', 0, false, 'L');

พิมพ์คำว่า www.select2web.com ลงไป

$this->Cell(0, 10, 'Page '.$this->getAliasNumPage().'/'.$this->getAliasNbPages(), 0, false, 'R');

พิมพ์เลขหน้าปัจจุบัน ทับด้วย จำนวนหน้าทั้งหมด

คำสั่ง Cell เนี่ย
พารามิเตอร์ตัวที่ 1 จะบอกความกว้างของกล่องบรรจุข้อความ ถ้ากำหนดเป็น 0 แสดงว่าให้มันกว้างเท่ากับหน้ากระดาษ
พารามิเตอร์ตัวที่ 2 บอกความสูงของกล่องบรรจุข้อความ ถ้ากล่องสูงมาก ก็จะทำให้ตัวหนังสือที่ใส่อยู่ข้างในเลื่อนตำแหน่งไปมาก ลองเล่นดูครับ
พารามิเตอร์ตัวที่ 3 บอกว่าเอากรอบของกล่องไหม ถ้ากำหนดเป็น 1 หรือ true เราจะได้ข้อความพร้อมด้วยกรอบดำๆล้อมรอบ (เวลาสร้างตารางเขาจะกำหนดให้ตัวนี้เป็น true)
พารามิเตอร์ตัวที่ 4 บอกว่าหลังจากพิมพ์ข้อความเสร็จแล้วเนี่ย ให้เลื่อนเคอเซอร์ขึ้นบรรทัดใหม่ไหม ตรงนี้ค่อนข้างสำคัญครับ ถ้าเราบอกว่าไม่ต้องขึ้นบรรทัดใหม่ กล่องที่เราจะพิมพ์ถัดไป มันก็จะอยู่ตำแหน่งบรรทัดเดิม จะทับกับกล่องเดิม ถ้าเราต้องการพิมพ์ตัวหนังสือที่อันหนึ่งชิดซ้าย อันหนึ่งชิดขวา เราก็กำหนดว่าไม่ต้องขึ้นบรรทัดใหม่
พารามิเตอร์ตัวที่ 5 เป็นตัวบอกว่า ให้ตัวอักษรชิด L:ซ้าย, C:กลาง, R:ขวา, J:กระจาย

นอกจากพารามิเตอร์ 5 ตัวนี้แล้ว คำสั่ง Cell ยังมีพารามิเตอร์ให้กำหนดได้อีกหลายตัว ดูนี่

/**
	 * Prints a cell (rectangular area) with optional borders, background color and character string. The upper-left corner of the cell corresponds to the current position. The text can be aligned or centered. After the call, the current position moves to the right or to the next line. It is possible to put a link on the text.<br />
	 * If automatic page breaking is enabled and the cell goes beyond the limit, a page break is done before outputting.
	 * @param float $w Cell width. If 0, the cell extends up to the right margin.
	 * @param float $h Cell height. Default value: 0.
	 * @param string $txt String to print. Default value: empty string.
	 * @param mixed $border Indicates if borders must be drawn around the cell. The value can be a number:<ul><li>0: no border (default)</li><li>1: frame</li></ul> or a string containing some or all of the following characters (in any order):<ul><li>L: left</li><li>T: top</li><li>R: right</li><li>B: bottom</li></ul> or an array of line styles for each border group - for example: array('LTRB' => array('width' => 2, 'cap' => 'butt', 'join' => 'miter', 'dash' => 0, 'color' => array(0, 0, 0)))
	 * @param int $ln Indicates where the current position should go after the call. Possible values are:<ul><li>0: to the right (or left for RTL languages)</li><li>1: to the beginning of the next line</li><li>2: below</li></ul> Putting 1 is equivalent to putting 0 and calling Ln() just after. Default value: 0.
	 * @param string $align Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul>
	 * @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false).
	 * @param mixed $link URL or identifier returned by AddLink().
	 * @param int $stretch font stretch mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if text is larger than cell width</li><li>2 = forced horizontal scaling to fit cell width</li><li>3 = character spacing only if text is larger than cell width</li><li>4 = forced character spacing to fit cell width</li></ul> General font stretching and scaling values will be preserved when possible.
	 * @param boolean $ignore_min_height if true ignore automatic minimum height value.
	 * @param string $calign cell vertical alignment relative to the specified Y value. Possible values are:<ul><li>T : cell top</li><li>C : center</li><li>B : cell bottom</li><li>A : font top</li><li>L : font baseline</li><li>D : font bottom</li></ul>
	 * @param string $valign text vertical alignment inside the cell. Possible values are:<ul><li>T : top</li><li>C : center</li><li>B : bottom</li></ul>
	 * @public
	 * @since 1.0
	 * @see SetFont(), SetDrawColor(), SetFillColor(), SetTextColor(), SetLineWidth(), AddLink(), Ln(), MultiCell(), Write(), SetAutoPageBreak()
	 */
	public function Cell($w, $h=0, $txt='', $border=0, $ln=0, $align='', $fill=false, $link='', $stretch=0, $ignore_min_height=false, $calign='T', $valign='M')

ในบทถัดไป จะพูดถึงเรื่องอะไร ติดตามกันต่อครับ