El SysAdmin del 3er Mundo

todo lo que expliqué mientras nadie prestaba atención

prawn, pdf con ruby

| Comments

De siempre, los usuarios que fueron forzados a abandonar MSAcces por un motivo u otro; sienten un incontenible necesidad por los “informes”.

A la hora de imprimir, muchos usaurios no entienden que un HTML se imprima. Incluso, habiéndoles hecho un javascript que muestra el diálogo de impresión, simplemente lo cierra y me preguntan “¿y ahora que hago con esto?”

En recientes diálogos con un bibliotecario (que hereda la clase Usuario) me dijo que la gente entiende más de imprimir PDF.

Hacer un PDF me pareció una tare bastante compleja; y lo es, pero Prawn lo hace de una manera casi increíble. Para no aburrirte con el cuento, te mostraré como montarlo arriba del tren.

EjemploController que tu conoce:

“ejemplo_controller.rb”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# el controlador bin ban bin ban
class EjemploController < ApplicationController

   def accion # la acción, como se llame

      # a según el sapo, la pedrá
      respond_to do |format|

         # tírame el pdf
         format.pdf do

            # tráeme al animal
            require 'prawn'

            # créame un nuevo documento pdf
            @pdf=Prawn::Document.new

            # tírame el banner, el H1 como quien dice, tamaño de fuente 25px en negrita
            @pdf.formatted_text [ {text: 'El título del documentos',size: 25,styles: [:bold]} ]

            # hazle una rallita horizontal debano al header
            @pdf.stroke_horizontal_line 0,235

            # mueve el cursor pa abajo
            @pdf.move_down 20

            # la variable cuerpo contiene un texto laaaaaaargooo en HTML
            # un HTML muy rudimentario, Prawn lo interpresta, por ejemplo
            # las cláusulas <strong>
            @pdf.text @cuerpo, inline_format: true

            # por jemeplo, itera en el modelo User y escribe sus nombres
            for user in User.all
               @pdf.text "Nombre: #{user.nombre}", inline_format: true
               @pdf.move_down 10
               @pdf.text "Edad: #{user.edad}", inline_format: true
               @pdf.move_down 30
            end

            # tírala!!!
            send_data @pdf.render, filename: "solicitud.pdf"

         end # format

      end # respond_to

   end # def

end # class

Vamos a dividir en sílabas:

Línea 7

Rails, la acción responde a múltiples mime-types

Línea 10

Rails, application/pdf responde a la extensión PDF format.pdf do

Línea 13

Carga la librería, sí, ya se que en Rails debes hacer eso en un initializer, de cualquier manera, aún, luego de haberlo agregado a tu Gemfile, no te olvides de requerirla, ya sea en un initializer o en el controlador.

Línea 16

Crea un nuevo PDF y almacénalo en la variable de instancia @pdf

Línea 19

El método formatted_text, recibe como argumento un array de hashes

Cada array en un bloque de texto y contiene un hash. La clave :text contiene el texto a renderizar, :size el tamaño y :style el estilo de fuente.

Línea 22

Trazar línea horizontal, el método stroke_horizontal_line recibe como argumento, de donde, a donde debe trazar la línea.

Pasemos a la línea 41

El método render devuelve el PDF. Si lo sacas con puts verás el PDF crudo. Podrías también tirarlo pa un fichero así:

“fulanito.pdf”
1
   IO.write 'fulanito.pdf',@pdf.render

A los usuarios le encantan los PDF, hazlos feliz ;)

Existen dos tipos de personas,
las que hacen lo que le dicen; y,
las que dicen lo que hay que hacer.

Lázaro Armando

Si este artículo te resultó interesante, considere donar 0.003 BTC: 1LgL9cfT2StNk9gdedMJZseMnKJCEgQJdQ

Comments