Connect the templates you already use and get the finished document back — PDF, Excel or Word. No rewriting your reports, and no reporting server to keep alive.
Whatever your business already sends out — invoices, statements, reports — this produces it, one at a time or a hundred thousand a month.
The one your team built in JasperReports, Crystal Reports or BIRT. As it is, with its logo, its columns and its legal small print. Nobody has to redesign anything.
Your own system sends the customer, the amounts, the dates. It takes one call, and we give your developers the ready-made pieces for it.
PDF, Excel, Word, HTML or CSV. Ready to email, to file away, or to sign. In a few thousandths of a second, so nobody is left waiting.
Your .rpt files keep working, with no SAP licence and no Windows machine kept alive just to print. We took 44 real reports and all 44 came out the other side.
Anything that has to come out looking the same every time, and has to be right.
Thousands of invoices a month, each in the layout its country's tax office expects.
The monthly account statement a bank or a fintech sends every customer, on the day it is due.
The same reports the business already reads, produced on their own instead of by hand each month.
PDF/A for long-term archiving, and digital signatures where the law asks for them.
The same engine underneath. What changes is how much of it you run yourself.
Nothing to install. Your system sends the data, the finished document comes back. We keep it running and you pay for what you use.
Right for you if you want documents coming out this week and would rather not run one more thing.
Everything in the API, and a console for managing templates, a portal for your own customers, and separation between them so each one only ever sees their own documents.
Right for you if you are not just producing your own documents, but offering them to your customers as part of your product.
Installed inside your own application or as a container in your data centre. Your data never leaves the building, and it works with no connection to the outside world at all.
Right for you if the rules you work under, or your own, say the documents cannot leave your premises — banking, government, healthcare.
Your templates are the same in all three, so starting on the API and moving in-house later costs you no rework.
Desde APIs serverless de alta velocidad hasta componentes Java/Quarkus embebidos para banca y redes aisladas.
Para evaluación técnica y microservicios locales.
Para MVPs, startups y aplicaciones de facturación ágil.
Para fintechs en crecimiento y plataformas SaaS multi-inquilino.
Para proveedores autorizados de certificación (PACs) y gran volumen.
Diseñado para Core Banking, entidades gubernamentales y centros de datos que requieren procesamiento local sin salida a internet (ZDR estricto, FIPS 140-2 y firma digital PAdES).
gmr-reports-spring-boot-starterFigures read from our own production pods on Kubernetes (OCI OKE, ARM64 Ampere A1). Method and raw readings are published.
“100% compatible” is a claim. These are measurements, each reproducible by one command, run in CI on every commit. Including the one that is not 100%.
One case per feature, each classed supported, ignored or rejected. The middle one is the one that matters: the template renders without error and the content is missing in silence. We wrote these cases, so 100% here is necessary and not sufficient.
The Eclipse project’s own sample designs. The one that does not render uses
sum as an expression function, which this engine will not
evaluate — it runs a fixed set of operations and no arbitrary code, deliberately.
The reports SAP ships with Business One, interpreted from the proprietary binary with no SAP software anywhere. 81% and not 96%: the six missing strings are all in two budget reports, formula placeholders clipped by boxes their designer sized for the short value the formula resolves to. In the other forty-two, every string reaches the page.
See how much you save on AWS EKS / GCP GKE compute nodes by ditching JVM bloat.
Direct drop-in replacement for legacy reporting engines without rewriting your business templates.
Report expressions are evaluated by a parser with a fixed set of operations. No Groovy, no bytecode generated at runtime, nothing reflected into arbitrary classes.
Templates are pre-compiled to a reflection-free binary at build time, so the first render does not pay for parsing the XML.
Runs JasperReports (.jrxml) and Eclipse BIRT (.rptdesign) as they are. A binary Crystal Reports .rpt is converted server-side by the Migration Toolkit, with nothing to install: 44 of 44 across the reports SAP ships with Business One.
If a broken template is published, the engine keeps serving the last version that compiled rather than failing the request.
Compiled templates are shared between pods through Redis, or a shared volume when self-hosted, so an edit made on one replica reaches the rest.
Documents are rendered in memory and streamed back. The data you send to be rendered is not written to disk.
Credentials per tenant, token-bucket rate limiting, and monthly quota counted in PostgreSQL so every replica enforces the same allowance.
One render call in each. The report type and the output format are arguments rather than separate methods, so a new report type needs no new SDK release.
ZXing drawn straight into PDF vectors. No AWT, no X11, nothing in the container that expects a desktop.
Generates .xlsx through streaming ZIP compression, so a large workbook does not turn into an OutOfMemoryError.
A Helm chart for the engine, plus CRDs for report clusters and for templates.
Or run the whole engine on your own machine, right now:
Add our official starter to your Maven or Gradle build for automatic bean configuration:
<dependency>
<groupId>com.gmr.reports</groupId>
<artifactId>gmr-reports-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
@RestController
public class InvoiceController {
@Autowired
private GmrSpringReportService reportService;
@GetMapping("/invoice.pdf")
public ResponseEntity<byte[]> getInvoice() throws Exception {
byte[] pdf = reportService.renderPdf("invoice", params, items);
return ResponseEntity.ok().contentType(MediaType.APPLICATION_PDF).body(pdf);
}
}
Run locally on Apple Silicon (M1-M4) or deploy to AWS Graviton with zero emulation overhead:
# Run Developer Edition container on port 8080
docker run -p 8080:8080 ghcr.io/gmreserarch-io/gmr-reports:latest
# Run JVM image for standard debugging
docker run -p 8080:8080 ghcr.io/gmreserarch-io/gmr-reports:jvm
# Access interactive sandbox
open http://localhost:8080/console
Compile to an ultra-lightweight native binary that starts in under 300 ms cold, and in about 70 ms once the image is on the node:
# Build GraalVM Native Image
mvn clean package -Pnative -DskipTests
# Run static native executable
./target/gmr-reports-demo-1.0.0-runner
# Starts in under 300ms cold, ~82MB resident
Deploy with horizontal autoscaling (HPA) and shared PVC synchronization:
helm install gmr-reports ./charts/gmr-reports \
--set autoscaling.enabled=true \
--set autoscaling.minReplicas=2 \
--set autoscaling.maxReplicas=20 \
--set persistence.enabled=true \
--namespace gmr-production --create-namespace
Built-in retry logic handling HTTP 429 rate-limit backoff:
// TypeScript / Node.js
import { GmrReportsClient } from "@gmresearch/reports-client";
const client = new GmrReportsClient({ apiKey: "gmr_live_pro_key" });
const pdf = await client.renderDynamicPdf({ jrxml, parameters, data });
# Python
from gmr_reports import GmrReportsClient
client = GmrReportsClient(api_key="gmr_live_pro_key")
pdf_bytes = client.render(template_source=jrxml, parameters=params, data=items)
$F{field}, $P{param}, $V{var} evaluated deterministically.
No. GMR Reports was explicitly engineered to ingest standard .jrxml files generated by Jaspersoft Studio. Bands, expressions, parameters, totals, and barcodes render drop-in without template redesign.
If a corrupted or invalid XML template is uploaded to a shared volume or hot-reloaded during live operations, GMR Reports detects the parsing failure, raises an alert, and seamlessly continues serving the last valid compiled version in memory. Production document flows never crash.
Yes! Our official Docker images on GHCR are multi-architecture (linux/amd64 and linux/arm64). In fact, GMR Reports can run in the OCI Always Free tier consuming less than 1% of the allocated 24GB RAM.
The Community Edition is free for evaluation and development with public artifacts on Maven Central. The Enterprise Edition provides air-gapped self-hosted Kubernetes Helm licenses, unlimited rendering, Redis/Hazelcast cluster sync, FIPS/banking compliance, and 24/7 dedicated engineering SLAs.
Instant Automated Provisioning • Production API Key Issued
Your production API key is ready for immediate document rendering.
curl -H "X-API-Key: gmr_live_..." "https://api.gmrglobe.com/api/reports/render?type=invoice" --output invoice.pdf
GMR Reports Enterprise • >> Science in Action