Asked Jun 4th, 2018 2:28 AM 630 1 2
  • 630 1 2
+2

Font tiếng Nhật trong việc tải file trên Laravel

Share
  • 630 1 2

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 ANSWERS


Answered Jun 4th, 2018 2:55 AM
Accepted
+4

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 😄

Share
Answered Jun 4th, 2018 3:07 AM
+6

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');
Share