Giới thiệu
Bài viết này sẽ hướng dẫn bạn cách xuất file PDF trong dự án Rails 7 đang chạy trên Docker với hệ điều hành Alpine 3.18. Chúng ta sẽ sử dụng gem Wicked-PDF để thực hiện việc này, cùng với việc hiển thị ngôn ngữ tiếng Nhật.
Thiết lập Môi Trường
Dưới đây là các thành phần chính của dự án:
- Rails 7 chạy trên Docker OS Alpine 3.18
- Sử dụng Wicked-PDF để xuất file PDF
- Ngôn ngữ hiển thị: Tiếng Nhật
- Frontend: Sử dụng file slim
Cài đặt Wicked-PDF
Đầu tiên, bạn hãy thêm gems cần thiết vào file Gemfile:
gem 'wicked_pdf'
gem 'wkhtmltopdf-binary'
Sau đó, mở terminal và chạy các lệnh sau để cài đặt và khởi tạo Wicked-PDF:
docker compose exec app rails bundle install
docker compose exec app rails g wicked_pdf
Lệnh trên sẽ tạo ra file wicked_pdf.rb
trong thư mục config/initializers
.
Cấu Hình wicked_pdf.rb
Mở file config wicked_pdf.rb
và thêm cấu hình sau:
WickedPdf.config = {
exe_path: '/usr/local/bundle/bin/wkhtmltopdf',
enable_local_file_access: true,
}
Kiểm tra đường dẫn của wkhtmltopdf
trong Docker bằng lệnh:
which wkhtmltopdf
Xuất File PDF
Trong controller, bạn hãy thêm phương thức để xuất file PDF:
def download_pdf
respond_to do |format|
format.html
format.pdf do
render pdf: 'pdf-sample2',
template: 'quotes/quote_pdf',
formats: [:html],
encoding: 'UTF-8',
layout: 'layouts/pdf',
locals: {quote: @quote},
disposition: 'attachment'
end
end
end
Giải thích phương thức:
pdf: 'Tên file'
: Tên của file PDF sẽ được xuất ra.- Trong template Rails 7, không cần chỉ rõ đuôi file, nếu không sẽ bị lỗi.
locals
: Khai báo biến local để sử dụng trong view.layout
: Định nghĩa layout cho các file PDF.disposition: 'attachment'
: Thiết lập để tải về file PDF, khác vớiinline
sẽ mở trong tab mới.
Sửa Lỗi
Khởi đầu mọi thứ đều ổn, nhưng không may, tôi đã gặp lỗi Invalid platform. Nguyên nhân là do Alpine 3.18 không hỗ trợ sẵn wkhtmltopdf-binary, vì vậy tôi cần cài đặt thủ công trong Dockerfile bằng cách cài đặt alpine-wkhtmltopdf
.
Để sửa lỗi liên quan đến ngôn ngữ Nhật Bản, tôi đã cài đặt font tiếng Nhật. Quá trình như sau:
- Tải font
Noto Sans Font
từ Google Fonts và lưu trữ vào thư mụcvendor
. - Thêm các lệnh sau vào Dockerfile:
RUN mkdir -p /usr/share/fonts/truetype/google-fonts
RUN find $PWD/vendor/fonts/Noto_Sans_JP/ -name "*.ttf" -exec install -m644 {} /usr/share/fonts/truetype/google-fonts/ \; || return 1
Lệnh trên sẽ sao chép các font từ thư mục vendor vào trong Docker container. Cuối cùng, mọi thứ đã hoạt động tốt. Bravo cho những nỗ lực của chúng ta ♥️!
source: viblo