Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> PHP

ตั้งค่า Encoding ใน PHP FPDI Library

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 ไหนดี?

LibraryUnicode/ThaiImport Existing PDFHTML to PDFComplexity
FPDF + FPDI❌ ต้อง TTF Font + makefont✅❌Low
TCPDF + FPDI✅ Built-in Unicode Fonts✅BasicMedium
mPDF✅ Excellent (CSS, RTL, Complex Script)❌✅ Full HTML/CSSMedium
DomPDF✅ Good❌✅ HTML/CSSMedium