miércoles, 24 de febrero de 2016

Generar un docx desde Rails

Una de las bondades de tener bases de datos y aplicaciones web que los gestionen es que aquellos pueden ser presentados de infinidad de formas. Pensemos por ejemplo en la generación de un informe que enviar a un cliente, presupuesto, etc... Los formatos estrella son PDF y documento de texto tipo DOC/DOCX (para Word o Libreoffice). En este post quiero dar unas directrices sencillas para que cualquiera pueda generar un documento tipo DOC o DOCX desde su aplicación Rails. Básicamente vamos a generar el documento y enviarlo al cliente web.


Para ello usaremos la gema "Caracal". La documentación oficial la puedes encontrar a partir de la URL de github https://github.com/trade-informatics/caracal.

Como es habitual en Rails, la incluimos en el Gemfile y ejecutamos el bundle install.


Generación de documento word

En la documentación de la gema hay ejemplos suficientes. Aquí muestro un ejemplo adaptado que podéis incluir tal cual en vuestro controller

def genera_word
  @items = Item.all
  Caracal::Document.save 'example.docx' do |docx|

    #Tamaño de página 
    docx.page_size do
          width   12240     # page width in twips.
          height  15840     # page height in twips.
    end

    #Fijamos los márgenes
    docx.page_margins do
      left    720     # left margin in twips.
      right   720     # right margin in twips.
      top     1440    # top margin in twips.
      bottom  1440    # bottom margin in twips.
    end

    #Colocamos el numero de página
    docx.page_numbers true do
      align :right    # accepts :left, :center, and :right.
    end
  
    #Cambiamos la fuente por defecto
    docx.font do
      name 'Droid Serif'
    end
  
    docx.h1 'Listado de items'
    cuenta = 0
    @items.order(:orden).each do |i|
      cuenta +=1
      docx.page if (cuenta%20==0)  #Página cada 20 lineas 
      docx."Item #{i.name}"
      docx.p  #Linea en blanco
    end
  end #Caracal
end #genera_word

Si has usado el nombre de función que te he propuesto acuérdate de incluir la ruta en config/routes.rb.

Descarga en el cliente

Tan sencillo como usar send_file. El método invocado en el controller contendrá algo como lo siguiente que envía el fichero al cliente.

def get_info_word
  #....

  send_file("example.docx" ,
     :filename      =>  "example.docx",
     :type          =>  'application/msword')
end
Ni qué decir tiene que send_file tiene diferentes opciones para optimizar la descarga. Aquí hemos mostrado la formulación básica.

Muchos lo tenéis claro, pero por si acaso, me comprometo mostrar en otro post como hacer esto mismo desde un script RUBY obviando el framework Ruby on Rails.

3 comentarios:

  1. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  2. hola que tal yo tengo un proyecto en el cual debo generar una comisión esta hecha en word desde mi mi pagina web en la cual ya debe de estar la plantilla de word y solo el usuario bebe llenar los campos faltantes y despues de esto poder descargarlo. Espero me ayudes a como hacer esto mas o menos darme la idea.

    ResponderEliminar
    Respuestas
    1. Hay una gema que se llama docx_replace, sirve para reemplazar variables dentro de un docx ya existente. Espero te sirva.

      Eliminar