majorsilence_reporting
Générez des rapports RDL en PDF, Excel, CSV et plus depuis Ruby — via sous-processus, un binaire AOT, ou une FFI Fiddle en processus. Ruby 3.0+. Aucune dépendance gem runtime.
Installation
Aucune gem n'est encore publiée sur RubyGems. Chargez depuis les sources via $LOAD_PATH ou require_relative :
# Ajouter le répertoire lib au chemin de chargement $LOAD_PATH.unshift '/path/to/reporting-ruby/lib' # Charger les trois classes d'un coup require 'majorsilence_reporting' # Ou charger les classes individuellement require 'majorsilence_reporting/report' require 'majorsilence_reporting/report_aot' require 'majorsilence_reporting/report_native'
Aucune dépendance gem en runtime. Le mode natif FFI utilise la bibliothèque standard intégrée de Ruby Fiddle.
Modes d'intégration
| Classe | Mécanisme | Prérequis |
|---|---|---|
| Report | Lance dotnet RdlCmd.dll via system(). | Runtime .NET sur le serveur. |
| ReportAot | Lance un binaire RdlCmd autonome compilé en AOT via system(). | Binaire AOT déployé aux côtés de l'application. Aucun runtime .NET requis. |
| ReportNative | Charge librdlnative.so en processus via Fiddle. Utilisez RdlLibrary.load() pour obtenir la table de fonctions liée. | Bibliothèque native + fichiers .so associés sur LD_LIBRARY_PATH avant le démarrage de Ruby. |
Report — sous-processus (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') # Enregistrer sur le disque rpt.export('pdf', '/tmp/output.pdf') # Ou obtenir les octets en mémoire (par ex. pour un contrôleur Rails) data = rpt.export_to_memory('pdf') send_data data, type: 'application/pdf', disposition: 'inline'
ReportAot — binaire AOT
Même API que Report, mais cible un binaire autonome. Aucun runtime .NET requis. Débloque des formats d'export supplémentaires (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') # Dans une réponse Rack/Sinatra : [200, { 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }, [data]]
ReportNative — FFI Fiddle
Charge librdlnative.so directement dans le processus Ruby via la bibliothèque intégrée Fiddle. Aucun processus enfant n'est lancé.
require 'majorsilence_reporting/report_native' # Charger une seule fois au démarrage. Précharge les fichiers .so/.dylib associés et définit 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') # renvoie une String binaire
LD_LIBRARY_PATH doit inclure le répertoire de la bibliothèque native avant le démarrage de Ruby. RdlLibrary.load() définit ENV['RDLNATIVE_LIB_DIR'] et précharge les bibliothèques associées avec Fiddle.dlopen, mais ne peut pas modifier rétroactivement LD_LIBRARY_PATH pour le processus en cours.
API principale
Les trois classes partagent la même interface :
| Méthode | Description |
|---|---|
| set_connection_string(cs) | Définit la chaîne de connexion à la base de données. À appeler avant export. |
| set_parameter(name, value) | Définit un paramètre de rapport nommé. Les deux arguments sont des chaînes. Peut être appelée autant de fois que nécessaire. |
| export(type, path) | Génère le rapport et écrit la sortie vers path sur le disque. |
| export_to_memory(type) | Génère et renvoie la sortie sous forme de String binaire (formats binaires) ou String UTF-8 (formats texte tels que CSV, XML, HTML). |
Jeux de données en mémoire
ReportNative permet de fournir des données entièrement en mémoire via add_data() — aucune connexion à une base de données requise. Passez un nom de jeu de données et un tableau de hash où chaque valeur est une chaîne.
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() n'est disponible que sur ReportNative, pas sur Report ni ReportAot. Toutes les valeurs de champs doivent être des chaînes. Le nom du jeu de données doit correspondre à un jeu de données défini dans le fichier .rdl.
Formats d'export
| Chaîne de format | Sortie | Disponible dans |
|---|---|---|
pdf | Tous les modes | |
csv | Texte CSV | Tous les modes |
xlsx | Classeur Excel | Tous les modes |
xml | Données XML | Tous les modes |
rtf | Rich Text Format | Tous les modes |
tif | Image TIFF (couleur) | Tous les modes |
html | HTML | Tous les modes |
xlsx_table | Excel (style tableau) | ReportAot + ReportNative uniquement |
tifb | Image TIFF (noir & blanc) | ReportAot + ReportNative uniquement |
mht | Archive web MHTML | ReportAot + ReportNative uniquement |