หัวกระดาษคือส่วนที่จะถูกพิมพ์ออกมาโดยอัตโนมัติ ทุกๆครั้งที่มีหน้าใหม่เกิดขึ้น โดยปกติแล้วเราอาจจะใช้พิมพ์ที่อยู่บริษัท หรือไม่ก็ตราบริษัท หรือไม่ก็เป็นหมายเลขหน้า เป็นต้น
สำหรับ FPDF นั้นคำสั่งที่ใช้สำหรับกำหนดหัวกระดาษ ก็คือคำสั่ง Header() ซึ่งคำสั่งนี้จะถูกเรียกใช้อัตโนมัติเมื่อเกิดหน้าเอกสารใหม่ หรือจะพูดเอาง่ายก็กล่าวได้ว่า เมื่อใดที่เกิดการเรียกใช้คำสั่ง AddPage() (ไม่ว่าจะเกิดจากเราเขียนโค้ดเอง หรือว่าเกิดจากการแบ่งหน้าอัตโนมัติ) มันจะไปเรียกคำสั่ง Header() ขึ้นมาทำงานต่อจากมันด้วยอัตโนมัิติ
คำสั่ง Header() นี้ไม่สามารถเรียกใช้ได้โดยตรง (อย่างที่กล่าวไปนั่นแหละ ว่ามันจะเรียกใช้อัตโนมัติ) และในตัว FPDF เองเขาเขียนไว้แค่คำสั่ง (เมธอด) เปล่าๆ
ถ้าท่านต้องการจะตั้งค่าหัวกระดาษท่านจะต้องทำการ สืบทอดคลาส FPDF แล้ว Override คำสั่ง (เมธอด) Header()
เรามาดูวิธีการ
<?php require('fpdf.php'); //ทำการสืบทอดคลาส FPDF ให้เป็นคลาสใหม่ class PDF extends FPDF { //Override คำสั่ง (เมธอด) Header function Header(){ //ใช้ตัวอักษร Arial ตัวเอียง ขนาด 5 $this->SetFont('Arial','I',5); //พิมพ์ตัวหนังสือตัวเอียงๆ ที่ตำแหน่งเยื้องขอบกระดาษซ้าย 5หน่วย ขอบกระดาษบน 5หน่วย $this->Text(5,5,'Created by select2web.com' ); //ปัดบรรทัด กำหนดความกว้างของบรรทัด 20หน่วย $this->Ln(20); } } //เรียกใช้งาน เราจะเรียกใช้คลาสใหม่ของเราแทน $pdf=new PDF(); $pdf->AddPage(); $pdf->SetFont('Arial','',12); for( $i=0;$i<20;$i++ ){ $pdf->Cell(0,10,'select2web #'.$i); $pdf->Ln(20); } $pdf->Output(); ?> |
ถ้าท่านดูที่ Live Demo ท่านจะเห็นว่าเมื่อข้อความเกินหน้ากระดาษ ตัว FPDF จะเรียกใช้คำสั่ง AddPage เพิ่มหน้ากระดาษใหม่เข้าไปให้เราโดยอัตโนมัติ ช่างเป็นอะไรที่น่ารักเสียจริงเชียว
ในบทนี้ท่านได้เห็น OOP เป็นของแถมติดตัวเล็กน้อย สำหรับคนที่ไม่คุ้นเคยกับ OOP ผมขอกล่าวเสริมไว้พอเป็นประมาณ
extends : เป็นคีย์เวิร์ดที่ใช้ในการสืบทอดคลาส การสืบทอดคลาสให้คิดง่ายๆว่า มันก็คือการก้อปปี้คลาสเดิมมาเปลี่ยนชื่อเสียใหม่ นั่นเอง เพียงแต่ว่าการก้อปปี้นั้นจะก้อปปี้แบบอ้างอิง เมื่อคลาสเดิมเพิ่มเติมอะไรใหม่ๆเข้าไป คลาสที่เราสืบทอดมาจากคลาสเดิม จะได้รับสิ่งใหม่ๆไปด้วย เย้… แต่ถ้าเราเพิ่มอะไรๆใหม่กิ๊กๆ เข้าไปในคลาสใหม่ มันจะไม่ส่งผลไปถึงคลาสเดิม
ด้วยพฤติกรรมอย่างเนี้ย พี่หรั่งมันจึง เอาเรื่องของสายเลือด มาปนกับการเขียนโปรแกรมแนวใหม่ OOP คลาสปู่ คลาสแม่ คลาสลูก แล้วก็ยกตัวอย่างว่า จำไว้นะเธอ ถ้าแม่เป็นไวรัสตับอักเสบ ลูกก็จะเป็นด้วย แต่ถ้าลูกดันเป็นเอดส์ขึ้นมาภายหลัง โรคร้ายจะไม่ส่งผลกระทบถึงแม่ นะจ๊ะ…
minddezign says:
08/10/2552 at 08/10/2552
OOP คลาสปู่ คลาสแม่ คลาสลูก แล้วก็ยกตัวอย่างว่า จำไว้นะเธอ ถ้าแม่เป็นไวรัสตับอักเสบ ลูกก็จะเป็นด้วย แต่ถ้าลูกดันเป็นเอดส์ขึ้นมาภายหลัง โรคร้ายจะไม่ส่งผลกระทบถึงแม่ นะจ๊ะ… ฮ่าๆ ช๊อบชอบ
peterXP says:
10/02/2553 at 10/02/2553
แจ่มครับพี่ ช่างเปรียบเทียบ และ tutorial ก็เจ๋งโคตร ง่ายๆ แต่ได้สาระ
ขอคาระวะท่าน ผู้เขียน 1 จอก
administrator says:
11/02/2553 at 11/02/2553
รับแซบ
KatMee says:
29/10/2554 at 29/10/2554
ขอบคุณมากกคร้าา
แต่ถ้าเราจะกำหนด keyword ของ header โดยดึงข้อมูลมาจาก Mysql ล่ะค่ะ จะทำยังไง
พอดีไม่ค่อยขนาดการใช้ class อ่ะค่ะ จากตัวอย่างเช่น
SetFont(‘Arial’,’I’,5);
//พิมพ์ตัวหนังสือตัวเอียงๆ ที่ตำแหน่งเยื้องขอบกระดาษซ้าย 5หน่วย ขอบกระดาษบน 5หน่วย
$this->Text(5,5,’Created by select2web.com’ ); // ตรงนี้เราจะเปลี่ยนให้แสดง ข้อมูลจาก sql อ่ะค่ะ
//ปัดบรรทัด กำหนดความกว้างของบรรทัด 20หน่วย
$this->Ln(20);
}
}
//เรียกใช้งาน เราจะเรียกใช้คลาสใหม่ของเราแทน
$pdf=new PDF();
$pdf->AddPage();
$pdf->SetFont(‘Arial’,”,12);
for( $i=0;$iCell(0,10,’select2web #’.$i);
$pdf->Ln(20);
}
$pdf->Output();
?>
จะทำได้ไหมคะ แล้วทำยังไงคะ
KatMee says:
29/10/2554 at 29/10/2554
อุ้ยยย code ไปไม่ครบ เอาใหม่ๆๆ
SetFont(‘Arial’,’I’,5);
//พิมพ์ตัวหนังสือตัวเอียงๆ ที่ตำแหน่งเยื้องขอบกระดาษซ้าย 5หน่วย ขอบกระดาษบน 5หน่วย
$this->Text(5,5,’Created by select2web.com’ ); // ตรงนี้เราจะเปลี่ยนให้แสดง ข้อมูลจาก sql อ่ะค่ะ
//ปัดบรรทัด กำหนดความกว้างของบรรทัด 20หน่วย
$this->Ln(20);
}
}
//เรียกใช้งาน เราจะเรียกใช้คลาสใหม่ของเราแทน
$pdf=new PDF();
$pdf->AddPage();
$pdf->SetFont(‘Arial’,”,12);
for( $i=0;$iCell(0,10,’select2web #’.$i);
$pdf->Ln(20);
}
$pdf->Output();
?>
KatMee says:
29/10/2554 at 29/10/2554
อ้าววว ไม่ครบอีกแล้วว ไม่เป็นไร เอาเป็นว่า สมมุติ
$DocID = $_REQUEST[“DocID”]; // $DocID คือค่า id ที่จะเอาไป Search ใน sql โดยเรารับค่าก่อนประกาศ class
แล้วเราจะส่งค่า $DocID ไปให้ Header() ยังไงอ่ะคะ มันทำได้หรือเปล่า แล้วเราต้องไปแก้อะไรที่ file fpdf.php ไหม ขอบคุณค่ะ
administrator says:
30/10/2554 at 30/10/2554
ก่อนอื่นขอทำความเข้าใจธรรมชาติของเฮดเดอร์ก่อน เฮดเดอร์ของเอกสารใดๆก็ตาม ถ้าขึ้นชื่อว่าเฮดเดอร์ มันจะต้องเหมือนๆกันหมด ในทุกๆหน้า
สิ่งที่ทำเป็นเฮดเดอร์มักจะเป็น โลโก้ ชื่อ ที่อยู่ เบอร์โทร บริษัท,ข้อความใดๆ ที่ใช้เหมือนกันหมดในทุกหน้าเอกสาร
สรุปได้ว่า เฮดเดอร์จะต้องเหมือนกันหมดในทุกหน้าเอกสาร จึงเป็นเฮดเดอร์ได้
ส่วนที่คอมเม้นท์ด้านบนต้องการส่งพารามิเตอร์เข้าไปในเฮดเดอร์ เพื่อให้เฮดเดอร์มันออกมาไม่เหมือนกัน มันผิดธรรมชาติของเฮดเดอร์ และมันทำไม่ได้
ถ้าต้องการทำอย่างที่ว่า เราก็ไม่ทำเป็นเฮดเดอร์ ทำเพียงแค่ เมื่อสร้างเอกสารหน้าใหม่ขึ้นมา ก็พิมพ์ข้อความที่ต้องการให้มันอยู่ก่อนชาวบ้าน ออกมาก่อน ทีนี้จะสร้างเป็นฟังก์ชั่นขึ้นมา เวลาเรียกใช้ส่งพารามิเตอร์เข้าไปในฟังก์ชั่นก็ทำได้
KatMee says:
30/10/2554 at 30/10/2554
ขอบคุณมากค่ะ คือพอดีเราเก็บข้อมูลพวก โลโก้ ชื่อ ที่อยู่ เบอร์โทร บริษัท ไว้ในsql อ่ะค่ะ เพราะในโปรแกรมมีหลายบริษัท
ไม่เป็นไรค่ะ คงต้องทำแบบที่คุณ administrator บอก คือสร้างฟังก์ชั่นขึ้นใหม่ ขอบคุณมากค่ะ
administrator says:
02/11/2554 at 02/11/2554
ถ้าอย่างนั้นก็พอมีวิธีอยู่ครับ ถึงเราจะส่งพารามิเตอร์เข้าไปในฟังก์ชั่นไม่ได้ แต่เรายังสามารถประยุกต์ใช้ตัวแปร session เข้ามาช่วยได้ โดย
ก่อนจะสร้างหน้าเอกสาร PDF หน้าใหม่ เราก็เอาคีย์เวิร์ดใส่ตัวแปร SESSION ไว้ก่อน ทีนี้ในฟังก์ชั่น header เราก็เชื่อมต่อฐานข้อมูล โดยนำเอาตัวแปร SESSION ไปใช้ดึงข้อมูลออกจากฐานข้อมูล
คิดว่าวิธีไหนเขียนง่าย เอาวิธีนั้นเลยครับ อย่าเสียเวลาประดิษฐ์ฟังก์ชั่น ให้มันสวยหรู
KatMee says:
02/11/2554 at 02/11/2554
ค่ะ ตอนนี้เราใช้วิธีกำหนดจุด X ถ้าเกินจุดที่กำหนด ก้อสั่งให้มันขึ้นหน้าใหม่ แล้วเรียกฟังก์ชั่นที่ใช้แสดงข้อมูล Header ขึ้นค่ะ
kana says:
17/06/2557 at 17/06/2557
อยากทราบ การเขียนโปรแกรมเพื่อ Gen 2D barcode ด้วย Java library ค่ะ เค้าใช้กันยังไงอ่ะคะ T.T