EfterScript

Try it in your browser

.ps in. PDF out.

Open a .ps or .eps file, or edit one of the samples. EfterScript, an interpreter compatible with the PostScript language, runs the program on your own computer, in WebAssembly, and hands back a PDF with its vectors, text, and colour intact. Your file is never uploaded.

Program

or drop one anywhere
Job settings

A runaway loop stops when the budget is spent. You can also stop a job yourself.

Proof

Loading the engine…

Your proof will appear here

The engine is about 7 MB and loads once; after that, conversions take a moment.

Outcome
Waiting
Pages
—
PDF size
—
Time
—
Fonts
—

Device output

What the program printed, and the device's error reports.


  

Memory-safe

EfterScript is written in Rust. Its decoders, font parsers, and PDF writer are its own, with no third-party parsers behind them, and unsafe code is confined to a thin C interface for embedders.

No ambient authority

The interpreter reaches only what its host hands it. Here that is nothing: the engine imports no functions from the page, and the page's security policy allows no other hosts. Every run has an execution budget, so a runaway program stops cleanly.

Repeatable output

The same program gives the same bytes on every run, with no timestamps or random IDs, and a public corpus of reference outputs pins every behaviour. Paths, text with its Unicode map, and colour spaces carry through as the program set them.

MIT, embeddable anywhere

Rust crates, a C library, and the efterscript npm package this page runs, all from one codebase. Use it in a closed product or a hosted service with no licence fee and no copyleft terms.

Use the same engine in your own code

$ npm install efterscript

import { load } from "efterscript";
const engine = await load();
const { pdf } = await engine.convert(program);

Third-party notices