Font tiếng Nhật trong việc tải file trên Laravel
Dự án của mình có một phần liên quan đến việc tạo file pdf và cho người dùng tải về, mọi chuyện rất đơn giản, mình dùng cái này, rất dễ sử dụng. Tuy nhiên vấn đề nảy sinh, package không hỗ trợ tiếng Nhật, sau khi tải file, mình nhận được một bản pdf toàn các dấu ?.
Giải quyết, mình tìm thấy một comment hướng dẫn cách thêm font chữ tiếng Nhật. Đầu tiên cần tải file này về rồi để vào thư mục gốc, chỉnh sửa lại đường dẫn trong file. Tiếp theo, tải font tiếng Nhật có đuôi .ttf để vào thư mục gốc. Chạy câu lệnh php load_font.php xxxfont xxxfont.ttf để sinh ra font mới, nó sẽ được lưu vào đường dẫn storage/fonts như chúng ta chỉnh sửa ở file load_font lúc đầu. Cuối cùng thêm vào font vào file pdf.blade.php thôi.
Một số vấn đề tồn đọng:
- File load_font chỉ có thể chạy file .ttf mặc dù trong code có ghi hỗ trợ cả .ttf lẫn .otf.
- Dung lượng file lớn ( > 20MB) cho một file chỉ có 1 hoặc 2 trang.
Hai vấn đề trên mình chưa giải quyết được, mong có cao nhân nào giúp đỡ.
2 CÂU TRẢ LỜI
File load_font chỉ có thể chạy file .ttf mặc dù trong code có ghi hỗ trợ cả .ttf lẫn .otf.
Cái này có vẻ là vấn đề của package dompdf
, trước mình có dùng cũng bị như vậy, một số font thì dùng được, một số font thì không
Dung lượng file lớn ( > 20MB) cho một file chỉ có 1 hoặc 2 trang.
Dung lượng file của bạn lớn là do dompdf
đã nhét cả file font tiếng Nhật của bạn vào trong đó. Bạn cứ thử để ý dung lượng file pdf của mình sẽ gần tương đương với dung lượng của file font
Về các font tiếng Anh thì không sao, do nó vốn khá nhẹ, có nhét cả vào file pdf cũng không gây ảnh hưởng lớn lắm. Nhưng đối với font tiếng Nhật thì đây đúng là một vấn đề, khi mà bản thân file font đã rất nặng rồi.
Bạn có thể khắc phục việc này bằng cách set option isFontSubsettingEnabled
bằng true
. Mình không chắc lắm, nhưng check qua code ở file https://github.com/barryvdh/laravel-dompdf/blob/master/src/PDF.php thì có vẻ bạn có thể thực hiện thông qua hàm setOptions
, kiểu như setOptions(['isFontSubsettingEnabled' => true])
, hoặc là sửa trong file config option enable_font_subsetting
từ false
sang true
(https://github.com/barryvdh/laravel-dompdf/blob/master/config/dompdf.php)
Với việc enable_font_subsetting
thì dompdf
sẽ chỉ đưa những ký tự được dùng vào trong file pdf, thay vì đưa toàn bộ nội dung font như trước, qua đó sẽ giúp file pdf của bạn nhẹ đi rất nhiều.
Tuy nhiên, trước đây khi mình dùng cách đó, thì lại gặp một vấn đề khác là file pdf xuất ra thỉnh thoảng lại không mở được trên một vài trình pdf viewer Không rõ giờ vấn đề đã được khắc phục chưa, bạn cứ thử xem sao
Cá nhân mình đã từng thực hiện export PDF trong project laravel và mình nghĩ bạn nên thử qua thằng laravel-snappy.
Chỉ cần máy tính (hay server) của bạn cài đặt font tiếng Nhật, nó sẽ hiển thị font tiếng Nhật cho bạn. Và file mà bạn download xuống rất nhẹ
Nó sử dụng blade
tạo template và truyền dữ liệu vào. Style của pdf thì bạn để stlye
trực tiếp trong <header>
của blade nhé:
Có 2 cách để export khi sử dụng thằng này:
// Load trực tiếp blade
PDF::loadView('dashboard-pdf', ['data' => $data])
->setPaper('a4')
->setOrientation('landscape');
return $pdf->inline(FILE_NAME . '.pdf');
// Tạo html từ blade sau đó export
$html = view('dashboard-pdf', ['data' => $data])->render();
$pdf = PDF::loadHtml($html)->setPaper('a4')->setOrientation('landscape');
return $pdf->stream(FILE_NAME . '.pdf');
Package dompdf
tip
Mình sử dụng font này có thể generate cả tiếng Nhật và tiếng Việt https://freefontsdownload.net/free-arial-unicode-ms-font-36926.htm
Nhưng khi sử dụng font này thì gặp vấn đề khi download file pdf về thì khá nặng
=> Mình đã fix bằng cách thêm setOptions(['isFontSubsettingEnabled' => true, 'isRemoteEnabled' => true]), isFontSubsettingEnabled được dùng để không gen file font trên vào pdf, isRemoteEnabled dùng để nếu bên trong file pdf có link hình ảnh thì sẽ không bị bỏ qua khi sử dụng isFontSubsettingEnabled