1. Lleïr Borràs & Fernando Martínez
El Ferrocarril contra
Los Árboles Muertos
2. ¿Quiénes?
Lleïr Borràs Metje Fernando Martínez de la Cueva
Web: Web:
lleirborras.blogspot.com www.sic-sl.com/fmc
twitter: twitter:
@lleirborras @oinak
Github: LinkedIn:
github.com/lleirborras www.linkedin.com/in/fernandomc
Trabajo: Trabajo:
www.hesperides.cat www.lciberica.es y www.sic-sl.com
Producto:
www.lciberica.es/productos/psp
3. «Rails es un Framework web...
No lo decimos nosotros sino ellos
4. ...en un mundo de papel»
Nuestra vida esta rodeada de objetos hechos de papel o
relacionados con él y es muy difícil dejarlo atrás de golpe:
Libros
Títulos de propiedad
Contratos
Periódico
Lista de la compra...
6. ¿Por qué?
«You can't grep dead trees...
... but you can read them in
WC bed»
Los árboles muertos llegan donde aún no llegan las
pantallas.
Esto puede que mejore en el futuro a medio plazo con la
tinta electrónica, o iniciatvas como Google Editions, el
Crunchpad, los nuevos dispositivos Android...
8. ¿To PDF or not To PDF? . . .
. . . that's the question
¿ ?
9. ¿Que tener en cuenta?
Rapidez/facilidad (subjetiva) de desarrollo
Facilidad (subjetiva) de modificar, mantener
Rendimiento en máquina (aprox.)
Precisión de la salida (respecto a esperado/modelo)
Soporte de Parciales
Soporte de Imágenes
Control de rupturas (Saltos de Página)
Soporte/control de tipografías
Posibilidad de validación
Compatibilidad con versiones Rails
Compatibilidad con navegadores
10. HTMLDoc Gem
Web: http://www.htmldoc.org
Gem: http://htmldoc.rubyforge.org
✔ HTML (plantillas existentes, mantenimiento)
✘ No soporta HTML > 3.2 (maquetación, validación)
✘ Paginación poco ortodoxa (tags especiales)
✘ Ejecutable aparte (rendimiento, deploy)
✘ Licencia doble (uso comercial*)
* IANAL: No somos abogados
11. RTeX versiones 1 y 2
Web: http://rtex.rubyforge.org/
Versión 1 (Rails 1.x.x) Versión 2 (Rails >= 2.0.1)
✘ Sin partials ✔ Con partials
✘ Sin soporte IDE (¿alguien?) ✘ Sin soporte IDE (¿alguien?)
✘ Congelado (pero opensource) ✔ Activo
✔ Maquetación ortotipográfica
✔ Estilo uniforme
✘ Lenguaje/dominio nuevo (maquetador web)
✘ Posicionamiento difícil de precisar (recortable)
✘ Problemas con las imágenes (PNG, JPEG y GIF)
✘ Ejecutable externo (deploy de extensiones de LaTeX...)
✘ LaTeX pensado para lo contrario (diseño vs contenido)
12. Jasper Reports
Web: http://jasperforge.org/projects/jasperreports
Rails: wiki.rubyonrails.org/rails/pages/HowtoIntegrateJasperReports
✔Diseño por IDE (propio o plugin Eclipse/NetBeans)
✔Posicionamiento/maquetación (muy) preciso
✘ Lenguaje/dominio nuevo
✘ Requiere Java
✘ Funcionalidad limitada (cuando/como lo probamos)
✘ No se puede testear la vista
15. $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', '..','lib'))
require 'prawn'
Prawn::Document.generate("bounding_boxes.pdf") do
bounding_box [100,600], :width => 200 do
move_down 10
text "The rain in spain falls mainly on the plains " * 5
move_down 20
stroke do
line bounds.top_left, bounds.top_right
line bounds.bottom_left, bounds.bottom_right
end
end
bounding_box [100,cursor], :width => 200, :height => 200 do
stroke do
circle_at [100,100], :radius => 100
line bounds.top_left, bounds.bottom_right
line bounds.top_right, bounds.bottom_left
end
bounding_box [50,150], :width => 100, :height => 100 do
stroke_bounds
end
end
end
17. /app/controllers/ejemplo_controller.rb
acts_as_fying_saucer
def metodo
#lógica del controlador
respond_to do |format|
format.pdf do
render_pdf :template => 'ejemplo/metodo',
:send_file => { :filename => 'metodo.pdf' }
end
end
end
/app/views/ejemplo/metodo.haml
!!!XML
!!!strict
%html{html_attrs('es-es')}
%head
%title= @documento.datos[:titulo]
...
18. (Lleïr's) Render as PDF
PHP: http://html2pdf.fr
Rails: http://github.com/lleirborras/render_as_pdf
☹ Necesita PHP (>=4) en la máquina
☹ Consume mucha RAM en pdf's grandes (>250 pg.)
☹ Algunos tags especiales (<page_header>, <page_footer>, ...)
☺ Admite HTML 4.01 + CSS 2
☺ Cabeceras y pies de página dinámicos.
☺ Admite muchos formatos de imágen (jpg, png, gif, ...)
☺ Admite códigos de barras
☺ Plantillas y helpers
☺ MUY rápido de maquetar (HTML)
19. /app/controllers/ejemplo_controller.rb
def metodo
respond_to do |format|
format.html
format.pdf do
pdf_data = render_as_pdf :template => "/ejemplo/metodo.html.haml",
:layout => false
send_data pdf_data, { :type => "application/pdf",
:filename => "nombre.pdf" }
end
end
end
/app/views/ejemplo/metodo.haml
!!!XML
!!!strict
%html{html_attrs('es-es')}
%head
%title= @documento.datos[:titulo]
...
20. (Oinak's) Fly without the saucer
☑ No requiere Java/PHP/Plugins... (rendimiento, deploy)
☑ Plantillas XHTML Válido (nativas de rails)
☑ helpers, partials, reutilización...
☑ maquetadores web
☒ Renderizado: (limitados por CSS/soporte browsers)
☒ en.wikipedia.org/wiki/Comparison_of_layout_engines_(Cascading_Style_Sheets)
☑ Un modelo no AR (lib/módulo) con todos los datos (hash)
☑ testeos unitarios (thin controller)
☑ eficiencia (sin procesos extra)
☑ mantenimiento (por ejemplo: haml + sass)
21. /lib/impresos/ejemplo.rb
module Impresos
class Ejemplo
attr_accessor :datos
def initializer(*params)... #recaba el hash :datos
def render_options()... #decide la plantilla
/app/controllers/ejemplo_controller.rb
def documento
if @documento = Impresos::Ejemplo.new(params)
render @documento.render_options
else
render(:nothing => true,:status => 404)
end
end
/app/views/ejemplo/modelo/variante/documento.haml
!!!XML
!!!strict
%html{html_attrs('es-es')}
%head
%title= @documento.datos[:titulo]
...
22. (Lleïr's version) wicked_pdf
wkhtmltopdf: http://code.google.com/p/wkhtmltopdf/
Rails: http://github.com/lleirborras/wicked_pdf
☹ Necesita wkhtmltopdf (webkit)
☺ En la web de wkhtmltopdf ya hay versiones compiladas para
GNU/Linux, Mac Os y windows
☺ No require PHP, Java, ...
☺ Plantillas y helpers
☺ MUY rápido de maquetar (HTML, haml, ...)
☺ Admite Javascript
☺ MUY rápido en hacer el render
☺ Soporta para algunos tags de CSS3
23. $ script/plugin install git://github.com/lleirborras/wicked_pdf.git
$ script/generate wicked_pdf
/config/initializers/wicked_pdf.rb
WICKED_PDF = {
:exe_path => '/usr/local/bin/wkhtmltopdf',
:layout => 'pdf.html'
}
/app/controllers/ejemplo_controller.rb
def show
respond_to do |format|
format.pdf do
render :pdf => "name",
:show_as_html => !params[:debug].blank?
end
end
end
/app/views/ejemplo/show.pdf.erb
<h1>Hola en pdf!</h1>