+1

Tạo file PDF với gem wicked_pdf

Mayfest2023

Giới thiệu

Trước đây, mình đã từng tạo CV bằng HTML, nhưng lại không biết làm thế nào để generate ra file PDF cho đến khi biết đến gem này wicked_pdf, nó sử dụng wkhtmltopdf để generate PDF từ file HTML.

Vậy làm thế nào để tích hợp nó vào trong dự án Ruby on Rails?

Cài đặt

Do wicked_pdf là dùng wkhtmltopdf để tạo ra file pdf nên bạn cũng cần phải thêm nó vào Gemfile

gem "wicked_pdf"
gem "wkhtmltopdf-binary", group: :development
gem "wkhtmltopdf-heroku", group: :production

Trường hợp wkhtmltopdf-binary không nằm trên đường dẫn của máy chủ web, bạn có thể config nó.

WickedPdf.config = {
  exe_path: '/usr/local/bin/wkhtmltopdf',
  enable_local_file_access: true
}

Tiếp theo chạy bundlerails g wicked_pdf khởi tạo wicked_pdf

Nếu bạn sử dụng Rails 4 trở xuống thì phải config thêm file sau:

Mime::Type.register "application/pdf", :pdf

Cách dùng

Do wkhtmltopdf binary được chạy bên ngoài ứng dụng Rails nên những layout bình thường sẽ không hoạt động. Nếu bạn muốn sử dụng CSS, JS hay hình ảnh nào đó thì bạn cần phải sửa file layouts của mình như sau:

<!DOCTYPE html>
<html>
  <head>
    <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"/>
    <%= wicked_pdf_stylesheet_link_tag "pdf" %>
    <%= wicked_pdf_javascript_include_tag "number_pages" %>
  </head>
  <body>
    <div id="header">
      <%= wicked_pdf_image_tag 'thumbnail.png', height: "30", width: "auto %>
    </div>
    <div id="content">
      <%= yield %>
    </div>
  </body>
</html>

Tạo controller để xử lý việc export pdf

def index
  @posts = Post.all
  respond_to do |format|
    format.html
    format.pdf do
      render template: "posts/index.html.erb",
        pdf: "Posts: #{@posts.count}",
        disposition: "attachment"   # default inline
    end
  end
end

disposition: "attachment" cho phép bạn có thể tải pdf về máy thay vì mở nó trên trình duyệt.

Thêm đường link để tải pdf

<%= link_to "PDF", posts_path(format: :pdf) %>

Trên đây mình đã giới thiệu sơ qua về gem wicked_pdf. Nếu bạn muốn tìm hiểu sâu hơn thì có thể truy cập vào đây. Cảm ơn các bạn đã theo dõi!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí