Skip to content

Latest commit

 

History

History
118 lines (92 loc) · 4.74 KB

README.rdoc

File metadata and controls

118 lines (92 loc) · 4.74 KB
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!.