FPDI (Free PDF Document Importer) ใช้ร่วมกับ FPDF/TCPDF ต้องการ Font ที่รองรับ Encoding ที่ต้องการ (Thai, Unicode, आदि)
ปัญหา: FPDF Core ใช้ Built-in Fonts (Latin-1 เท่านั้น)
Built-in Fonts (Helvetica, Times, Courier) รองรับเฉพาะ CP1252/ISO-8859-1 ไม่รองรับ Thai, Chinese, Arabic, Emoji
วิธีแก้: เพิ่ม TrueType Font (Unicode/TTC)
ขั้นตอนที่ 1: เตรียม Font File (.ttf)
- Thai: TH Sarabun New, Noto Sans Thai, Garuda
- Unicode: Noto Sans, DejaVu Sans, FreeSans
- ดาวน์โหลดจาก Google Fonts หรือ System Fonts
ขั้นตอนที่ 2: สร้าง Font Definition ด้วย makefont.php
# ในโฟลเดอร์ fpdf/font/
php makefont.php /path/to/NotoSansThai-Regular.ttf NotoSansThai uni
# หรือใช้ ttf2ufm (เก่า)
# สร้างไฟล์ .php (Font Definition) และ .z (Compressed Font Data)
ขั้นตอนที่ 3: ใช้งานใน FPDI/FPDF
require_once 'vendor/autoload.php';
use setasign\Fpdi\Fpdi;
$pdf = new Fpdi();
// เพิ่ม Font (ไฟล์ .php ต้องอยู่ใน font directory)
$pdf->AddFont('NotoSansThai', '', 'NotoSansThai.php');
$pdf->AddFont('NotoSansThai', 'B', 'NotoSansThai-Bold.php');
$pdf->AddFont('NotoSansThai', 'I', 'NotoSansThai-Italic.php');
$pdf->SetFont('NotoSansThai', '', 12);
// เขียนข้อความไทย
$pdf->AddPage();
$pdf->Write(5, 'สวัสดีครับ ภาษาไทยใน PDF');
$pdf->Output('thai.pdf', 'D');
Encoding ที่ FPDF/FPDI รองรับ (Built-in)
Built-in Fonts รองรับ Encoding เหล่านี้ (ผ่าน iconv):
// Western Europe
cp1252, ISO-8859-1, ISO-8859-15
// Central Europe
cp1250, ISO-8859-2, ISO-8859-16
// Cyrillic
cp1251, ISO-8859-5, KOI8-R, KOI8-U
// Greek
cp1253, ISO-8859-7
// Turkish
cp1254, ISO-8859-9
// Baltic
cp1257, ISO-8859-4, ISO-8859-13
// Hebrew
cp1255, ISO-8859-8
// Arabic
cp1256, ISO-8859-6
// Thai
cp874, ISO-8859-11
// Vietnamese
cp1258
// Vietnamese (VISCII)
VISCII
แปลง UTF-8 เป็น Encoding เหล่านี้ (สำหรับ Built-in Fonts)
$text = 'สวัสดีครับ';
// ต้องใช้ Font ที่รองรับ Encoding นี้ (เช่น cp874)
// แต่ Built-in Font ไม่มี Glyph ภาษาไทย!
// วิธีนี้ใช้ไม่ได้กับภาษาไทยจริงๆ
// ถ้าต้องการใช้ Built-in Font กับภาษาอื่น:
$text = iconv('UTF-8', 'cp1252//TRANSLIT', $text);
// //TRANSLIT: พยายาม Transliterate ตัวอักษรที่ไม่มี (เช่น é -> e)
แนวทางแก้ปัญหาไทย/Unicode จริง (แนะนำ)
ทางเลือก 1: ใช้ TCPDF แทน FPDF/FPDI
// TCPDF รองรับ Unicode/UTF-8 โดยตรง ไม่ต้อง Convert
require_once 'vendor/autoload.php';
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8');
$pdf->SetFont('dejavusans', '', 12);
$pdf->AddPage();
$pdf->Write(5, 'สวัสดีครับ Unicode ทำงานได้เลย');
$pdf->Output('unicode.pdf', 'D');
ทางเลือก 2: ใช้ FPDI + TCPDF (Import PDF + Unicode)
use setasign\Fpdi\Tcpdf\Fpdi;
$pdf = new Fpdi();
$pdf->AddPage();
$pdf->setSourceFile('template.pdf');
$tplId = $pdf->importPage(1);
$pdf->useTemplate($tplId);
// ใช้ TCPDF Method สำหรับ Unicode
$pdf->SetFont('dejavusans', '', 12);
$pdf->Text(10, 10, 'ข้อความไทยบน Template PDF');
ทางเลือก 3: ใช้ mPDF (HTML to PDF, รองรับ Thai สุดๆ)
composer require mpdf/mpdf
$mpdf = new \Mpdf\Mpdf(['mode' => 'utf-8', 'format' => 'A4']);
$mpdf->WriteHTML('สวัสดี มือดี
');
$mpdf->Output('thai.pdf', 'D');
สรุป: เลือก Library ไหนดี?
| Library | Unicode/Thai | Import Existing PDF | HTML to PDF | Complexity |
|---|---|---|---|---|
| FPDF + FPDI | ❌ ต้อง TTF Font + makefont | ✅ | ❌ | Low |
| TCPDF + FPDI | ✅ Built-in Unicode Fonts | ✅ | Basic | Medium |
| mPDF | ✅ Excellent (CSS, RTL, Complex Script) | ❌ | ✅ Full HTML/CSS | Medium |
| DomPDF | ✅ Good | ❌ | ✅ HTML/CSS | Medium |