Export PDF with gem prawn Rails
Bài đăng này đã không được cập nhật trong 7 năm
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
-
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é
-
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
-
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"
-
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).width = 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 "\n" text I18n.t("manager.work_report.project_name") + @project.positionname.to_s text "\n" text I18n.t("manager.work_report.advisor") + @project.staff.username.to_s text "\n" text I18n.t("manager.work_report.bisiness_plan") text "\n" [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
Xia xào xia xào
All rights reserved