Use Majorsilence Reporting
from any language
Python, PHP, and Ruby wrappers let you render RDL reports into PDF, Excel, CSV, HTML, and more — without writing any .NET code. Each language ships three integration modes to match your deployment constraints.
Python 3.10+. subprocess, AOT binary, or ctypes in-process FFI. True in-memory buffer rendering in native mode.
Read the docs → PHPPHP 8.1+. Composer package. proc_open subprocess and PHP FFI native modes. Works with Laravel, Symfony, or plain PHP.
Read the docs → RubyRuby 3.0+. Zero runtime gem dependencies. Fiddle FFI for in-process native rendering. Works with Rails, Sinatra, or plain Ruby.
Read the docs → RustRust 2021 edition. libloading FFI only — no subprocess mode. Thread-safe Arc handle. True in-memory buffer. All 10 formats. One dependency.
Read the docs →Integration modes
Every language binding ships three classes that cover different deployment scenarios:
| Mode | How it works | When to use |
|---|---|---|
| Report | Launches dotnet RdlCmd.dll as a child process via the system shell. Requires the .NET runtime to be installed on the server. |
Simplest setup — good for development or when .NET is already on the box. |
| ReportAot | Launches a self-contained AOT-compiled binary (RdlCmd). No .NET runtime required at all — the binary includes everything. |
Production deployments where you can't install the .NET runtime. Copy the binary alongside your app. |
| ReportNative | Loads librdlnative.so in-process via native FFI (ctypes / PHP FFI / Fiddle). No child process spawned. |
Lowest latency, highest throughput. Required for in-memory rendering without writing temp files (Python only currently). |
Feature comparison
| Feature | Python | PHP | Ruby | Rust |
|---|---|---|---|---|
| Min language version | 3.10+ | 8.1+ | 3.0+ | 1.65+ |
| Package manager | pip | Composer | no gem yet | no crate yet |
| Runtime dependencies | none | none | none | libloading |
| subprocess (dotnet) mode | ✓ | ✓ | ✓ | – |
| AOT binary mode | ✓ | ✓ | ✓ | – |
| Native FFI mode | ✓ | ✓ | ✓ | ✓ only |
add_data() in-memory datasets | native only | native only | native only | ✓ |
| True in-memory buffer (no temp file) | ✓ native | – | – | ✓ |
| Thread-safe library handle | – | – | – | Arc-backed |
| xlsx_table, tifb, mht formats | AOT + native | AOT + native | AOT + native | all modes |
Supported export formats
All three language bindings support the same core format strings passed to export() / export_to_memory():
| Format string | Output | Available in |
|---|---|---|
pdf | All modes | |
csv | CSV text | All modes |
xlsx | Excel workbook | All modes |
xml | XML data | All modes |
rtf | Rich Text Format | All modes |
tif | TIFF image (colour) | All modes |
html | HTML | All modes |
xlsx_table | Excel (table style) | AOT + Native only (Python/PHP/Ruby); all modes (Rust) |
tifb | TIFF image (black & white) | AOT + Native only (Python/PHP/Ruby); all modes (Rust) |
mht | MHTML web archive | AOT + Native only (Python/PHP/Ruby); all modes (Rust) |