+1

Gem wicked_pdf

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


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í