2012-04-02 30 views
5

Tôi đang cố gắng tạo báo cáo PDF với Prawn, tôi có thể làm cho báo cáo về hành động hiển thị dễ dàng đủ bằng cách chuyển ID duy nhất nhưng tôi muốn tạo với mọi bản ghi trong đó. Giống như trang chỉ mục giàn giáo chuẩn. Sử dụng đường ray sẽ trông giống như sau:PDF trên Rails & Prawn PDF - Tạo danh sách khách hàng

<% @customer.each do |customer| %> 
<%= customer.id %> 
<%= customer.name %> 
<%end%> 

Dễ dàng!

Nhưng tôi không chắc chắn làm thế nào để làm điều này với tôm ..

Cái gì như:

def index 
@customer = Customer.all 
    respond_to do |format| 
    format.html 
    Prawn::Document.generate("customer_list.pdf") do |pdf| 
    pdf.text "#{@customer.id} " 
    pdf.text "#{@customer.name} " 
     end 
    end 
end 

Mà rõ ràng là không đúng.

Bất kỳ ý tưởng nào? Cảm ơn bạn.

+0

Tôi nhận ra bạn đang hỏi về Tôm nhưng tôi đã có kinh nghiệm tốt hơn bằng cách tạo ra các báo cáo của tôi dưới dạng HTML/CSS và sau đó chuyển đổi nó sang PDF, bằng cách sử dụng ' ứng dụng wkhtmltopdf'. Có một viên đá quý bao bọc được gọi là "PDFKit' mà làm việc với nó dễ dàng. wkhtmltopdf: http://code.google.com/p/wkhtmltopdf/ và pdfkit: https://github.com/pdfkit/PDFKit để tạo các báo cáo phức tạp, tôi thấy dễ dàng hơn khi tạo chúng trong HTML thay vì làm việc với PDF/Tôm trực tiếp. –

Trả lời

5

Thật dễ dàng để làm với Tôm, Gemfile => đá quý 'tôm,

cho phép nói rằng bạn có khách hàng mô hình:

customers_controller.rb

def show 
    @customer = Customer.find(params[:id]) 
    respond_to do |format| 
    format.html 
    format.pdf do 
     pdf = CustomerPdf.new(@customer) 
     send_data pdf.render, filename: "customer_#{id}.pdf", 
           type: "application/pdf", 
           disposition: "inline" 
    end 
    end 
end 

sau đó chỉ cần tạo pdf thư mục dưới ứng dụng thư mục, và tạo file customer_pdf.rb

class CustomerPdf< Prawn::Document 

    def initialize(customer) 
    super() 
    @customer = customer 
    text "Id\##{@customer.id}" 
    text "Name\##{@customer.name}" 
    end 

end 

show.html.erb

<div class="pdf_link"> 
    <%= link_to "E-version", customer_path(@customer, :format => "pdf") %> 
    </div> 

EDIT:

và đừng quên bao gồm pdf đến config/initializers/mime_types.rb

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

Sẽ không hiển thị tệp PDF này cho chỉ một khách hàng từ đường dẫn chương trình không? Tôi đang cố gắng để có được một danh sách của tất cả các khách hàng trong một bảng. Cảm ơn. – nicktabs

+0

Có, ví dụ này hiển thị thêm 'khách hàng # show' thay vì' khách hàng # index' nhưng ý tưởng là tương tự.Thay vì lấy một đối tượng 'customer' duy nhất trong' CustomerPdf', chỉ cần lấy mảng khách hàng của bạn, lặp qua từng đối tượng và gọi cùng phương thức 'text()', sau đó nối thêm một dòng mới. –

+0

tất nhiên ý tưởng sẽ tương tự –

2

Tôi nghĩ rằng giải pháp tốt về vấn đề của bạn là tùy chỉnh renderer. Cách tiếp cận tốt nhất được mô tả bởi Jose Valim (nhà phát triển cốt lõi Rails) trong số book của mình. Sự khởi đầu của chương đầu tiên có sẵn miễn phí here. Chương này thực sự là những gì bạn cần.

1

này làm thế nào tôi làm điều đó:

class CustomerPdf< Prawn::Document 

def initialize(customer) 
    super(page_size: "A4", page_layout: :portrait) 
    @customers = customer 
    bullet_list 
end 

def bullet_list 
    @customers.each do |customer| 
     text "•#{customer.id}- #{customer.name} ", style: :bold 
    move_down 5 
    end 
end 

end