เราอยู่เมืองไทย เอกสารที่ทำส่วนใหญ่เป็นภาษาไทย ถ้าคลาสตัวไหนทำภาษาไทยไม่ได้ก็จบข่าว สำหรับ TCPDF แล้วเราสามารถเพิ่มฟ้อนต์ไทยเข้าไปในเอกสารได้ง่ายๆ โดยดาวน์โหลดมาจาก google font ได้เลย

แต่ผมเจอปัญหาเหมือนกันว่า บางฟ้อนต์ที่โหลดมาจาก google font เอามาใช้แล้วมันพิมพ์เป็นจุดดำๆลงในไฟล์ PDF ไม่รู้เหมือนกันว่าทำไม เดาเอาว่าตัวฟ้อนต์มันไม่ซัพพอร์ต

ฟ้อนต์ราชการที่ Sipa เขาทำแจก ผมลองเอามาใช้แล้วฟ้อนต์ออกมาครบ สวยงามดี ก็เอาเป็นว่าฟ้อนต์ตัวไหนใช้ได้ใช้ไม่ได้ต้องทดลองเอาครับ

มาดูวิธีการเพิ่มฟ้อนต์ภาษาไทย

ก่อนอื่นเข้าไปที่เว็บ https://fonts.google.com/?subset=thai ดาวน์โหลดฟ้อนต์ภาษาไทยมาเตรียมไว้ก่อน ผมเลือก Prompt

ผมแตกซิปเอาไฟล์ฟ้อนต์เก็บไว้ที่โฟลเดอร์ fonts

ทีนี้มาดูโค้ด

<?php

require_once('vendor/autoload.php');

