12/08/2018, 14:48

Export PDF with gem prawn Rails

Xin chào mọi người, hôm nay mình xin giới thiệu tới các bạn một cách đơn giản để export file có định dạng pdf trong Rails. Chúng ta thường bắt gặp chức năng export(download) file pdf ở rất nhiều ứng dụng Web hiện nay, vậy nên thực hiện công việc này với một lập trình viên cũng là một kĩ năng cần ...

Xin chào mọi người, hôm nay mình xin giới thiệu tới các bạn một cách đơn giản để export file có định dạng pdf trong Rails. Chúng ta thường bắt gặp chức năng export(download) file pdf ở rất nhiều ứng dụng Web hiện nay, vậy nên thực hiện công việc này với một lập trình viên cũng là một kĩ năng cần thiết. Đối với lập trình viên Ruby on Rails, mọi chuyện trở nên dễ dàng hơn với một số gem hổ trợ. Và trong bài viết "lày", chúng ta sẽ thao tác chúng với một gem phổ biến nhất cho export pdf: Prawm Gem

  1. Cài đặt và bundle Gem này mình vẫn cài đặt ở Gem file và "bunlde install" bình thường các bạn nhé

  2. Cấu hình phụ Với một số vơ-sần của prawn, ta cần một "dòng kinh" ở mine_types.rp Mime::Type.register "application/pdf", :pdf

  3. Chiến nó 3.1 Mình cần một link_to để nhận request từ client nhé mọi người

    <%= link_to t("manager.work_report.pdf"), new_manager_work_report_path(format: "pdf"), class: "btn btn-default" %>

       (Link_to của mình trỏ về action new của work_report_controller nhé)
    

    3.2 Mình lại cần thêm một controller để xử cái request trên

      `respond_to do |format|
           format.html
           format.pdf do
             @business_plans = WorkPlan.all
             pdf = ExportWorkPlanPdf.new(@business_plans, view_context, @project)
             send_data pdf.render, filename: "Business_plan_#{I18n.l(DateTime.now, format: :short_date).to_s}.pdf",
               type: "application/pdf"
           end
         end`
         
         Mình sẽ xơi từng dòng một nhé! ;)
             `@business_plans = WorkPlan.all`: dòng ni là lấy list work_plan ra để làm việc thôi, ở file pdf của mình cần thông tin của nó với chú `@project` 
             
              `pdf = ExportWorkPlanPdf.new(@business_plans, view_context, @project)
               send_data pdf.render, filename: "Business_plan_#{I18n.l(DateTime.now, format: :short_date).to_s}.pdf",
                   type: "application/pdf"`: Mình có một service tên ExportWorkPlanPdf (tạo mới nó, bỏ thêm mấy cái tài nguyên mình cần cho file pdf để qua 
               đó có cái mà xuất ra :D. Tên file pdf của mình là  "Business_plan_#{I18n.l(DateTime.now, format: :short_date).to_s}.pdf"
    
  4. Về phía Service Hàm tạo của Service nè def initialize(business_plans, view, project) super() @business_plans = business_plans @view = view @project = project business_plan_line_items end Thêm mấy cái action mình dùng để định dạng file pdf, các bạn có thể tham khảo để đưa ra một file cơ bản

                 `def business_plan_line_items
                     move_down 20
                     table business_plan_line_item_rows do
                       self.row_colors = ["DDDDDD", "FFFFFF"]
                       row(0).awidth = 95
                       self.header = true
                     end
                   end`
                 
                 
    
               def business_plan_line_item_rows
                 set_font_ttf
                 text I18n.t("manager.work_report.com_name") + @project.trnorder.company_name.to_s
                 text "
    "
                 text I18n.t("manager.work_report.project_name") + @project.positionname.to_s
                 text "
    "
                 text I18n.t("manager.work_report.advisor") + @project.staff.username.to_s
                 text "
    "
                 text I18n.t("manager.work_report.bisiness_plan")
                 text "
    "
                 [IMPORT_BUSINESS_PLAN_COLUMNS] +
                 @business_plans.map do |item|
                   [item.log_date, item.working_time(item.to, item.from),
                     item.content, item.trip_fee, item.note]
                 end
    
               end`
               
               
               `def set_font_ttf
                     font_families.update(
                       "mona" => {
                       normal: Rails.root.join("app/assets/fonts/monafont-ttf-2.90/mona.ttf").to_s
                       }
                     )
                     font "mona"
                   end`
                   
                   Gộp mấy method nớ lại là mình có được một service hoàn chỉnh đó
                   Tại font chữ mặc định của rails không hổ trợ utf-8 nên mình có thêm hàm cài đặt font chữ này nữa nhé (gọi nó ở trên kìa)
    

Á CHẾT, QUÊN MẤT: Vì bài viết trên mình định dạng file pdf theo table nên các bạn nhớ cài thêm cho mình gem prawn-table nữa nhé! Bài mình viết thế chạy tốt rồi đó, yên tâm             </div>
            
            <div class=

0