Open source · MIT licensed

HTML to PDF.
In process.
In pure Rust.

Render HTML, CSS, and Markdown directly to PDF without a browser, a subprocess, or system dependencies.

cargo add ironpress

invoice.html
<style>
.invoice {
  display: grid;
  color: #172033;
}
</style>

<h1>Invoice #042</h1>
<table></table>
ironpresssingle process
PDF

NORTHSTAR STUDIO

Invoice #042

Issued
18 AUG 2026
Due
01 SEP 2026

Design system€2,400

Implementation€4,800

Total€7,200

0.93 mssimple HTML median

3,200+tests

1,664parity fixtures

8runtime paths

Built for documents

A PDF engine,
not a browser in disguise.

ironpress owns the full rendering path, from parsing and layout to font shaping and PDF output. That keeps deployment predictable.

01

Deploy one binary

No Chrome install, process pool, or platform package checklist. The renderer runs inside your application.

02

Modern document CSS

Flexbox, grid, tables, multi-column layout, variables, @page, and print-oriented headers and footers.

03

Serious typography

Custom fonts, subsetting, Unicode and CJK fallback, shaped with Rustybuzz, plus LaTeX-style math.

04

Multiple runtimes

Use the same core from Rust, C, .NET, Java, the CLI, Python, Ruby, browser WebAssembly, or Node.js.

  • Rust
  • C
  • .NET
  • Java
  • CLI
  • Python
  • Ruby
  • Browser
  • Node.js
05

Defensive by default

HTML and SVG sanitization, constrained file access, resource limits, and opt-in remote fetching policies.

One core, nine paths

Start in the language
you already ship.

The rendering engine is Rust. Every runtime shares the same portable converter controls for pages, quality, fonts, and safety. Choose your runtime.

Rustcrates.io ↗

use ironpress::html_to_pdf;

let pdf = html_to_pdf(
    "<h1>Hello</h1>"
)?;

CLIguide →

ironpress invoice.html \
  invoice.pdf \
  --page-size a4

Cguide →

#include "ironpress.h"

IronpressStatus status =
  ironpress_html_to_pdf(
    html, &pdf, &error
  );

PythonPyPI ↗

import ironpress

pdf = ironpress.html_to_pdf(
    "<h1>Hello</h1>"
)

.NETguide →

using Ironpress;

using var converter =
  new HtmlConverter();

byte[] pdf = converter.ConvertHtml(
  "<h1>Hello</h1>"
);

Javaguide →

try (var converter =
  new HtmlConverter()) {

  byte[] pdf = converter.convertHtml(
    "<h1>Hello</h1>"
  );
}

RubyRubyGems ↗

require "ironpress"

pdf = Ironpress.html_to_pdf(
  "<h1>Hello</h1>"
)

Browserguide →

import init, { htmlToPdf } from "ironpress";

await init();

const pdf = htmlToPdf(
  "<h1>Hello</h1>"
);

Node.jsguide →

import init, { htmlToPdf }
  from "ironpress/node";

await init();
const pdf = htmlToPdf(html);

Choose the right renderer

When ironpress fits.

Use ironpress when the document is known HTML and CSS, deployment simplicity matters, and conversion belongs inside your process.

Read the architecture guide

Choose ironpress for

Invoices, reports, certificates, server-side exports, and offline or WASM workflows.

Choose a browser for

JavaScript-driven pages or browser screenshots.

Nothing to install

Give your HTML
the press treatment.

Install the package for your runtime and generate a PDF in your own process.