2012-04-02 8 views
5

Estoy tratando de producir un informe PDF con gambas, puedo hacer que informe sobre una acción de muestra con la suficiente facilidad pasando el identificador único pero quiero producir uno con cada registro en ella. Como una página de índice de andamios de rieles estándar. Usando rieles se vería así:Ruby on Rails & Prawn PDF - Crear lista de clientes

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

Fácil!

Pero no estoy seguro de cómo hacer esto con gambas ..

Algo así como:

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 

que claramente no es el adecuado.

¿Alguna idea? Gracias.

+0

que darse cuenta de que estás preguntando acerca de gambas pero he tenido mucho mejor experiencia mediante la generación de mis informes como HTML/CSS y luego convertirlo a PDF, usando el ' Aplicación wkhtmltopdf' Hay una gema envoltura llamada 'PDFKit' que hace que trabajar con ella sea fácil. wkhtmltopdf: http://code.google.com/p/wkhtmltopdf/ y pdfkit: https://github.com/pdfkit/PDFKit para generar informes complejos. Me resulta mucho más fácil generarlos en HTML en lugar de trabajar con PDF/Gambas directamente. –

Respuesta

5

Es fácil de hacer con gambas , Gemfile => joya 'gamba', paquete

Digamos que tiene cliente modelo:

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 

a continuación, basta con crear archivos PDF carpeta bajo las aplicaciones directorio y crear el archivo 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:

y no se olvide de incluir pdf en config/inicializadores/mime_types.rb

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

¿Esto no mostrará un PDF para un solo cliente de la ruta del programa? Estoy tratando de obtener una lista de cada cliente en una mesa. Gracias. – nicktabs

+0

Sí, este ejemplo más muestra 'customers # show' en lugar de' customers # index', pero la idea es similar.En lugar de tomar un solo objeto 'cliente' en' CustomerPdf' simplemente tome su conjunto de clientes, itere sobre cada uno y llame al mismo método 'text()', luego agregue una nueva línea. –

+0

por supuesto, la idea será similar –

2

Creo que la buena solución de su problema es intérprete personalizado. El mejor enfoque fue descrito por José Valim (desarrollador de! Rails core) en su book. El comienzo del primer capítulo está disponible de forma gratuita here. Este capítulo es realmente lo que necesitas.

1

Esto cómo lo hago:

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