Paragon

Reports your developers can actually write.

A template is an ordinary HTML page โ€” your CSS, your charting library, your fonts. Paragon binds JSON into it and returns a PDF, a Word document or a PowerPoint deck at exact fidelity, with no Office on the server and no network call while it renders.

One method, three formats

The consuming application keeps a folder of exported templates and calls one method. It never loads a template, resolves a path, or learns how the folder is laid out.

builder.Services.AddParagon(options =>
{
    options.RootPath    = "ParagonTemplates";
    options.LicensePath = "paragon.lic";
});

var report = await engine.GenerateAsync(
    "xyza123", json, cancellationToken);

await File.WriteAllBytesAsync(
    report.FileName, report.Bytes, cancellationToken);
<table>
  <tbody>
    {{#each lines}}
    <tr class="{{#if isOverdue}}overdue{{/if}}">
      <td>{{description}}</td>
      <td>{{money amount "ar-SA"}}</td>
    </tr>
    {{/each}}
  </tbody>
</table>

What it handles

Word and PowerPoint, not only PDF

The same template produces all three at the same fidelity. Most tools in this space stop at PDF.

Arabic and right-to-left

RTL layout done properly, with the fonts carried inside the report rather than assumed present on the server.

Real pagination

Long tables break across pages, with report-wide numbering and continuation handling.

Offline by construction

Every request a template makes outside its own asset folder is aborted, so generation never leaves the machine.

Charts that finish drawing

A template that draws asynchronously says so, and the engine waits for it rather than photographing a blank canvas.

Tamper-evident output

Integrity hashes over templates and assets, provenance stamped into every document, and schema-version checks that fail loudly.

Design it, then ship it

Reports are authored in the designer that comes with the package โ€” a developer writes the template, previews it against the real engine, and exports a folder. That folder is the whole contract: there is no shared database and nothing to call at runtime.