
วันนี้มาถึงคำสั่งสุดท้ายในซีรี่ พิมพ์ข้อความลงในเอกสาร ของ fpdf เมื่อผมเริ่มซีรี่ด้วยคำสั่ง Text ซึ่งเป็นคำสั่งที่ง่ายๆที่สุดในบรรดา สี่พี่น้อง แล้วก็ตามมาด้วยคำสั่ง Write ซับซ้อนและมากความสามารถขึ้นมาอีกนิดนึง จนเมื่อวันก่อนลงเอยคำสั่ง Cell ซับซ้อนกว่าคำสั่ง Write อีก สามารถตีเส้นกรอบ และทำอย่างอื่นได้อีกหลายอย่าง แต่ดังที่ผมพูดไว้ในบทว่าด้วยเรื่อง Cell ว่าคำสั่งนี้จะไม่ปัดบรรทัดให้อัตโนมัติ เมื่อตัวอักษรยาวกว่ากรอบที่กำหนด
และแล้ววันที่โลกทั้งโลกรอคอยก็มาถึง ทูเดย์ ไอจะแนะนำวิธีการใช้งานคำสั่ง MultiCell ที่ทั้งพารามิเตอร์และการใช้งานเหมือนกันกับคำสั่ง Cell แต่เพิ่มความสามารถตัดขึ้นบรรทัดใหม่ให้ด้วย เมื่อความยาวของข้อความที่อยู่ในกรอบ ยาวเกินความกว้าง
มาดูกัน เหยาะซ้อส (source) ก่อนเป็นอันดับแรก แล้วค่อยเอาผักใส่ตามหลัง
<?php define('FPDF_FONTPATH','font/'); require('fpdf.php'); $pdf=new FPDF(); // เพิ่มฟ้อนต์ภาษาไทยเข้ามา ตัวธรรมดา กำหนด ชื่อ เป็น angsana $pdf->AddFont('angsana','','angsa.php'); //สร้างหน้าเอกสาร $pdf->AddPage(); // กำหนดฟ้อนต์ที่จะใช้ อังสนา ตัวธรรมดา ขนาด 14 $pdf->SetFont('angsana','',14); // พิมพ์ข้อความลงเอกสาร มีกรอบด้วย $pdf->MultiCell( 20 , 5 , iconv( 'UTF-8','cp874' , 'นี่คือข้อความที่ตั้งใจให้ยาวเลยความกว้างของกรอบเซลล์' ) ); $pdf->Output(); ?>
MultiCell(float w, float h, string txt [, mixed border [, string align [, boolean fill]]])
คำอธิบาย
สำหรับพิมพ์ข้อความลงในเอกสาร pdf
พารามิเตอร์
w : (ตัวเลข) ความกว้างของกล่องข้อความ ถ้าระบุเป็น 0 กล่องจะกว้างไปจนถึงกั้นขวาของกระดาษ
h : (ตัวเลข) ความสูงของกล่องข้อความ
txt : (ตัวหนังสือ) ข้อความที่ต้องการพิมพ์
border : เส้นขอบของกล่องข้อความ
- ค่าที่เป็นไปได้
- 0 : ไม่มีขอบ (default)
- 1 : มีขอบ
- นอกจากเป็น 0 1 แล้วเรายังระบุได้ด้วยว่าเอาเฉพาะกรอบด้านไหนได้ด้วย
- L: ขอบซ้าย
- T: ขอบบน
- R: ขอบขวา
- B: ขอบล่าง
align : (ตัวหนังสือ) จัดเรียงข้อความภายในกล่อง
- ค่าที่เป็นไปได้
- L or ค่าว่าง : ชิดซ้าย (default value)
- C: จัดกึ่งกลาง
- R: ชิดขวา
fill : (true/false) แรเงากล่องข้อความหรือไม่หรือไม่ สำหรับสีที่จะใช้ในการแรเงานั้นกำหนดได้ด้วยคำสั่ง SetFillColor ซึ่งจะอธิบายในบทต่อๆ ไป
- ค่าที่เป็นไปได้
- false : ไม่แรเงา (default)
- true : แรเงา







