Guides / Java
Invoices, contracts, reports, certificates: every product eventually needs PDFs, and Java PDF libraries make you hand-position every box. RasterKit prints through real Chromium instead — write ordinary HTML and CSS, POST it, get a finished PDF back.
Because it's a print pipeline rather than a drawing API, you keep your existing templates and stylesheets: flexbox, grid, web fonts, page-break CSS, repeating headers and footers with page numbers all just work.
Sign up free (magic link, no card) — your key is shown right after sign-in. You get 100 renders/month free across screenshots, PDFs, and images.
import java.net.URI;
import java.net.http.*;
import java.nio.file.*;
import java.time.Duration;
public class Render {
public static void main(String[] args) throws Exception {
String body = """
{"url": "https://example.com/invoice/42", "format": "A4", "print_background": true}""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://rasterkit.com/v1/pdf"))
.timeout(Duration.ofSeconds(60))
.header("x-api-key", System.getenv("RASTERKIT_API_KEY"))
.header("content-type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(body))
.build();
HttpResponse<byte[]> res = HttpClient.newHttpClient()
.send(request, HttpResponse.BodyHandlers.ofByteArray());
if (res.statusCode() != 200) {
throw new RuntimeException("Render failed: " + res.statusCode() + " " + new String(res.body()));
}
Files.write(Path.of("document.pdf"), res.body());
System.out.println("Saved document.pdf");
}
} The response body is the file itself — no JSON envelope to unwrap, no second download request. Errors come back as JSON with a stable error code.
The PDF API reference documents every parameter. The ones people reach for first:
format: "Letter", landscape: true — paper setupfooter_template — page numbers via <span class="pageNumber">print_background: true — keep your CSS backgrounds (on by default)wait_for_selector — wait for charts/data before printingPass footer_template with Chromium's built-in classes, e.g. <span class="pageNumber"></span> / <span class="totalPages"></span>.
Browsers skip backgrounds when printing by default. RasterKit sets print_background: true by default — if you turned it off, turn it back on.
Yes — standard CSS (break-inside: avoid, break-after: page) is respected, and prefer_css_page_size lets your @page rules define the paper size.