// create new PDF document
$pdf = new TCPDF('P', PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

define('PROMPT_REGULAR', TCPDF_FONTS::addTTFfont(dirname(__FILE__).'/fonts/Prompt-Regular.ttf', 'TrueTypeUnicode'));
define('PROMPT_BOLD', TCPDF_FONTS::addTTFfont(dirname(__FILE__).'/fonts/Prompt-Bold.ttf', 'TrueTypeUnicode'));

// set document information
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Nicola Asuni');
$pdf->SetTitle('TCPDF Example 001');
$pdf->SetSubject('TCPDF Tutorial');
$pdf->SetKeywords('TCPDF, PDF, example, test, guide');

$pdf->setPrintHeader(false);

// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

// Add a page
$pdf->AddPage();

$pdf->SetFont(PROMPT_BOLD, '', 14);

// Print text
$pdf->Write(0, 'เมียโหดโมโหผัว คว้าฉมวกแทงเป้าแล้วบิด อวัยวะเพศเหวอะ เย็บ 17 เข็ม ด้านผัวยังไม่กล้ากลับบ้าน รอเมียใจเย็นก่อน

(3 มี.ค. 65) ผู้สื่อข่าวได้รับแจ้งจากชาวบ้านหมู่ 20 ต.ตาจง อ.ละหานทราย จ.บุรีรัมย์ ว่ามีสองผัวเมียในหมู่บ้านชอบทะเลาะกันถึงขั้นใช้ฉมวกแทงปลาแทงอวัยวะเพศ ต้องเย็บถึง 17 เข็ม
');


$pdf->SetFont(PROMPT_REGULAR, '', 14);


// Print text
$pdf->Write(0, ' 
จากการตรวจสอบเบื้องต้นบ้านหลังที่เกิดเหตุปลูกเป็นลักษณะกระท่อมปลายนา พบนางชนิตา อายุ 43 ปี ซึ่งเมื่อพบผู้สื่อข่าวที่จะเข้าไปสัมภาษณ์ได้เปิดฉากตำหนิสามีต่างๆ นานา ระบุว่าสามีชอบกินเหล้าแล้วหาเรื่องเป็นประจำตั้งแต่อยู่กันมา 21 ปี ตนต้องทนต่อสามีที่มาหาเรื่องทุกครั้งที่เมาสุรา

วันเกิดเหตุคือเมื่อคืนที่ผ่านมาเหมือนเช่นเดิม สามีเมาเหล้าแล้วมาชวนทะเลาะอีกจนพยายามพูดดีแต่ไม่เคยได้ผลจึงเกิดการทะเลาะกันอีก แต่ครั้งนี้ตนยอมรับว่าเหนื่อยจากการไปรับจ้างตัดอ้อยจะทนไม่ไหวที่สามีเข้ามาบีบคอตนเองก่อนจึงตัดสินใจเอามือคว้าอวัยวะเพศแล้วบิดเพื่อเป็นการตอบโต้ จนกระทั่งสามีบอกให้ปล่อยแล้ววิ่งหนีไป ยืนยันไม่คิดจะเอาอาวุธไปเชือนอวัยวะเพศของสามีแต่อย่างใด');

// ---------------------------------------------------------

// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output('hello-tcpdf.pdf', 'I');
$pdf->Close();

รันแล้วหน้าตาจะออกมาประมาณนี้ ภาษาไทยสวยงาม

โค้ดที่ใช้สำหรับเพิ่มภาษาไทย

define('PROMPT_REGULAR', TCPDF_FONTS::addTTFfont(dirname(__FILE__).'/fonts/Prompt-Regular.ttf', 'TrueTypeUnicode'));
define('PROMPT_BOLD', TCPDF_FONTS::addTTFfont(dirname(__FILE__).'/fonts/Prompt-Bold.ttf', 'TrueTypeUnicode'));

เริ่มจากผมประกาศตัวแปร constant ที่เก็บคำสั่งเพิ่มฟ้อนต์ไว้ข้างใน (จริงๆไม่เขียนอย่างนี้ ไปเรียก addTTFfont ตอน setFont ก็ได้เหมือนกัน) TCPDF_FONTS::addTTFfont จะเป็นตัวบอกว่าให้เพิ่มฟ้อนต์ Prompt-Regular.ttf เข้ามาเป็นแบบ TrueTypeUnicode

ผมประกาศไว้ 2 ตัวตัวหนึ่งตัวอักษรปกติ อีกตัวตัวอักษรตัวหนา

$pdf->SetFont(PROMPT_BOLD, '', 14);

กำหนดใช้ฟ้อนต์ Prompt-Bold.ttf ขนาด 14 พ้อยต์

$pdf->Write(0, 'เมียโหดโมโหผัว คว้าฉมวกแทงเป้าแล้วบิด อวัยวะเพศเหวอะ เย็บ 17 เข็ม ด้านผัวยังไม่กล้ากลับบ้าน รอเมียใจเย็นก่อน

(3 มี.ค. 65) ผู้สื่อข่าวได้รับแจ้งจากชาวบ้านหมู่ 20 ต.ตาจง อ.ละหานทราย จ.บุรีรัมย์ ว่ามีสองผัวเมียในหมู่บ้านชอบทะเลาะกันถึงขั้นใช้ฉมวกแทงปลาแทงอวัยวะเพศ ต้องเย็บถึง 17 เข็ม
');

จากนั้นพิมพ์คำสั่ง Write() สั่งพิมพ์ข้อความออกมา

คำสั่ง Write() นั้นพารามิเตอร์ตัวแรกจะเป็นตัวบอกความสูงของบรรทัด พารามิเตอร์ตัวที่ 2 คือข้อความที่ให้ปริ้นต์ออกมา นอกจากพารามิเตอร์ 2 ตัวนี้แล้ว ยังมีพารามิเตอร์อีกเพียบ สั่งปริ้นให้ออกมามีสีคาดก็ได้ด้วยนะครับ ลองเล่นได้


	/**
	 * This method prints text from the current position.<br />
	 * @param float $h Line height
	 * @param string $txt String to print
	 * @param mixed $link URL or identifier returned by AddLink()
	 * @param boolean $fill Indicates if the cell background must be painted (true) or transparent (false).
	 * @param string $align Allows to center or align the text. Possible values are:<ul><li>L or empty string: left align (default value)</li><li>C: center</li><li>R: right align</li><li>J: justify</li></ul>
	 * @param boolean $ln if true set cursor at the bottom of the line, otherwise set cursor at the top of the line.
	 * @param int $stretch font stretch mode: <ul><li>0 = disabled</li><li>1 = horizontal scaling only if text is larger than cell width</li><li>2 = forced horizontal scaling to fit cell width</li><li>3 = character spacing only if text is larger than cell width</li><li>4 = forced character spacing to fit cell width</li></ul> General font stretching and scaling values will be preserved when possible.
	 * @param boolean $firstline if true prints only the first line and return the remaining string.
	 * @param boolean $firstblock if true the string is the starting of a line.
	 * @param float $maxh maximum height. It should be >= $h and less then remaining space to the bottom of the page, or 0 for disable this feature.
	 * @param float $wadj first line width will be reduced by this amount (used in HTML mode).
	 * @param array|null $margin margin array of the parent container
	 * @return mixed Return the number of cells or the remaining string if $firstline = true.
	 * @public
	 * @since 1.5
	 */
	public function Write($h, $txt, $link='', $fill=false, $align='', $ln=false, $stretch=0, $firstline=false, $firstblock=false, $maxh=0, $wadj=0, $margin=null)

ในบทถัดไปเราจะลงรายละเอียดคำสั่งพิมพ์ข้อความ กันทีละคำสั่งแล้วครับ โปรดติดตามต่อไป