แนะนำ PHP PDF Library
ที่ไม่ต้องใช้ External Library อื่นๆ ประกอบด้วยตัวหลักๆ 3 ตัวดังนี้
TCPDF
http://www.tcpdf.org version 5.9.142 (2011-12-23)
เน้นๆ ที่ชอบใจ feature คือ รองรับภาษาไทย *ttf (TrueTypeUnicode), automatic page break, bookmarks and table of content, ทำ barcode 1D,2D ทำ QR-Code , Document Ecryption 256 bits, digital signature certifications ได้
นอกจากนี้เท่าที่ลองหาข้อมูลเรื่องปัญหา php pdf สระลอยสำหรับภาษาไทย สำหรับ พวก WHMCS (UTF-8) + Thai PDF Patch Update นั้น บางกระแสบอกว่า tcpdf version 5.8.008 ได้แก้เรียบร้อยแล้ว บางที่บอก 5.3.002 ดังนั้นก็ถือว่า version 5.8.008 ได้แก้ปัญหานี้เรียบร้อยแล้ว สำหรับทางผมเอง font ที่ใช้ร่วมกับ TCPDF แล้วไม่เกิดปัญหา “สระอำ” ซ้อนกับ “ไม้โท” ของคำว่า “น้ำ”
FPDF
http://www.fpdf.org v1.7 (2011-06-18)
Logo น่ารักเชียวตัวนี้ เป็นรูปช้างน้อย , สำหรับ php pdf ตัวนี้ไม่ได้ทดลอง ลองอ่าน feature และหาข้อมูล พบว่าแพร่หลาย มีคนใ้ช้เยอะเหมือนกันครับ
HTML2PDF
http://html2pdf.fr/en/default VERSION 4.03 (2011-05-27)
กรณีที่ต้องการสร้าง pdf จากหน้าเว็บเดิม หรือ html code ที่มีอยู่แล้ว แนะนำตัวนี้เลยสะดวก/รวดเร็ว และใช้งานง่าย ที่ผมเข้าใจ ทางผู้พัฒนาได้นำเอา tcpdf เป็น core หลักในการ gen pdf จากนั้นได้เขียน library สำหรับ parse, validate html และ css ต่าง ๆ เพิ่มเติม ก่อนส่งค่าให้ tcpdf ต่อไป
ตัวนี้ support charset utf-8 เป็นหลัก ดังนั้นหากหน้าเว็บ/mysql encoding/เก็บข้อมูล เป็น tis-620/cp874 หรือ windows-874 ต้องมีการแปลง charset กันก่อน ผ่าน iconv() หรือ php utf8_to_tis620() สำหรับ html2pdf version 4.03 (core หลัก tcpdf 5.0.002) ตัวปัจจุบันที่เขียนนั้น , font thai ที่ดูดีสุด ที่ไม่มีปัญหาเรื่องสระลอย คือ TH SarabunPSK ขอขอบคุณเจ้าของพัฒนา font มานะที่นี้ด้วย
ต้องทำขั้นตอน add thai font เข้า html2pdf โดยดูขั้นตอนได้ที่นี้ วิธีการแปลง font thai ttf ใช้งานกับ html2pdf
(ย้ำครับ, กรณีมีปัญหาเรื่องภาษาไทย เป็นตัวเหลี่ยมๆ เท่านั้นค่อยทำ) ผมมีแก้ไข php โดยนำเอา code ของ tcpdf version 5.9.142 ปัจจุบัน มาแก้ใน html2pdf ที่ไฟล์ html2pdf_v4.03\_tcpdf_5.0.002\tcpdf.php ตรง function arrUTF8ToUTF16BE
โดยให้ comment ของเก่าไว้ แล้วใส่อันนี้เข้าไปแทน
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
protected function arrUTF8ToUTF16BE($unicode, $setbom=false) { $outstr = ''; // string to be returned if ($setbom) { $outstr .= "\xFE\xFF"; // Byte Order Mark (BOM) } foreach ($unicode as $char) { if ($char == 0x200b) { // skip Unicode Character 'ZERO WIDTH SPACE' (DEC:8203, U+200B) } elseif ($char == 0xFFFD) { $outstr .= "\xFF\xFD"; // replacement character } elseif ($char < 0x10000) { $outstr .= chr($char >> 0x08); $outstr .= chr($char & 0xFF); } else { $char -= 0x10000; $w1 = 0xD800 | ($char >> 0x0a); $w2 = 0xDC00 | ($char & 0x3FF); $outstr .= chr($w1 >> 0x08); $outstr .= chr($w1 & 0xFF); $outstr .= chr($w2 >> 0x08); $outstr .= chr($w2 & 0xFF); } } // for return $outstr; } |
กรณียังมีปัญหาเรื่องสระลอยทับกันอยู่ให้ดูไฟล์ tcpdf.php ตรงประมาณบรรทัด 4300 ของตัวแปร $topchar และ $topsym โดยผมแก้ไขดังนี้
- ตัวแปร $topchar :: เพิ่ม สระอำ รหัส unicode 3635
- ตัวแปร $topsym :: ลบ สระอิ รหัส unicode 3636
- หากเป็นคำผสมอื่นๆ ลองปรับดูครับ แหๆ อยากใช้ html2pdf ก็ต้องพยายามปรับๆ กันไป อิอิ ไว้รอผู้พัฒนาแก update version ที่ใช้ tcpdf ค่อยมาทดสอบกันต่อไป
เปรียบเทียบและแนวโน้มการใช้งาน PHP PDF ทั้ง 3
ยังไม่ได้หาข้อมูลว่าตัวไหนดีกว่ากัน แต่ได้นำ capture สถิติคำค้นหาของ tcpdf, fpdf, html2pdf ผ่าน google trends พบว่า
- fpdf มีมาตั้งแต่ 2004 – พอ tcpdf เข้ามา fpdf ก็มีแนวโน้มที่คนค้นหาที่เกี่ยวกับ fpdf น้อยลง แต่ไม่ได้หมายความว่าไม่นิยมนะครับ อาจเป็นกรณีที่คนจำ website หลักได้แล้วก็ได้ เลยไม่ต้อง search ผ่าน google อีก หรืออีกนัยยะ อาจเป็น docs/examples พร้อมแล้วในการใช้งาน ดังนั้นเลยไม่จำเป็นที่ต้องหาข้อมูลเพิ่มก็เป็นได้
- tcpdf เพิ่งเริ่มมีตอน 2008 – มีแนวโน้มเพิ่มขึ้น ส่วนนึงอาจเกิดปัญหา หรือข้อมูล docs/examples มีน้อย คนใช้งานเลยต้องจำเป็นต้องค้นหาข้อมูลเพิ่มเติม เป็นธรรมดาครับ ของใหม่กว่าจะเข้าที่เข้าทางก็ต้องใช้เวลา รวมถึงผู้ใช้งานอย่างเราๆ ด้วยครับ
- html2pdf มีตั้งแต่ 2006 – ตัวนี้ผมชอบเพราะใช้งานประกอบกับเว็บหรือโค้ด html เดิมที่มีอยู่แล้ว เพียงแต่ว่า html และ css ต้องถูก syntax นะครับ
Recent html to pdf with php ที่รองรับภาษาไทย Search Terms:
- - html to pdf (45)
- - fpdf สระลอย (14)
Comments are closed.