Prawn en Rails3x A continuación este proyecto permite saber como utilizar la gema prawn en rails3 ver= 3.2.12 cibergrafia: https://github.com/prawnpdf/prawn/wiki/Using-Prawn-in-Rails-3 http://blog.idyllic-software.com/blog/bid/204082/Creating-PDF-using-Prawn-in-Ruby-on-Rails
1-lo primero es instalar la gema de prawn para esto la adicionas a tu Gemfile y posterior ejecutas el comando de instalación de las gemas del proyecto así:
Gemfile gem ‘prawn’
Parado en la raiz de tu proyecto por consola corres este comando $bundle install
2- Cree el siguiente archivo en esta ruta config/initializers/prawn.rb y adicionele la siguiente instrucción require “prawn” #es para las versiones de Prawn 0.9+
3-configuramos el mime type para que nos reconozca el formato :pdf como alias cuando lo invoquemos en cualquier vista y el método en el controller respond_to trabaje correctamente. Esta configuración se la hacemos al archivo que se encuentra en config/initializers/mime_types.rb adicionando la siguiente instrucción: Mime::Type.register_alias “application/pdf”, :pdf
4- cree una carpeta para los documentos pdf de su aplicación dentro app/ para nuestro caso la nombramos reports con el siguiente comando: $ mkdir app/reports
5- Dentro de la carpeta reports cree un archivo order_list.rb el cual contendrá la clase que le permitirá generar su documento pdf, para esto, la clase OrderList será una que herede de la clase Prawn::Document así:
class OrderList < Prawn::Document
#Hay dos formas de hacerlo 1- con el constructor de la clase o 2- con este Método principal que construye el documento pdf y se invoca con el contructor en el controller # 1- Método constructor de la clase Orderlist def initialize(orders, view) super() logo @ordenes = orders @vista = view order_details end # 2- Método que reemplaza el constructor(initialize se elimina), pero implica que en el controller de la clase se invoque así: # output = OrderList.new.to_pdf(@orders,view_context) -> es más larga esta forma. # y también se debe cambiar el formato quitandole el método render así: # format.pdf{ # send_data output, :filename => "orderslist.pdf", :type => "application/pdf", :disposition => "inline" # } def to_pdf(orders, view) logo @ordenes = orders @vista = view order_details render end #Método para definir el logo con su ubicación así como el título del reporte def logo logopath = "#{Rails.root}/app/assets/images/rails.png" image logopath, :width => 50, :height => 64 move_down 10 draw_text "Listado de Ordenes", :at => [150, 575], size: 22 text "Logo" end #Método para dar formato a la salida de los registros def precision(num) @vista.number_with_precision(num, :locale => :es ,:precision => 2, :separator => ",", :delimiter => '.') end #Método para almacenar y mostrar los registros del detalle de la orden def order_item_rows [["Product", "Quantity", "UnitPrice($)", "Amount($)"]] + @ordenes.map do |orden| [ "#{orden.product} ", orden.quantity, "#{precision(orden.unitprice)} ", "#{precision(orden.quantity * orden.unitprice)}" ] end end #Método que imprime la tabla de las ordenes que hay def order_details move_down 80 table order_item_rows, :width => 500 do row(0).font_style = :bold columns(1..3).align = :right self.header = true self.column_widths = {0 => 200, 1 => 100, 2 => 100, 3 => 100} end end
end
6- en el controller de la vista donde desea que aparezca la opción para ver y descargar el pdf realice la instaciación de la clase del reporte en formato pdf y enviele los parámetros correspondientes. Para nuestro caso vamos a realizar un listado de todas las ordenes de pedidos y para esto modificaremos la acción Index de orders_controller así:
def index
@orders = Order.all output = OrderList.new(@orders,view_context) # Aquí instancio el documento pdf respond_to do |format| format.pdf{ send_data output.render, :filename => "orderslist.pdf", :type => "application/pdf", :disposition => "inline" # este parámetro permite ver el documento pdf en linea. } format.html #{ render :text => "<h1>Use .pdf</h1>".html_safe } format.json { render json: @orders } end end
7- Adicionamos el link de visualización descarga del listado de ordenes en la vista de ordenes en la acción Index.html.erb así: <%= link_to “Download Order List”, orders_path(:format => :pdf) %>
8- subar el server y pruebe así: $ rails s
ingrese a su browser a la siguiente dir, así deberá encontrar el link de ingreso a su pdf: localhost:3000/orders
Espero que esta guía les sea de gran ayuda, Saludos!.