majorsilence_reporting
Genera informes RDL en PDF, Excel, CSV y más desde Ruby — vía subproceso, un binario AOT, o FFI Fiddle en proceso. Ruby 3.0+. Sin dependencias de gemas en tiempo de ejecución.
Instalación
Todavía no hay ninguna gema publicada en RubyGems. Cárgala desde el código fuente usando $LOAD_PATH o require_relative:
# Añadir el directorio lib a la ruta de carga $LOAD_PATH.unshift '/path/to/reporting-ruby/lib' # Cargar las tres clases a la vez require 'majorsilence_reporting' # O cargar las clases individualmente require 'majorsilence_reporting/report' require 'majorsilence_reporting/report_aot' require 'majorsilence_reporting/report_native'
Sin dependencias de gemas en tiempo de ejecución. El modo nativo FFI usa la biblioteca estándar integrada de Ruby Fiddle.
Modos de integración
| Clase | Mecanismo | Requisito |
|---|---|---|
| Report | Lanza dotnet RdlCmd.dll vía system(). | Runtime de .NET en el servidor. |
| ReportAot | Lanza un binario RdlCmd autocontenido compilado con AOT vía system(). | Binario AOT desplegado junto a la aplicación. No se necesita runtime de .NET. |
| ReportNative | Carga librdlnative.so en el proceso mediante Fiddle. Usa RdlLibrary.load() para obtener la tabla de funciones enlazada. | Biblioteca nativa + archivos .so asociados en LD_LIBRARY_PATH antes de que arranque Ruby. |
Report — subproceso (dotnet)
require 'majorsilence_reporting/report' rpt = Report.new('/path/to/report.rdl', '/path/to/RdlCmd.dll') rpt.set_connection_string('Data Source=/path/to/data.db') rpt.set_parameter('StartDate', '2026-01-01') # Guardar en disco rpt.export('pdf', '/tmp/output.pdf') # O bien obtener los bytes en memoria (por ejemplo para un controlador de Rails) data = rpt.export_to_memory('pdf') send_data data, type: 'application/pdf', disposition: 'inline'
ReportAot — binario AOT
Misma API que Report, pero apunta a un binario autocontenido. No se necesita runtime de .NET. Habilita formatos de exportación adicionales (xlsx_table, tifb, mht).
require 'majorsilence_reporting/report_aot' rpt = ReportAot.new('/path/to/report.rdl', '/path/to/RdlCmd') rpt.set_connection_string('Data Source=/path/to/data.db') data = rpt.export_to_memory('xlsx_table') # En una respuesta de Rack/Sinatra: [200, { 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }, [data]]
ReportNative — Fiddle FFI
Carga librdlnative.so directamente en el proceso de Ruby mediante la biblioteca integrada Fiddle. No se genera ningún proceso hijo.
require 'majorsilence_reporting/report_native' # Cargar una sola vez al iniciar. Precarga los archivos .so/.dylib asociados y define RDLNATIVE_LIB_DIR. lib = RdlLibrary.load('/path/to/librdlnative.so') rpt = ReportNative.new(lib, '/path/to/report.rdl') rpt.set_connection_string('Data Source=/path/to/data.db') data = rpt.export_to_memory('pdf') # devuelve una String binaria
LD_LIBRARY_PATH debe incluir el directorio de la biblioteca nativa antes de que arranque Ruby. RdlLibrary.load() define ENV['RDLNATIVE_LIB_DIR'] y precarga bibliotecas asociadas con Fiddle.dlopen, pero no puede actualizar retroactivamente LD_LIBRARY_PATH para el proceso en ejecución.
API principal
Las tres clases comparten la misma interfaz:
| Método | Descripción |
|---|---|
| set_connection_string(cs) | Establece la cadena de conexión a la base de datos. Llamar antes de export. |
| set_parameter(name, value) | Define un parámetro de informe con nombre. Ambos argumentos son cadenas. Se puede llamar tantas veces como sea necesario. |
| export(type, path) | Renderiza el informe y escribe la salida en path en disco. |
| export_to_memory(type) | Renderiza y devuelve la salida como una String binaria (formatos binarios) o una String UTF-8 (formatos de texto como CSV, XML, HTML). |
Conjuntos de datos en memoria
ReportNative permite suministrar datos completamente en memoria mediante add_data() — sin necesidad de conexión a una base de datos. Pasa un nombre de conjunto de datos y un array de hashes donde cada valor es una cadena.
rpt.add_data('SalesData', [ { 'Product' => 'PDF Library Pro', 'Revenue' => '1200.00', 'Units' => '3' }, { 'Product' => 'Report Designer', 'Revenue' => '250.00', 'Units' => '1' }, { 'Product' => 'Support (12 mo.)', 'Revenue' => '500.00', 'Units' => '1' }, ]) data = rpt.export_to_memory('pdf')
add_data() solo está disponible en ReportNative, no en Report ni ReportAot. Todos los valores de campo deben ser cadenas. El nombre del conjunto de datos debe coincidir con un conjunto de datos definido en el archivo .rdl.
Formatos de exportación
| Cadena de formato | Salida | Disponible en |
|---|---|---|
pdf | Todos los modos | |
csv | Texto CSV | Todos los modos |
xlsx | Libro de Excel | Todos los modos |
xml | Datos XML | Todos los modos |
rtf | Rich Text Format | Todos los modos |
tif | Imagen TIFF (color) | Todos los modos |
html | HTML | Todos los modos |
xlsx_table | Excel (estilo tabla) | Solo ReportAot + ReportNative |
tifb | Imagen TIFF (blanco y negro) | Solo ReportAot + ReportNative |
mht | Archivo web MHTML | Solo ReportAot + ReportNative |