ข้ามไปที่เนื้อหาหลัก

การเพิ่ม Font ภาษาไทยอื่นๆ เข้าไปใช้งานใน MPDF


เนื่องมาจากผมได้มีโอกาสจับงานที่ต้องแปลงหน้าเว็บให้เป็น PDF ลองๆ หาข้อมูลก็ไปเจอเจ้าตัวนี้ MPDF ซึ่งจริงๆ แล้วก็มีให้ใช้งานอีกหลายๆ ตัว สาเหตุที่เลือกใช้งานตัวนี้เพราะมัน ค่อนข้างจะติดตั้ง และใช้งานง่าย และยังสามารถอ้างอิง CSS เข้ามาช่วยจัดหน้าตาใน PDF ได้อีกด้วย ซึ่งผลที่ได้เพี้ยนไปจากตัวจริงไม่มากครับ แต่ที่ทำให้เลือกใช้งานเพราะการเพิ่มฟ้อนท์ภาษาไทย เข้าไปนั้นค่อนข้างง่ายครับ เลยจะขอมาแนะนำดังนี้

  1.  เข้าไปในโฟลเดอร์ของ MPDF หาโฟลเดอร์ที่ชื่อ /ttfonts
  2. จากนั้นเอาฟ้อนที่เราต้องการใช้งาน Copy ไปเก็บไว้ในโฟลเดอร์นั้น
  3. แก้ไขไฟล์ config_fonts.php ซึ่งจะเก็บส่วนของการตั้งค่าตัวอักษรไว้ทั้งหมด เลื่อนไปหาในส่วนตัวแปรที่เก็บค่าฟ้อนท์ไทยเอาไว้ แล้วเขียนต่อจากของเดิม โดยเขียนตามโค้ดด้านล่าง
    "THSaraban" => array(
            'R' => "THSaraban.ttf",
            'B' => "THSaraban Bold.ttf",
            'I'  => "THSaraban Italic",
            'BI'   =>  "THSaraban BoldItalic"
            )
    
  4. จากนั้นเข้าไปแก้ไขไฟล์ config_cp.php เข้าไปตรงที่เป็นเงื่อนไขของภาษาไทย โดยเพิ่มตัวแปรที่เราเพิ่งสร้างลงไปให้ครบตามที่เราต้องการใช้
    CASE "th":  $unifonts = "garuda, garudaB, garudaI, garudaBI, norasi, norasiB, norasiI, norasiBI, THSaraban,THSarabanI, THSarabanB, THSarabanBI";  break;
  5. เวลาใช้งาน เรียกคลาสโดยประกาศ ด้วยเงื่อนไขภาษาไทย
    $html = 'สวัสดีครับ';
    $pdf = new mPdf('th', 'A4', '0', 'THSaraban');
    $pdf->SetAutoFont();
    $pdf->SetDisplayMode('fullpage');
    $pdf->WriteHTML($stylesheet, 1);
    $pdf->WriteHTML($html, 2);
    $pdf->Output();
    

เพิ่มเติมอีกนิด การนำ CSS เข้ามาใช้งาน โดยการใช้คำสั่ง file_get_contents(ที่อยู่ไฟล์ CSS) แล้วประกาศ Class ตามโค้ดด้านล่าง โดย 1 หมายถึงการบอกว่าเอาเฉพาะ CSS ไม่ไช่หน้า HTML

$pdf->WriteHTML($stylesheet, 1);
$pdf->WriteHTML($html, 2);

ปัญหาที่พบบ่อยๆ ก็คือ page ที่ใช้สำหรับแสดงผล PDF มักจะเอ๋อๆ ไป ควรไปปรับ Config ใน PHP เกี่ยวกับ init_memory หรือ กำหนดเอาในหน้านั้นเลยก็ได้ครับ

เพียงเท่านี้หน้า PDF ที่สร้างขึ้นมา ก็จะแสดงฟ้อนท์ ในแบบที่เราต้องการครับ ไม่ยากเลยไช่ไหม? ลองเอาไปทำกันดูนะครับ ที่นำมาเขียนเพราะว่าเนื้อหาที่เป็นภาษาไทยยังมีน้อย เลยช่วยเขียนเพิมอีกแหล่งจะได้หาเจอง่ายๆ




