PrinceXML,
hosted for you.
EuroPDF runs PrinceXML behind a REST API, in German data centers.
curl --request POST \ --url 'https://api.europdf.eu/v1/docs?api_key=000000' \ --header 'Content-Type: application/json' \ --data '{ "document_content": "<h1>Hello, world!</h1>" }' \ --output demo.pdf
import urllib.request import json html = '<h1>Hello, world!</h1>' req = urllib.request.Request( 'https://api.europdf.eu/v1/docs?api_key=000000', data=json.dumps({'document_content': html}).encode(), headers={'Content-Type': 'application/json'} ) with urllib.request.urlopen(req) as response: with open('demo.pdf', 'wb') as f: f.write(response.read())
import fs from 'fs' const html = '<h1>Hello, world!</h1>' const url = 'https://api.europdf.eu/v1/docs?api_key=000000' const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ document_content: html }), }) const pdfData = await response.arrayBuffer() fs.writeFileSync('demo.pdf', Buffer.from(pdfData))
<?php $html = '<h1>Hello, world!</h1>'; $ch = curl_init('https://api.europdf.eu/v1/docs?api_key=000000'); curl_setopt_array($ch, [ CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Content-Type: application/json'], CURLOPT_POSTFIELDS => json_encode([ 'document_content' => $html, ]) ]); file_put_contents('demo.pdf', curl_exec($ch));
require "httpx" pdf_data = HTTPX.post "https://api.europdf.eu/v1/docs", params: { api_key: "000000" }, json: { document_content: "<h1>Hello, world!</h1>" } File.binwrite("demo.pdf", pdf_data)
package main import ("bytes"; "encoding/json"; "io"; "net/http"; "os") func main() { html := "<h1>Hello, world!</h1>" data, _ := json.Marshal(map[string]string{"document_content": html}) resp, _ := http.Post("https://api.europdf.eu/v1/docs?api_key=000000", "application/json", bytes.NewBuffer(data)) defer resp.Body.Close() pdf, _ := io.ReadAll(resp.Body) os.WriteFile("demo.pdf", pdf, 0644) }
PrinceXML, as a service
Running PrinceXML yourself means a license, a binary to install, a Docker image to maintain, and a fleet to scale and monitor. EuroPDF runs all of that for you, in German data centers — European-operated, GDPR-compliant by default.
Same engine, same CSS, same output – you just send HTML over HTTP instead of running a binary.
What you get besides the engine
The operational layer around Prince — the stuff you would otherwise build and maintain yourself.
Request inspection & logs
Every API call shows up in your dashboard with the full payload, response, timing, and the rendered PDF. When a document comes out wrong, click the request and see exactly what was sent.
API keys with their own settings
Create as many API keys as you need. Each one carries its own settings: test mode, incineration time, and PrinceXML pipeline version. Separate your services, your environments, your experiments – without them sharing configuration.
Unlimited test PDFs
Every plan – including the free one – comes with unlimited test PDFs. Use them to wire up your integration, iterate on a layout, or sanity-check a template. They carry a watermark and don't count against your quota. Disable test mode once you're all set up.
In-browser Playground
Paste your existing Prince HTML, hit render, see the PDF. Prototype new templates, debug regressions, share repros with a permalink – all without installing Prince on anyone's machine.
Hosted in Germany
API, render workers, and request logs all run in German data centers, fully inside the EU — GDPR-compliant by default, no data leaves European jurisdiction.
No ops, ever
No binary to update across a fleet, no version drift between workers, no Dockerfile to babysit.
GDPR-compliant European hosting
Incinerated by default
Your HTML and the rendered PDF are incinerated once the request finishes and the PDF has been consumed. Only metadata stays behind: timestamp and API key. Nothing inspectable.
Wiped after every call
HTML, PDFs, and assets are incinerated once the request has finished and the PDF has been consumed. Retention is configurable per API key and can be raised for debugging.
Hetzner, Germany
Render workers and request logs run on Hetzner in German data centers. No CDN edge, no US provider in the request path.
Zero PDF sub-processors
Your HTML never reaches a third party. Payment, uptime monitoring, transactional email – all EU-based.
Need it on paper? A Data Processing Agreement documenting all of the above can be generated from your account page after sign-up.
Try out for free!
For as long as you like. No credit card required.
Free plan
- 5 regular PDFs each month
- As many test PDFs as you need *
- No trial period
Our paid plans – for maximum flexibility
Monthly PDF quota included. Additional PDFs charged as you go.
You can switch between plans at any time.
Starter
- 50 PDFs /mo
- 4 concurrent requests
- 1 API key
- Unlimited test PDFs
Standard
- 500 PDFs /mo
- 8 concurrent requests
- Unlimited API keys
- Unlimited test PDFs
Large
- 1,500 PDFs /mo
- 16 concurrent requests
- Unlimited API keys
- Unlimited test PDFs
X-Large
- 4,000 PDFs /mo
- 32 concurrent requests
- Unlimited API keys
- Unlimited test PDFs
Custom Plan
You want to create even more PDFs? You prefer yearly payments, or to pay via bank transfer? Talk to us and we'll create a plan specific to your needs!
VAT may apply, based on your country of origin.
Frequently asked questions
It is PrinceXML. EuroPDF is a licensed operator of the PrinceXML engine from YesLogic. When you call our API, a Prince process on our servers produces your PDF – same CSS support, same layout engine, same output as a local install.
We currently support Prince 16 (released February 2025) and Prince 15.4. New Prince versions are added shortly after their official release, so you always have access to the latest features.
Yes. Anything that works with a local prince install works against the API: @page rules, named pages, running headers and footers, footnotes, cross-references, bookmarks, PDF/UA, PDF/A, generated content, TOC generation – the full Paged Media feature set.
The only thing that changes is how you invoke it: instead of a command-line call, you make an HTTP request with your HTML in the body.
Exclusively in German data centers, operated by European providers. Your HTML, the generated PDF, and the request logs never leave the EU. We can issue a Data Processing Agreement on request directly from your account page after sign-up.
By default, request data is incinerated once the request finishes and the PDF has been consumed. Retention is configurable per API key and can be raised for debugging.
Yes. EuroPDF runs a full Chromium preprocessing stage before Prince, so React, Vue, Highcharts, Chart.js and anything else that hydrates in a browser renders correctly. Prince's own ES5 scripting layer is also available via prince_options[javascript] for PDF-layout-time scripting.
See JavaScript rendering for the full picture.
Every request to your API key is captured in the dashboard with the full input HTML, response, and the rendered PDF. When something comes out wrong, you click the request and see exactly what was sent.
Yes. After sign-up you can generate a custom DPA directly from your account page.