27 Comments
อ๋อเป็นเช่นนี้นี่เองครับ ผมเองใช้ Add on อยู่ตั้งนานครับ
ไม่มีวิธีแก้วรรณยุกต์ลอย หรือครับผมหามาทุกเว็บเลยไม่มีใครกล้าวถึงสักคน
ผมใช้อยู่ไม่เคยเจอปัญหาอย่างที่คุณบุญถึงบอกเลยนะครับ ไม่ทราบว่าใช้ฟ้อนต์อะไร อาจจะเป็นที่ฟ้อนต์ที่ใช้
ผม ใช้ AngsanaNew ครับ ผมเห็นในตัวอย่างที่ใช้ class fpdf แล้วทำเป็นภาษาไทยทุกตัวอย่างวรรณยุกต์ลอยหมดไม่เห็นมีใครทำตัวอย่างที่ไม่ลอยเลยครับ ช่วยหน่อยนะครับ ขอโค้ด หรือ ฟร้อนที่คุณว่าก็ได้
แม้แต่ตัวอย่างของเว็บหน้านี้ยังลอยเลย
ผมย้อนกลับไปดูผลงานที่ผมทำใช้งานใบบริษัท มันลอยจริงๆด้วย ไม่เกี่ยวกับฟ้อนต์แล้วงั้น ผมก็ไม่เคยสังเกตมัน ทั้งที่ใช้อยู่ทุกวัน
เดี๋ยวผมจะหาวิธีให้ครับคุณบุญถึง
ผมลองหาดูในกูเกิล เจอลิ้งก์นี้ http://www.worldphp.com/newsdetail.php?xx=CjRUMg==&tpe=&types=DTdWMw== ท่านลองสมัครสมาชิกแล้วดาวน์โหลดโค้ดของเขามาใช้ครับ เขาแก้สระลอยไว้เรียบร้อยแล้ว
ผมได้ลองดาวน์โหลดมาทดสอบดูแล้ว มันไม่ลอยจริงๆ
ขอคำแนะนำในการย่อหรือขยายขนาดตัวอักษร ตามขนาดของเซลหน่อยครับ
เนื่องจากมีข้อจำกัดเรื่องการดึงข้อมูลจากฐานข้อมูล
ลงมาพิมพ์ในแบบฟอร์ม Certificate
แต่แบบฟอร์มมีขอบเขตจำกัด ตัวหนังสือขนาดใหญ่ที่สุด
จะเป็นขนาด Arial’,'B’,16
แต่บางข้อมูลมีตัวอักษรยาวเกินไป มีวิธีเทรียบสูตรเป็น %
หาขนาดตัวอักษรที่ไม่เกินระยะ หรือมีฟังก์ชั่นอะไรช่วยไหมครับ
เพื่อให้ลดขนาดตัวอักษรลงอัตโนมัติ
อย่างอื่นผมใช้งานได้ดีและมีประโยชน์มากๆ เลยครับ
ขอบคุณผู้ที่คิดค้นและนำมาเผยแพร่อย่างมากครับ
ตัว FPDF มีคำสั่งในการหาความยาวของข้อความ คือ http://www.fpdf.org/en/doc/getstringwidth.htm
หลังจากได้ความยาวของข้อความแล้ว เราก็เอามาเข้าเงื่อนไขครับ ถ้าสั้นกว่าเท่านี้ กำหนดขนาดฟ้อนต์เท่านี้ ถ้ายาวตั้งแต่เท่านี้ถึงเท่านี้กำหนดฟ้อนต์ขนาดเท่านี้ ถ้ายาวมากกว่าเท่านี้ ตัดข้อความใ่ห้เหลือเท่านี้แล้วกำหนดขนาดฟ้อนต์เท่านี้
ใช้คำสั่ง switch เป็นตัวจัดการเงื่อนไขก็ได้ครับ หรือจะใช้ if ก็แล้วแต่ถนัด
คำสั่งสำหรับตัดข้อความอ่านได้ที่นี่ครับ สะดุ้งดอทคอม http://www.sadung.com/?p=122
ถ้าเป็นตัวอักษรภาษาอังกฤษเราคงประมาณได้ว่า 1 cell แสดงได้กี่ตัวอักษรโดยใช้ค่ำสั่ง strlen แต่ภาษาไทย มีสระ-วรรณยุกต์เลยยังไม่เคยลอง ถ้าให้ทำจิง ๆ คงต้องมาเขียน function นับว่าถ้าใช้ฟร้อนขนาดเนี่ย แล้วก็ พายัญชนะ แต่ละตัวมีความกว้างกี่ พิกเซล สระไหน กว้างกี่พิกเซล แน่นอนวรรณยุกต์ย่อมไม่มีความกว้าง หรือง่าย สุดเขียน function ตัดพวก วรรณยุกต๋ออก แล้วนับดูว่ามีกี่ตัวเพื่อจะประมาณได้ว่า 1 cell ของเราที่จะแสดงผล สามารถรับได้กี่ตัว
ขอบคุณมากนะครับ
แต่ถ้าได้สักตัวอย่างหนึ่งก้จะลดเวลาในการลองผิดลองถูกไปเยอะเลยครับ
ผมไม่ใช่โปรแกรมเมอร์อ่ะครับ
แค่อ่าน php แล้วทำเว็ปมาถึงตรงนี้เท่านั้นอ่ะครับ
บางทีเรื่องตัวแปรยังไม่ค่อยรู้อะไรเป้นอะไรนักครับ
แค่คลำทางลองผิดถูกไปครับ
ขอบคุณครับ
รบกวนขอตัวอย่าง GetStringWidth
หน่อยครับ พอดีทดสอบแล้ว
$space = $pdf->GetStringWidth(‘XXXXXX’);
ผลคือ $space =0
ลองใช้ strlen($XXXXX) ของ php แล้ว ก็ติดที่ตัวอักษรกว้างไม่เท่ากันครับ
รบกวนหน่อยนะครับ
ขอบคุณครับ
แฮะๆ ได้ละครับขอบคุณมากๆครับ ที่ช่วยชี้แนะ ผมชุ่ยเองละครับ
ขอบคุณทุกๆ ท่านครับ
คุณ platoosom says:
24/05/2010 at 10:14
ความคิดเห็นที่ 7
มันมี bug น่ะครับ เช่น Text() ไม่ support
และ cell แสดงคำเหล่านี้ไม่ได้ เช่น น้ำ สิทธิ์ เป้นต้น
พอจะมีคำแนะนำสำหรับการเว้นขนาดมั๊ยครับ
ตอนนี้ผมสั่งให้มันรับค่าตัวแปรมา แล้วสั่งให้มันนับว่ามีกี่อักขระ
เอานำจำนวนที่ได้มาเป็นขนาดของช่อง cell อ่ะครับ
แต่มันมีปัญหาตรงที่ว่า ถ้าหากข้อความมีสระบนล่างมากๆ ช่องมันจะห่างเรื่อยๆ
จนบางทีมันก็ไม่สวยไปเลยน่ะครับ อยากให้แนะนำวิธีให้หน่อย
ผมทำแล้ว มันตัดลงมาบรรทัดใหม่ ต้องทำยังไงม่ให้มันขึ้นบรรทัดใหม่อ่ะครับ ขอบคุณครับ
$pdf->MultiCell(20,5,$rowsitems['DecDesc3'],0,’L');
$pdf->MultiCell(10,5,$rowsitems['DecDesc4'],0,’L');
Cell แรกจะปกติ แต่พอ Cell ถัดมามันตัดลงมาคนละบรรทัดครับ
กำหนดความกว้างของ MultiCell ให้มากขึ้นครับ คำสั่งนี้ถ้าตัวหนังสือที่ต้องการให้พิมพ์มากกว่าความกว้าง มันจะตัดขึ้นบรรทัดใหม่ให้อัตโนมัติ
Row1 : 001 TEST DATA OVER ข้อมูลน้อย ข้อมูล1
Multicell Can’t
Repeat other row
——————————————————
Row2 : 002 ข้อมูลน้อยลง ข้อมูลน้อย ข้อมูล2
——————————————————
Row3 : 003 ข้อมูลมีมากขึ้นอีกแล้ว ข้อมูลน้อย ข้อมูล3
ทำยังไงไม่ให้ตัดบรรทัด
ใหม่
——————————————————
ตัวอย่างข้อมูลครับ ควรใช้คำสั่งไงดีครับถึงจะได้ Output เป็นแบบนี้ครับ ขอบคุณอีกครั้งครับ มีคำสั่งอื่นที่แทน Multicell หรือเปล่าครับ
Row1 : 001 TEST DATA OVER ข้อมูลน้อย ข้อมูล1
…………….Multicell Can’t
…………….Repeat other row
——————————————————
Row2 : 002 ข้อมูลน้อยลง ข้อมูลน้อย ข้อมูล2
——————————————————
Row3 : 003 ข้อมูลมีมากขึ้นอีกแล้ว ข้อมูลน้อย ข้อมูล3
…………….ทำยังไงไม่ให้ตัดบรรทัด
…………….ใหม่
——————————————————
ตัวอย่างข้อมูลครับ ควรใช้คำสั่งไงดีครับถึงจะได้ Output เป็นแบบนี้ครับ
ข้อมูลจะแสดงที่ละแถวแบบนี้ไปเรื่อยๆ ครับ (จุด… พิมพ์ไว้ให้ Colum ตรงกันนะครับไม่เกี่ยวกับ Output)
ขอบคุณอีกครั้งครับ มีคำสั่งอื่นที่แทน Multicell หรือเปล่าครับ
Row1 : | 001 | ทดสอบ Multicell | ข้อมูลน้อย1 | ข้อมูล1 |
………….|Muticell ตัดบรรทัด |
………….|ทำให้ข้อมูลอื่นหล่นลงมา |
——————————————————–
Row2 : | 002 | ข้อมูลน้อยลง | ข้อมูลน้อย2 | ข้อมูล2|
——————————————————–
Row3 : | 003 | ข้อมูลมีมากขึ้นอีกแล้ว | ข้อมูลน้อย3 | ข้อมูล3|
………….|ทำยังไงไม่ให้ตัดบรรทัด |
………….|ใหม่ |
——————————————————–
ผมกลัวไม่เข้าใจครับ มันจัดได้ไม่สวย คือข้อมูลจะเรียง colum ไปทางขวาจนหมด
ทุก Colum ถึงจะขึ้นบรรทัดใหม่ครับ
ขออภัยที่โพสบ่อยครับ
ขอบคุณมากนะครับ
ลองอ่านบทความนี้ครับ เผื่อจะแก้ปัญหาของท่านได้
http://www.select2web.com/fpdf/fpdf-lesson-11.html
คำสั่งสำหรับพิมพ์ข้อความลงในเอกสาร pdf ของ fpdf มีอยู่ 4 คำสั่ง Text , Write , Cell , MultiCell
ลองเลือกดูว่าคำสั่งไหนเหมาะกับงานของตัว
ผมได้เขียนบทความเรื่อง fpdf ไว้ทั้งหมด 15 บทความสามารถอ่านได้ที่นี่
http://www.select2web.com/category/fpdf
พี่ครับตาราง multcell มันไม่เรียงต่อไปอะครับ มันเรียงลงมามีวิธีทำให้เหมือน cell ไหมครับ
อยากทราบว่า..ถ้าต้องการให้ออกมาในรูปแบบลักษณะอย่างนี้…ต้องใช้คำสั่งอะไรนะคะ multi columns หรือ multicell หรืออะไรคะ
รายรับ รายจ่าย
เงินเดือน 8992.50 ประกันสังคม 425.00
เงินประจำตำแหน่ง 1000.00 ภาษี 665.25
ปฎิบัติงาน 1800.00 ประกันชีวิต 1100.00
รับสุทธิ xxxxx.xx บาท
หากพบปัญหา กรุณาตรวจสอบรายละเอียดที่ห้องการเงินทันที
แบ่งเป็นคนละฟากคะ…ที่โพสข้างบนออกมาไม่ตรงกั่บที่พิมพ์text boxในช่องนี้อ่ะ
เวลาโพสข้อความลงในหน้ากระดานพอรันออกมาแล้้วขึ้นบรรทัดเดียวอยากให้ขึ้นบรรทัดใหม่โดยอัติโนมัติ บางข้อความยาวเกินไปทำไงดี บอกด้วยค่ะ Dream cs4 ขอบคุณค่ะ
อยากถามว่าเมื่อเราเขียน File PDF แล้วเราจะเช็คค่าได้อย่างไรว่า User สั่งพิมพ์กี่ครั้ง.