ความคิดเห็น

  1. ขอบคุณมากเลยค่ะ แต่ว่าเราลอง add font angsana แล้วปรากฎว่า วรรณยุกต์มันซ้อนทับกับสระอ่ะค่ะ ไม่ทราบว่าเป็นเหมือนกันหรือเปล่าคะ

    ตอบลบ
    คำตอบ
    1. ลองแต่ ไทยสารบรรณ อย่างเดียวเลยครับ เด๋วยังไงจะลองดูนะครับ ได้ผลยังไงจะแจ้งอีกที ^ ^

      ลบ
  2. เอ่อ เราลอง add THSaraban มันก้อซ้อนทับเหมือนกันอ่ะค่ะ

    ตอบลบ
  3. ทำ CSS Font-Face หรือยังครับ?

    ตอบลบ
  4. สระลอย พอมีวิธีแก้ไขไหมครับ

    ตอบลบ

แสดงความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การใช้งาน คำสั่ง file_exists() อย่างเข้าใจ

นี่อาจจะไม่เรื่องใหม่อะไรสำหรับ Professional ทั้งหลาย แต่ว่าสำหรับผมที่เข้าใจ และใช้งานอย่างผิดๆ มาตลอด จนบางทีก็เข้าใจว่า เราเขียนผิด หรือ คำสั่งมันใช้งานไม่ได้ วันนี้จะขอมาพูดถึงเรื่องของคำสั่ง PHP ที่ชื่อ file_exists เป็นคำสั่งที่ใช้สำหรับตรวจสอบไฟล์ว่ามีอยู่จริงหรือไม่? ตัวอย่างการใช้งานแบบผิดๆ ที่ผมใช้ก็คือ file_exists('/images/news/helloworld.jpg'); ผลลัพธ์ที่ได้คือ FALSE ถึงแม้ว้าจะมีไฟล์นั้นอยู่จริงก็ตาม ซึ่งในความเป็นจริงแล้ว การใช้งานที่ถูกต้องคือ file_exists($_SERVER['DOCUMENT_ROOT'] . '/images/news/helloworld.jpg'); จากตัวอย่างที่ถูกต้อง ทำให้เข้าใจแบบง่ายๆ ว่าคำสั่ง file_exists นั้นใช้สำหรับเช็ค path ในโฟลเดอร์จริงๆ เท่านั้น ไม่สามารถเช็คจาก URL ได้ อันนี้เป็นเรื่องง่ายๆ ที่ผมเข้าใจผิดมาอยู่นานเลยทีเดียวเลยต้องขอลงบันทึกเตือนตัวเองไว้อีกที :3

มาเข้าใจ และใช้ Datatable ดึงข้อมูลแบบ Server-side ด้วย PHP, MySQL กันเถอะ

มีช่วงหนึงผมเคยนำ datatable มาพัฒนาในงานแต่เกิดปัญหาเนื่องจากมีข้อมูลขนาดใหญ่ ทำให้เกิดการโหลดในครั้งแรกที่โหลดหน้าเพจนั้นๆ เนื่องจากผมใช้ Ajax ในการโหลดข้อมูลทั้งหมดมาในครั้งเดียวด้วยจำนวนข้อมูล 1000 ขึ้น ซึ่งตอนนั้นผมคิดว่าการทำ preload น่าจะช่วยได้ แต่ว่าถ้า user เกิดเผลอไปกด refesh หรือแก้ไขข้อมูลเวลากลับมาที่หน้าข้อมูลก็ต้องโหลดใหม่อีก ทำให้ผมเลิกใช้ datatable ไปเลย เพราะคิดว่ามันคงไม่เหมาะ แต่ในความจริงแล้ว datatable ก็ได้มีสิ่งที่มาแก้ในจุดนั้นได้ ซึ่งเรียกว่า server-side โดยการที่อนุญาตให้เรา query ข้อมูลออกมาก่อนแล้วส่งมาให้ datatable อ่านข้อมูลในจำนวนที่น้อยลง หลักการก็เหมือนๆ กับบทความการทำสร้าง XML จากข้อมูลขนาดใหญ่นั่นแหละครับ แต่มีเงื่อนไขเพียงแต่ว่า ต้อง Filter และส่งข้อมูลออกมาในรูปแบบที่ตรงตามหลักของ datatable เท่านั้น ( บางครั้งเวลาเข้าไปอ่าน Document หรือดู Example จะงงๆ ว่าอะไรเยอะแยะ ) โดยวันนี้จะมาแนะนำการใช้งานแบบง่ายๆ กันเลย :D