สร้างไฟล์ pdf ด้วย React + pdfmake ภาษาไทย

ถ้ากำลังมองหาวิธีการสร้างไฟล์ pdf ฝั่ง client อยู่ ขอนำเสนอตัวนี้เลยครับ pdfmake ไปลองเล่นดูได้ พอลองดูก็จะพบว่าตัว example ที่เค้าให้มา font ไม่ support ภาษาไทย ถ้าอยากให้มันใช้ font ไทยได้มีมีขั้นตอนดังนี้ครับ
(ขอข้ามการสร้าง project react ไปนะครับ )

1.install pdfmake

2.import pdfmak และ pdfFonts เข้าไปใช้งานใน component ที่ต้องการ

สร้าง method printPDF() สำหรับทดสอบ (bind เข้ากับปุ่มที่ต้องการ)

ผลลัพธ์

ไม่ support ภาษาไทย

3.เพิ่ม font ภาษาไทยเข้าไปยัง pdfmake

ref: https://github.com/bpampuch/pdfmake/wiki/Custom-Fonts—client-side

3.1  เข้าไปสร้าง folder ที่   (prject folder)/node_modules/pdfmake/

สร้าง folder    examples -> fonts

3.2 download font ไทยที่ต้องการ ในที่นี้จะใช้ font  THSarabunNew

ฟอนต์สารบรรณ ปรับปรุงรุ่นใหม่ “Sarabun New”

download font Roboto จาก  https://github.com/bpampuch/pdfmake/tree/master/examples/fonts ไปด้วยนะครับ ไม่งั้นตอน build font ใหม่ ตัว font ที่เป็น default ของ pdfmake จะหายไป ทำให้ run ไม่ผ่านครับ

3.3 นำไฟล์ที่ download ได้ไปวางที่ (prject folder)/node_modules/pdfmake/examples/fonts

4.build font ใหม่

4.1 เปิด terminal หรือ command line เข้าไปยัง  (prject folder)/node_modules/pdfmake/ แล้วสั่ง run

npm install

4.2 สั่ง  run

gulp buildFonts

เมื่อสำเร็จจะได้ไฟล์  vsf_fonts.js ใหม่ ลองเปิดและค้นตามชื่อ font จะพบ font ที่เราต้องการใช้

5.เรียกใช้งาน font ภาษาไทยที่ react component

จากข้อ 1 เราต้องมีการ set font เพิ่มตอนเรียกใช้งานดังนี้

ใส่ defaultStyle  font เป็น THSarabunNew

6.ผลลัพธ์

run project ใหม่ ด้วย npm start หรือ yarn start เพื่อให้ complile ไฟล์  vsf_fonts.js เข้าไปใหม่ด้วย
แล้วกดดูจะได้ผลลัพธ์ ดังนี้ครับ
จบแล้วครับ หวังว่าจะมีประโยชน์นะครับ
ลองตัวอื่นก็ได้นะครับ แต่ตัวนี้ตอบโจทย์ภาษไทยได้ดีสุด
https://github.com/diegomura/react-pdf   => ไม่สำเร็จ ใช้งานไม่ได้
https://github.com/MrRio/jsPDF => ตัวนี้ได้ แต่ไม่ support ภาษาไทย
jsPDF + html2canvas  => ได้ ภาษาไทย แต่ตอนแปลง html เป็น canvas จะมีปัญหาพวกตัวอักษรยก และวรรณยุกต์


React + pdfmake ตัวอย่างที่ใช้จัด

ตัวอย่างใบเสร็จ

 

 

source code :  https://goo.gl/bBB4SE