ผู้สนับสนุน

วันจันทร์ที่ ๓๐ มีนาคม พ.ศ. ๒๕๕๒

PHP สร้าง PDF ภาษาไทย

ขอบคุณ @gookcompsci narisa.com  fpdf.org fpdf.org phorum 

ขั้นแรก ไป download fpdf จาก fpdf.org ก่อน

แตกไฟล์ออกมามันจะประกอบด้วย dir และ file ต่างๆ ดังนี้


เอาทั้งหมดนี้ไปวางไว้ใน dir ที่จำใช้ทำงาน เช่น ทำงานที่ workspace/ ก็เอาไปวางเป็น workspace/fpdf/ เป็นต้น(ปรับแก้ได้ตามใจนะไม่ได้บังคับใช้ในการอ้างอิงที่อยู่เท่านั้น)

อันนี้ code ลองทดสอบอันแรก เอามาจาก fpdf.org เลยเพื่อทดสอบว่า fpdf ทีเราเอามาใช้งานได้จริง
สมมติว่า save เป็นไฟล์ "firstpage.php" ไว้ที่ workspace/ 
เราก็จะเข้าไปทดสอบได้จาก http://hostname/.../workspace/firstpage.php 

<?php
 
require('./fpdf/fpdf.php');
 
$pdf=new FPDF();
 
$pdf->AddPage();
 
$pdf->SetFont('Arial','B',16);
 
$pdf->Cell(40,10,'Hello World!');
 
$pdf->Output();
 
?>

ถ้าได้ก็ไปต่อได้ถ้าไม่ได้ก็ลองใหม่(-_-)

ขั้นที่ 2 เตรียม font (ทำบน Windows Vista)
download ตัวทำ font http://www.fpdf.org/fr/dl.php?id=22
นำทั้งหมดมาที่ dir workspace/

copy font จาก dir font มาที่ dir ที่ทำงาน (เพื่อให้ง่าย)
ตัวอย่างเช่น เอา Font "Angsana New" จาก C:\Windows\Fonts มาใส่ไว้ที่ dir workspace/
โดยไฟล์ของ Font "Angsana New" ชื่อ angsa.ttf

ขั้นที่ 3
เปิด cmd ขึ้นมาแล้วย้ายตัวเองไปที่ dir workspace/
พิมพ์
ttf2pt1 -b -L cp874.map angsa.ttf angsa
จากขั้นตอนนี้จะได้ไฟล์มาสองตัวคือ angsa.afm กับ angsa.pfb copy ใส่ไว้ที่ workspace/fpdf/font/makefont/

ขั้นที่ 4
สร้างไฟล์ php 1 ไฟล์เพื่อสร้างfont ให้ใช้ได้กับ fpdf อีกที
สมมุติว่าชื่อ make_angsa.php อยู่ที่ workspace/fpdf/font/makefont/
<?
include('makefont.php');
MakeFont('angsa,pfb','angsa.afm','cp874')
?>

เปิด cmd แล้วมาที่ dir นี้พิมพ์
php make_angsa.php
จะได้ไฟล์ออกมาอีก 2 ไฟล์คือ angsa.php และ angsa.z
copy เอาทั้งสองตัวไปวางที่ workspace/fpdf/font/

น่าจะใช้ได้แล้วลองทดสอบโดย
<?php
 
require('./fpdf/fpdf.php');
 $str = "มอสสิล่า";
 
$pdf=new FPDF();
 $pdf->AddFont('angsa','','angsa.php');
 
$pdf->AddPage();
 
$pdf->SetFont('angsa','',16);
 
$pdf->Cell(40,10,$str);
 
$pdf->Output();
 
?>

น่าจะได้แล้วนะ

ขั้นที่ พิเศษ
จากผมที่ผมได้ลองถ้าเปลี่ยน encoding เป็น utf8 แล้วมันจะใช้ไม่ได้แฮะ(จำเป็นต้องใช้เพราะดึงข้อมูล utf8 จาก db) ผมก็เลยงงๆ ถามๆ ไปเรื่อย แล้วก็ได้คำตอบจาก  @gookcompsci ว่าให้ลองใช้ iconv ดู โดยให้ดูก่อนว่า php มันเปิด function นี้ไว้หรือเปล่าถ้ามันเปิดอยู่ก็ง่ายขึ้นครับ

อันนี้ตัวอย่างการใช้ iconv
<?
$str = "string encoding เริ่มต้นสมมุติว่าเป็น utf8";
//$str = iconv('encoding เริ่มต้น','encoding ปลายทาง','string ที่จะเปลี่ยน');
$str = iconv('UTF-8','CP874',$str); //ถูกแปลงเป็น CP874 ที่นี่
?>

ตัวอย่างการใช้งานกับ db
<?php
include('config.php');
include('opendb.php');
require('./fpdf/fpdf.php');
$sql = "SELECT * FROM user";
$result = mysql_query($sql);
$str = '';
while($row = mysql_fetch_array($result)){
        $str .= $row['name'];
}
$str = iconv('UTF-8','CP874',$str);

$pdf=new FPDF();
$pdf->AddFont('angsa','','angsa.php');
$pdf->AddPage();
$pdf->SetFont('angsa','',16);
$pdf->Cell(40,10,$str);
$pdf->Output();

include('closedb.php');

?>


เรื่องจัดหน้าใน pdf รบกวนอ่านใน fpdf.org

ซ้ำแล้วขออภัยบอกได้ ,ไม่ละเอียดไม่ชัดเจนบอกได้แก้ให้(ถ้าว่าง) ,มีวิธีที่ดีกว่าบอกได้ขอบคุณ(ม๊ากกๆ) ,จัดหน้า ใส่สีไม่สม่ำเสมอขออภัย

แนะนำติชมเพิ่มเติมเชิญตามอัธยาศัย ภาษาวัยรุ่นอะไรก็ได้อ่านออก


๔ ความคิดเห็น:

  1. ขอบคุณที่แวะมาครับ :)

    ตอบลบ
  2. ขอบคุณมากค่ะ ทำได้แล้วเย้ๆ (^^)/

    ตอบลบ
  3. เป็นบทความที่ดีมากเลยครับ

    ลาภ

    ตอบลบ