0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Hướng Dẫn Xuất File PDF Trong Rails 7 Sử Dụng Docker Alpine 3.18

Đăng vào 3 tuần trước

• 2 phút đọc

Chủ đề:

Awesome Rails gems

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:

Copy
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:

Copy
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:

Copy
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:

Copy
which wkhtmltopdf

Xuất File PDF

Trong controller, bạn hãy thêm phương thức để xuất file PDF:

Copy
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ới inline 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:

  1. Tải font Noto Sans Font từ Google Fonts và lưu trữ vào thư mục vendor.
  2. Thêm các lệnh sau vào Dockerfile:
Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào