Sử dụng tiếng Việt với FPDF

FPDF and Vietnamese: mini-HOWTO

Nguyễn Đại Quý

1. Sơ lược về FPDF

FPDF là một class viết bằng ngôn ngữ PHP cho phép tạo các file PDF trực tiếp bằng chương trình PHP mà không dùng đến PDFlib và do đó tránh được các điều kiện hạn chế của giấy phép PDFlib.

FPDF có một số đặc tính sau:

  • Có thể chọn đơn vị đo, định dạng trang và lề
  • Quản lý được các tiêu đề đầu và cuối trang
  • Tự động ngắt trang
  • Tự động ngắt dòng và cân chỉnh văn bản
  • Hoạt động với hình ảnh dạng JPEG và PNG
  • Có thể dùng màu sắc
  • Hỗ trợ liên kết
  • Hỗ trợ các font Truetype, Type1 và các bảng mã
  • Hỗ trợ nén trang

FPDF không cần các thư viện mở rộng nào cả ngoài Zlib để nén các font.

Tuy nhiên, xét về tốc độ tạo file PDF thì FPDF không thể so sánh được với PDFlib, nhất là với những tài liệu phức tạp và có kích thước lớn.

Phiên bản hiện tại của FPDF là 1.51 và có thể tải về từ trang chủ của FPDF. Cũng tại đây, người dùng có thể tìm thấy khá nhiều các script đóng góp của đông đảo cộng đồng giúp cho việc tạo file PDF được dễ dàng và phong phú về thể dạng hơn.

2. Cách dùng FPDF với tiếng Việt

Trong lúc làm công việc thêm support tiếng Việt cho phpMyFAQ, tình cờ thấy có chức năng xuất ra dạng file PDF. Tò mò thử sử dụng, nhưng thất vọng vì kết quả không có tiếng Việt mà thay vào đó là những kí tự linh tinh. Với kinh nghiệm bản thân, tôi hiểu ngay rằng phải có cái gì đó liên quan đến font chữ và bộ mã (encoding) thì mới có thể dùng được FPDF.

Trên trang chủ của FPDF đã có hướng dẫn khá chi tiết về cách thêm font chữ và dùng font chữ mới như thế nào. Nhưng đáng tiếc rằng chẳng có thông tin cụ thể nào cho tiếng Việt: dùng font gì ? bảng mã nào ? tạo các file cần thiết cho FPDF ra sao ?

2.1 Font

Vì FPDF có thể hoạt động được với cả font Truetype và Type1 nên rất dễ dàng tìm được các font thích hợp. Trong trình bày này tác giả dùng font Truetype VUCamThach.

2.2 Bảng mã

FPDF không (chưa?) hỗ trợ Unicode, cho nên không thể dùng trực tiếp font chữ VUCamThach. Trong bài này tác giả chọn bảng mã VISCII. Các trình tự các bước sau về nguyên tắc cũng sẽ áp dụng được cho các bảng mã tiếng Việt khác như TCVN, VPS hay VNI.

Việc thêm một font cần phải tiến hành các bước sau đây:

  • Tạo file .afm (Adobe Font Metrics ?) chứa các thông tin đặc tính "metric" của font chữ,
  • Tạo file định nghĩa font dạng script PHP (.php)
  • Khai báo font để sử dụng nó trong script PHP

Đối với font chữ dạng Type1 thì bước thứ nhất không cần thiết vì các file .afm đã có sẵn. Dùng công cụ ttf2pt1 để chuyển đổi font Truetype sang định dạng Type1 binary (.pfb) và đồng thời tạo ra file .afm.

# ttf2pt1 -b -L viscii.map vucamtha.ttf

Trong đó file viscii.map chứa bảng mã đối chiếu giữa Unicode và VISCII, có dạng:

...
!A3 U+1EB7 abrevedotbelow
!A4 U+1EA5 acircumflexacute
!A5 U+1EA7 acircumflexgrave
!A6 U+1EA9 acircumflexhookabove
!A7 U+1EAD acircumflexdotbelow
!A8 U+1EBD etilde
...

Khi thực hiện lệnh trên sẽ thấy có một vài warning, đừng chú ý đến các thông tin đó vì chúng không quan trọng. Kết quả sẽ có hai file: vucamtha.pfbvucamtha.afm.

Bước tiếp đến, tạo file định nghĩa font, tạm gọi tên là make_vucamtha.php có nội dung như sau:

<?php
include('makefont/makefont.php');
MakeFont('vucamtha.pfb','vucamtha.afm','viscii');
?>

Chạy script make_vucamtha.php thông qua trình duyệt, bỏ qua các thông tin xuất hiện, sẽ thấy có hai file mới được tạo ra là vucamtha.phpvucamtha.z. File thứ hai chẳng qua chỉ là dạng nén của file vucamtha.pfb. Việc tạo file kết thúc ở đây.

Trong chương trình muốn sử dụng font chữ vừa tạo, chỉ cần khai báo như sau:

<?php
define ('FPDF_FONTPATH','font/');
require('fpdf.php');
 
$pdf=new FPDF('P','mm','A4');
$pdf->Open();
 
$pdf->SetMargins(25.0,20.0,20.0);
$pdf->AddPage();
$pdf->AddFont('VUCamThach','','vucamtha.php');
$pdf->SetFont('VUCamThach','',36);
$pdf->Cell(0,12,'ThØ Tiªng Vi®t VISCII VUCamThach',0,1,'C');
$pdf->Output();
?>

Voilà! bạn đã có thể tạo ra các file PDF tiếng Việt với FPDF rồi. Chưa thật sự tin ư ? hãy thử ngay tại đây.

Các bước trình bày trên đây là hoàn toàn áp dụng được cho bảng mã CP1258. Chỉ việc thay thế file viscii.map bằng file cp1258.map. Đương nhiên khi đó thì các xâu chuỗi truyền cho hàm $pdf->Cell() phải là ở bảng mã CP1258.

3. Tham khảo/Liên kết


[Created: Mon Dec 22 23:15:43 CET 2003]  [Updated: Sat Dec 27 18:13:27 CET 2003]