Creating PDFs in Rails Using the Wicked_PDF Gem

1. Introduction

  • Gem wicked_pdf được dùng để generate file PDF từ HTML.
  • Thay vì dùng DSL để generate PDF, bạn chỉ cần viết 1 file HTML và wicked_pdf sẽ lo phần còn lại.

2. Install

  • Thêm gem wicked_pdf vào Gemfile.
    # Gemfile
    gem "wicked_pdf"
    gem "wkhtmltopdf-binary"
    
  • Chạy bundle install để install gem vào source code.
    bundle install
    
  • wicked_pdf là wrapper của wkhtmltopdf, để sử dụng gem wicked_pdf thì bạn phải install thêm gem wkhtmltopdf-binary vào source code.
  • Chạy rails generate wicked_pdf để generate initializer của gem wicked_pdf.
    rails generate wicked_pdf
    
  • Sau khi chạy, ta nhận đc file wicked_pdf.rb với nội dung như sau
    # config/initializers/wicked_pdf.rb
    WickedPdf.config = { }
    
  • File này dùng để config gem wicked_pdf.
  • Thêm pdf vào mime_types.rb.
    # config/initializers/mime_types.rb
    Mime::Type.register "application/pdf", :pdf
    

3. Basic usage

  • Để hiển thị file PDF, trong controller ra sử dụng method render
    # app/controllers/welcome_controller.rb
    class WelcomeController < ApplicationController
      def index
        respond_to do |format|
          format.pdf do
            render pdf: "welcome"
          end
        end
      end
    end
    
  • Tạo thêm file app/views/welcome/index.pdf.erb cho phần view
    # app/views/welcome/index.pdf.erb
    <h1>Welcome#index</h1>
    <p>Find me in app/views/welcome/index.pdf.erb</p>
    
  • Kết quả thu được khi access localhost:3000/welcome.pdf

4. Asssets (CSS, JS)

  • wkhtmltopdf được chạy bên ngoài Rails app, nên các helper mặc định cho assets pipeline như stylesheet_link_tagjavascript_include_tag sẽ không hoạt động với file pdf được geneate bởi gem wicked_pdf
  • Để sử dụng assets pipeline với gem wicked_pdf, ra sử dụng các helper được cung cấp bởi gem wicked_pdf như wicked_pdf_stylesheet_link_tag, wicked_pdf_image_tag, wicked_pdf_javascript_include_tag
  • Config layout cho wicked_pdf
    # config/initializers/wicked_pdf.rb
    WickedPdf.config = {
     layout: "wicked_pdf_application.html.erb"
    }
    
  • Tạo file layout cho wicked_pdf
    # app/views/layouts/wicked_pdf_application.html.erb
    <!DOCTYPE html>
    <html>
      <head>
        <title>VibloWickedPdf</title>
        <%= csrf_meta_tags %>
        <%= csp_meta_tag %>
    
        <%= wicked_pdf_stylesheet_link_tag "application", media: "all", "data-turbolinks-track": "reload" %>
        <%= wicked_pdf_javascript_include_tag "application", "data-turbolinks-track": "reload" %>
      </head>
    
      <body>
        <%= yield %>
      </body>
    </html>
    

5. Render pdf options

  • Với method render được sử dụng ở controller, ngoài option pfd để config filename khi download file pdf, ra còn có các options khác.
  • disposition: inline (hiển thị file PDF, vẫn có thể download file PDF manual), attachment (download file PDF khi access link).
  • template: nội dung file PDF, default trùng với template HTML của action.
  • inline: nội dung file PDF dưới dạng string, override lại template option.
  • show_as_html: trả về true thì sẽ hiển thị HTML thay vì PDF.
  • orientation: default là Portrait (hướng dọc), hoặc Landscape (hướng ngang).
  • Bạn có thể tham khảo các option đầy đủ tại đây.

5. Reference

Nguồn: Viblo

Bình luận
Vui lòng đăng nhập để bình luận
Một số bài viết liên quan