PDFPipe

Comparison

A PrinceXML alternative without the $3,800 license

PrinceXML produces excellent PDFs for print publishing. It also costs $3,800 per server for a commercial license, cannot run on Lambda, Vercel, or any serverless platform, and produces blank output from React, Vue, and Angular apps. PDFPipe uses a full browser renderer, works from any HTTP client, and starts free.

Side by side

PDFPipePrinceXML
Free tier500 docs/month, no card, no watermarkNon-commercial only, adds watermark in production
Commercial licenseFrom $19/month$3,800 per server, $950/year renewal after year 1
10-server deploymentSame monthly plan$38,000+ in licenses
Deployment modelHTTP call from any runtimeBinary on every server (PATH, libs, permissions)
Lambda / Vercel / WorkersYesNot possible
React / Vue / AngularYes (full browser engine)Blank output (no browser network environment)
Running headers/footersYes (header_html / footer_html)Yes (via CSS Paged Media)
CSS Grid / FlexboxYesPartial
PDF/A outputBest-effort (pdf_a option)Yes (full conformance)
PDF mergeYes (/v1/pdf/merge)No (generation only)
SDKnpm install pdfpipe-nodeSpawn child process, manage stdio
AI agentsMCP serverNone

The license problem at scale

PrinceXML licenses are per-server, not per-seat or per-document. A small team running three production servers plus staging and CI quickly reaches $15,000 in licenses before writing a single line of application code. Cloud deployments that autoscale face the same problem: each new instance needs its own license. PDFPipe is an API call, so there is nothing to license per server.

Serverless compatibility

PrinceXML runs as a native CLI binary. Running a binary on AWS Lambda is possible via a painful workaround; running it on Vercel Functions, Cloudflare Workers, or Netlify is not. PDFPipe works from any environment that can make an HTTP request: Lambda, Edge, Workers, a cron job, an n8n workflow. No special deployment configuration required.

React, Vue, and Angular rendering

PrinceXML runs JavaScript at layout time, not in a browser context. Any framework that renders via hydration, client-side routing, or data fetching produces blank or broken output. PDFPipe uses a real browser, so any template that loads correctly in a browser renders correctly as a PDF.

Running headers and footers

This was historically a PrinceXML-exclusive feature. PDFPipe now supports running headers and footers via header_html and footer_html options. The renderer substitutes .pageNumber, .totalPages, and .date class names automatically. Margins widen from 1cm to 2cm when using the defaults to prevent overlap.

javascript
const res = await fetch("https://api.pdfpipe.xyz/v1/pdf", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.PDFPIPE_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    html: yourHtml,
    options: {
      format: "A4",
      margin: { top: "20mm", bottom: "20mm" },
      header_html: `<div style="font-size:9px;width:100%;text-align:right;padding-right:20mm">
        Page <span class="pageNumber"></span> of <span class="totalPages"></span>
      </div>`,
    },
  }),
});
const pdf = await res.arrayBuffer();

When PrinceXML is the right choice

PrinceXML is worth the license cost when you need CSS Paged Media features that browsers do not support: complex multi-column book layouts, cross-reference page numbers, footnotes that flow across pages, and CMYK color profiles for professional print publishing. For legal publishing, government compliance, and long-form books, PrinceXML is the better tool. For invoices, reports, certificates, contracts, and dashboards, browser rendering is equivalent and costs a fraction of the price.

Try it on the live playground with no signup.

See pricing →