การพิมพ์ภาษาไทยลงไปในเอกสาร pdf ด้วย fpdf นั้น จำเป็นจะต้องสร้างฟอนต์ภาษาไทยขึ้นมาก่อน ซึ่งก็เอาฟอนต์จากวินโดวนี่แหละครับไปผ่านกระบวนการบางอย่าง ในเว็บเขาแนะนำวิธีสร้างไว้อย่างละเอียด
แต่อย่าเพิ่งตกใจนะครับ ผมมีฟอนต์ให้ท่านดาวน์โหลดไปใช้ได้เลย ผมได้รับมาจากน้องเด่นแห่ง minddesizn.com ต้องขอขอบคุณไว้ ณ ตรงนี้ครับ
ไฟล์ที่ท่านดาวน์โหลดไปประกอบด้วยฟอนต์ angsana,cordia และอีกหลายฟอนต์ครับ ผมไม่ค่อยรู้จักเท่าไร เพราะใช้แต่ angsana ยันเต มี angsana ผมก็สบายใจแล้ว ท่านดาวน์โหลดไปแล้วแตกซิปออก ลองเอานะครับว่ามีฟอนต์อะไรบ้าง จากชื่อน่าจะเดาไม่ยาก หรือถ้าไม่รู้จักก็ลองใช้ครับ ถ้าสวยชอบใจ ก็ใช้ต่อ ถ้าไม่ถูกใจก็อย่าไปใช้ Try it by yourself
การเขียนโค้ดจะมีกระบวนการดังนี้
1. ต้องตั้งชื่อตัวแปร CONSTANT เพื่อชี้พาธที่อยู่ฟอนต์
2. เพิ่มฟอนต์เข้าไปใน fpdf
3. เรียกใช้
ดูโค้ดกันก่อนครับ ตอนท้ายผมจะอธิบายคำสั่งที่ใช้
<?php define('FPDF_FONTPATH','fonts/'); require('fpdf.php'); $pdf=new FPDF(); // เพิ่มฟอนต์ภาษาไทยเข้ามา ตัวธรรมดา กำหนด ชื่อ เป็น angsana $pdf->AddFont('angsana','','angsa.php'); // เพิ่มฟอนต์ภาษาไทยเข้ามา ตัวหนา กำหนด ชื่อ เป็น angsana $pdf->AddFont('angsana','B','angsab.php'); // เพิ่มฟอนต์ภาษาไทยเข้ามา ตัวหนา กำหนด ชื่อ เป็น angsana $pdf->AddFont('angsana','I','angsai.php'); // เพิ่มฟอนต์ภาษาไทยเข้ามา ตัวหนา กำหนด ชื่อ เป็น angsana $pdf->AddFont('angsana','BI','angsaz.php'); //สร้างหน้าเอกสาร $pdf->AddPage(); // กำหนดฟอนต์ที่จะใช้ อังสนา ตัวธรรมดา ขนาด 12 $pdf->SetFont('angsana','',12); // พิมพ์ข้อความลงเอกสาร $pdf->setXY( 10, 10 ); $pdf->MultiCell( 0 , 0 , iconv( 'UTF-8','cp874' , 'อังสนา ตัวธรรมดา ขนาด 12' ) ); $pdf->SetFont('angsana','B',16); $pdf->setXY( 10, 20 ); $pdf->MultiCell( 0 , 0 , iconv( 'UTF-8','cp874' , 'อังสนา ตัวหนา ขนาด 16' ) ); $pdf->SetFont('angsana','I',24); $pdf->setXY( 10, 30 ); $pdf->MultiCell( 0 , 0 , iconv( 'UTF-8','cp874' , 'อังสนา ตัวเอียง ขนาด 24' ) ); $pdf->SetFont('angsana','BI',32); $pdf->setXY( 10, 40 ); $pdf->MultiCell( 0 , 0 , iconv( 'UTF-8','cp874' , 'อังสนา ตัวหนาเอียง ขนาด 32' ) ); $pdf->Output(); ?> |
fpdf จะใช้ตัวแปร constant ชื่อ FPDF_FONTPATH เป็นตัวชี้ที่อยู่ฟอนต์ จำเป็นจะต้องประกาศและกำหนดพาธให้ถูกต้อง ปิดท้ายด้วยเครื่องหมาย slash( / )
define('FPDF_FONTPATH','fonts/'); |
AddFont(string family [, string style [, string file]])
คำอธิบาย
สำหรับเพิ่มฟอนต์ที่ต้องการใช้งานในเอกสาร ท่านอาจจะงงๆว่า เรากำหนดได้เองเลยเหรอให้มันหนามันเอียง เปล่าหรอก พารามิเตอร์ตัวที่ 2 นั้นเป็นเหมือน ตัวอธิบายว่า ไฟล์ ในพารามิเตอร์ตัวที่ 3 นั้นเป็นฟอนต์ลักษณะไหน มันจะสัมพันธ์ไปถึงคำสั่ง SetFont ลองดูโค้ดแล้วนั่งคิดสักชั่วอึดใจประมาณธูปไหม้หมดดอก ท่านก็จะเข้าใจ
พารามิเตอร์ตัวที่ 3 เป็นชื่อไฟล์ที่ลงท้ายด้วย .php ถ้าท่านเปิดโฟลเดอร์ฟอนต์ที่ดาวน์โหลดไปตอนต้นบทความนี้ ท่านจะเห็น angsa.php (ตัวปกติ) angsab.php (ตัวหนา ลงท้ายด้วย b) angsai.php (ตัวเอียง ลงท้ายด้วย i) angsaz.php (ตัวหนาเอียง ลงท้ายด้วย z) และฟ้อนต์ชื่ออื่นในลักษณะนี้ ให้จำไว้ว่า ถ้าลงท้ายด้วย b มันเป็นฟอนต์ตัวหนา ลงท้ายด้วย i เป็นฟอนต์ตัวเอียง ลงท้ายด้วย z เป็นฟอนต์ตัวหนาเอียง
พารามิเตอร์
family : กำหนดชื่อ เราจะได้เรียกใช้ภายหลังง่ายๆ angsana ตัวปกติ ตัวหนา ตัวเอียง ตัวเอียงหนา จะใช้ชื่อ angsana เหมือนกัน
style : ลักษณะของฟอนต์
- ค่าที่เป็นไปได้คือ
- empty string – ตัวอักษรปกติ empty string ก็คือ ‘’ ไม่มีอะไรเลยในฟันหนู
- B: ตัวหนา
- I: ตัวเอียง
- BI หรือ IB: ตัวหนาเอียง
file : ไฟล์ฟอนต์ ถ้าพารามิเตอร์แรกท่านใช้ angsana พารามิเตอร์ตัวที่ 2 เป็นตัวหนา พารามิเตอร์ตัวนี้ก็ต้องชี้ไปที่ไฟล์ angsab.php
SetFont(string family [, string style [, float size]])
คำอธิบาย
กำหนดฟอนต์ที่จะใช้ เมื่อเราใช้คำสั่งนี้ครั้งหนึ่งแล้ว เวลาเราใช้คำสั่งพิมพ์ข้อความลงในเอกสาร มันก็จะใช้ฟอนต์นี้ ไปจนกว่าจะเจอคำสั่งนี้อีกครั้ง
พารามิเตอร์
family : ชื่อฟอนต์ที่ใช้คำสั่ง AddFont กำหนดไว้
style : ลักษณะของฟอนต์
- ค่าที่เป็นไปได้คือ
- empty string – ตัวอักษรปกติ
- B: ตัวหนา
- I: ตัวเอียง
- BI หรือ IB: ตัวหนาเอียง
size : ขนาดฟอนต์ที่จะพิมพ์ลงในเอกสาร
คำสั่ง AddFont กับ SetFont นั้นจะใช้งานควบคู่กัน และสัมพันธ์กันอยู่ ลองดูโค้ดด้านบนและหลับตาจินตนการดีๆ ก็จะเข้าใจ
fpdf นั้นมีข้อเสียเล็กๆอยู่ข้อหนึ่งคือ ยังไม่สนับสนุน utf-8 แต่ก็มีทางออกโดยใช้คำสั่ง iconv แปลงเอา ถึงจะมีความไม่สะดวกเล็กๆอยู่บ้าง แต่ผมเชื่อว่าสิ่งที่ได้จากการใช้ fpdf นั้นคุ้มครับ ยิ่งเมื่อนึกถึงความง่ายในการใช้งานแล้ว มันกลบความไม่สะดวกเล็กๆนี้ไปเลย
$pdf->MultiCell( 0 , 0 , iconv( 'UTF-8','cp874' , 'อังสนา ตัวหนาเอียง ขนาด 32' ) ); |
chanin says:
20/06/2553 at 20/06/2553
ทดลองเอาโค้ด มาลองดู มันขึ้น เป็น
?????? ????????? ???? 12
?????? ?????? ???? 16
?????? ???????? ???? 24
?????? ??????????? ???? 32
อย่างนี้อ่ะครับ
aontong says:
05/07/2553 at 05/07/2553
ขอบคุณเจ้าของบทความมากครับ
อ่านแล้วเข้าใจง่ายมากเลยครับ สำหรับคนที่เพิ่งเริ่มต้น
ถ้าประเทศไทยมีคนแบบคุณเยอะๆคงจะดี ^^
คมสันต์ says:
16/09/2553 at 16/09/2553
ไม่รู้ใครเป็นเหมือนผมไหมครับ ทดสอบตามตัวอย่างอาจารย์แล้ว มันเป็นภาษาต่างดาว แต่พอผมถอดฟังก์ชั่น iconv ออกแล้ว ใช้ได้เลย ผมทดสอบบน Appserv 5.9 windows 7 ครับ
administrator says:
16/09/2553 at 16/09/2553
ในกรณีที่ดึงข้อมูลออกมาจากฐานข้อมูลที่ไม่ได้ใช้ utf-8 ก็ไม่จำเป็นต้องใช้ฟังก์ชั่น iconv ครับ
หรือในกรณีที่ไม่ได้ใช้ไฟล์ในรูปแบบ utf-8 ก็ไม่จำเป็นเช่นกันครับ
เรื่องของเรื่องก็คือตัว fpdf ไม่สนับสนุน utf-8 และปัจจุบันผู้พัฒนาเว็บก็มักจะใช้กันแต่ utf-8 กันเกือบหมดแล้ว ในตัวอย่างผมจึงใช้ฟังก์ชั่น iconv แปลงชุดอักขระ
iconv ใช้สำหรับแปลงชุดอักขระจากฟอร์แมตหนึ่งไปเป็นอีกฟอร์แมตหนึ่ง
เมื่อก่อนเราใช้กันแต่ tis-620 หรือ windows-874 แต่ปัจจุบันเรานิยมใช้ utf-8
ปฐมพงษ์ says:
12/11/2553 at 12/11/2553
ในกรณีที่ดึงข้อมูลออกมาจากฐานข้อมูลที่เป็น utf-8 มีวิธีแปลงจาก utf-8 > cp874 ยังไงเหรอคับ
administrator says:
12/11/2553 at 12/11/2553
วิธีการอ่านบทความในเรื่องที่เราไม่เคยรู้ เราจะต้องอ่านแล้วก็ลองทำ เวลาอ่านก็ต้องอ่านให้หมดทั้งบทความ และคอมเม้นท์
อ่านๆๆ แล้วลองทำ หลังลองทำแล้วถ้าติดปัญหาก็อ่านบทความใหม่อีกสักครั้ง เพื่อดูว่าเราตกหล่นตรงไหนบ้าง
ถ้าคิดว่าทำตามบทความทุกอย่างแล้ว ยังติดปัญหาอยู่ ค่อยมาโพสต์ถาม
ตอนถามถ้าเป็นไปได้ ให้เขียนแจ้งว่า ตัวเองใช้ระบบปฎิบัติการอะไร php เวอร์ชั่นไหน ฐานข้อมูลยังไง เท่าที่จะชี้แจงได้
แนวทางนี้เป็นแนวทางปฎิบัติที่ผมเชื่อว่าจะเกิดประโยชน์ต่อพัฒนาการการเขียนโปรแกรม
คุณปฐมพงษ์ลองทำตามคำแนะนำผมดูครับ จะดีต่อตัวท่านเองแน่นอน ผมเชื่ออย่างนั้น
student says:
19/11/2553 at 19/11/2553
ปิดเมนู save ทำไงครับตรงด้านบนอ่ะครับ
administrator says:
19/11/2553 at 19/11/2553
เมนู Save ตรงไหนครับ
ano says:
14/12/2553 at 14/12/2553
อยากขอบคุณมากกกกกกเลย
บทความของคุณมีประโยชน์มาก
อยากขอบคุณคุณที่สละเวลามาเขียนให้ความรู้คนอื่นๆนะคะ….^^
uchot's says:
15/12/2553 at 15/12/2553
ขอบคุณมากครับ ช่วยได้มากเลยครับ เสียเวลากับ ezpdf ซะหลายวัน ขอบคุณอีกทีครับ
แก้ว says:
24/02/2554 at 24/02/2554
ติดปัญหานิดหน่อยคะพอดีทำตามแบบที่ได้บอกไว้คะแต่ตัวหนังสือไม่ออกมาเลยเป็นหน้า pdf ขาวๆ พอได้อ่านจากคอมเม้นท์ที่ได้คุยกัน ถอดฟังก์ชั่น iconv ออก ออกแต่คำว่า
UTF-8 แต่ละอันไล่ตามตัวอักษรคะ แต่คำว่า อังสนา ตัวหนาเอียง ขนาด ต่างๆไม่แสดงเป็นเพราะอะไรคะ
administrator says:
24/02/2554 at 24/02/2554
ลองตรวจสอบว่ามีฟอนต์ที่เรียกใช้ในโฟลเดอร์ fonts แล้วหรือยัง
แก้ว says:
25/02/2554 at 25/02/2554
ตรวจสอบแล้วคะมี
เทพ says:
23/03/2554 at 23/03/2554
ผมกำลังพัฒนาเว็บไซต์เพื่อใช้ในการเก็บข้อมูลระบบดูแลช่วยเหลือนักเรียนลงฐานข้อมูล ผมถามปัญหาเลยนะครับ
ผมจะสร้างเอกสารเป็น PDF ดึงจากฐานข้อมูลออกมา ตอนนี้ผมเจอกะทู้นี้ซึ้งก็เจอปัญหาเดียวกันคือไม่รับภาษาไทย ผมลองทำตามครับ ผลมันออกมาฟ้องแบบนี้ครับ
จากโค้ดที่อาจารย์ให้ ผมเซฟชื่อ setthai.php แต่ระบบไปฟ้องที่ตัว fpdf.php ผมก็เลยไปต่อไม่ถูกเลยครับ ขอรบกวนถามช่วยตอบด้วยครับกำลังจะทำรายงานข้อมูลเสนอผู้บริหารแบบเท่ ๆ หน่อย ขอบคุณครับ
Warning: FPDF::include(fonts/angsa.php) [fpdf.include]: failed to open stream: No such file or directory in C:\AppServ\www\pdf\fpdf.php on line 467
Warning: FPDF::include() [function.include]: Failed opening ‘fonts/angsa.php’ for inclusion (include_path=’.;C:\php5\pear’) in C:\AppServ\www\pdf\fpdf.php on line 467
FPDF error: Could not include font definition file
administrator says:
24/03/2554 at 24/03/2554
มันฟ้องว่า failed to open stream: No such file or directory แปลว่าไม่สามารถเปิดเปิดไฟล์ อันเนื่องมาจากอาจจะไม่มีไฟล์ที่ระบุหรือโฟลเดอร์ที่ระบุไว้ include(fonts/angsa.php)
ในโฟลเดอร์ fonts ไม่มีไฟล์ angsa.php ครับ ไม่ทราบว่าได้ดาวน์โหลดฟ้อนต์ตามลิ้งก์ที่ผมให้ไว้ในบทความ ไปไว้ในโฟลเดอร์ fonts หรือยังครับ
อนุพงษ์ says:
19/10/2554 at 19/10/2554
เปิดดูใน Demo แล้วเห็นเป็นหน้าว่างๆอ่ะครับ เอาไปลองทดสอบดูก็เป็นหน้าว่างๆครับ ไม่รู้เป็นเพราะอะไรครับ ทดสอบโดย firefox
GIGAZAA says:
13/04/2555 at 13/04/2555
มี่ไม่แสดงผล การอ้างอิงตำแหน่งผิดครับ แก้ตามนี้ ผมก็เป็น
define(‘FPDF_FONTPATH’,’fonts/’);
เป็น
define(‘FPDF_FONTPATH’,’font/’);
diawcpe says:
22/09/2555 at 22/09/2555
Warning: FPDF::include(fonts/angsa.php) [fpdf.include]: failed to open stream: No such file or directory in C:\AppServ\www\pdf\fpdf.php on line 467
Warning: FPDF::include() [function.include]: Failed opening ‘fonts/angsa.php’ for inclusion (include_path=’.;C:\php5\pear’) in C:\AppServ\www\pdf\fpdf.php on line 467
FPDF error: Could not include font definition file
เืผื่อท่านอื่่นมาอ่านแล้วติดตรงนี้ ตอนแรกผมก็เป็น ก็งมหาอยู่พักนึง
ก็ไปใช้ nodepad++ เปิด แล้ว encode เป็น utf-8 without BOM ก็รันได้ครับปกติครับ
ส่วนเรื่องการอ้างถึงตำแหน่ง ก็ตามเรปบนครับ
ขอบคุณเจ้าของบทความด้วยครับ
aumaporn says:
09/11/2555 at 09/11/2555
ถ้าอยากได้ Bullet ล่ะค่ะ ต้องทำยังไง
รัญจวน เจมส์ says:
18/01/2556 at 18/01/2556
ขอบคุณครับ ทำภาษาไทยได้ซะที iconv
วัชรเมธน์ ชิษณุคุปต์ ศรีเนธิโรทัย says:
18/01/2556 at 18/01/2556
ด้วยความยินดี
momay says:
13/08/2557 at 13/08/2557
ดึงข้อมูลมากจากฐานข้อมูลแล้วภาษาไทยไม่แสดงอะคะ แก้ยังไงดีคะ
วัชรเมธน์ ชิษณุคุปต์ ศรีเนธิโรทัย says:
15/08/2557 at 15/08/2557
ในฐานข้อมูลคุณเก็บเป็น UTF-8 หรือเปล่า ถ้าใช่ตอนเอามาเขียนใน fpdf ต้องแปลงให้มันเป็น tis620 เพราะตัว fpdf ไม่สนับสนุน UTF-8 ครับ
Songwut Kanchanagosai says:
19/10/2557 at 19/10/2557
ปัญหาวรรณยุกต์ลอย ถูกแก้ในเว็บ fpdf.org โดย อาจารย์ วิทวัส พันธุมจินดา ม.บูรพา
http://fpdf.org/en/script/script87.php
เท่าที่ดูจาก Demo แล้ว ทำได้สมบูรณ์แบบเลยทีเดียว
แต่ผมลองโหลดมาลองใช้ดูแล้ว รันไม่ผ่านครับ
ไม่ทราบท่านอื่นเป็นไงบ้าง