Skip to main content

wkhtmltopdf Alternative
PDFBolt HTML to PDF API

A modern wkhtmltopdf alternative that renders Flexbox, CSS Grid, and JavaScript exactly like Chrome.
No binaries to install, no Docker to configure. Just send HTML to a REST API and get a pixel‑perfect PDF back.

Try PDFBolt FreeJoin with Google

Chromium

vs Outdated WebKit

Full CSS3 + JS

vs No Flexbox, ES5.1

Secure

vs Unpatched Vulnerabilities

REST API

vs CLI Binary

Deprecated

wkhtmltopdf

Open-source CLI tool that converts HTML and URLs to PDF using the Qt WebKit rendering engine. Wrappers available for Python (python-pdfkit), Node.js (node-wkhtmltopdf), PHP (Snappy), Ruby (WickedPDF), and .NET (DinkToPdf). Deprecated and archived on GitHub in January 2023. Rendering engine frozen since 2012.

Modern API

PDFBolt

PDF generation REST API that converts HTML, URLs, and reusable templates to PDF in a real Chrome instance with full CSS3 and JavaScript support. Three endpoints (Direct, Sync, Async), webhooks, direct upload to your S3 bucket, and AI-powered template generation. Free playground to test before writing code.

wkhtmltopdf vs PDFBolt: Feature Comparison

CSS rendering, JavaScript support, security, infrastructure, and pricing compared side by side.

wkhtmltopdf

PDFBolt

Rendering

Rendering Engine

Qt WebKit (frozen 2012)

Chromium

CSS Flexbox & Grid

JavaScript

ES5.1 only

Full modern JS

Web Fonts (WOFF2)

PDF Output

Headers & Footers

Table of Contents

Security & Status

Project Status

Archived (Jan 2023)

Active development

Known Vulnerabilities

2 unpatched

None

Integration

How You Use It

CLI binary

REST API

System Dependencies

Binary + Qt libraries

None (HTTP request)

Price

Free (LGPL)

Free 100/mo, paid from $19/mo

Why wkhtmltopdf is Deprecated

The GitHub repository was archived in January 2023. No new releases, security patches, or bug fixes are planned.

Archived since January 2023

The GitHub repository and the entire organization are archived and read-only. The last release (0.12.6) was in June 2020. The maintainer recommends wkhtmltopdf alternatives such as WeasyPrint, Prince, or Puppeteer for new projects.

Unpatched security vulnerabilities

CVE-2022-35583 (CVSS 9.8) allows SSRF attacks via iframe injection. CVE-2020-21365 enables directory traversal. The maintainer warns: “Do not use wkhtmltopdf with any untrusted HTML”.

No modern CSS

Flexbox, Grid, custom properties, calc(), and transforms are not supported. Bootstrap 4+ grid classes break completely due to the outdated WebKit engine.

JavaScript limited to ES5.1

No arrow functions, Promises, async/await, or fetch(). Modern frameworks like React, Vue, and Angular may not render correctly without transpiling to ES5 via Babel.

Docker and installation issues

No official Alpine Linux support (musl libc causes segfaults). No ARM64 binaries for Apple Silicon or AWS Graviton. Ubuntu apt version ships without patched Qt. Homebrew cask disabled December 2024.

Memory leaks and instability

Verified memory leak of 20‑60KB per call. Not thread‑safe – concurrent requests can cause PDF cross‑contamination. Processes hang indefinitely with no built‑in timeout.

wkhtmltopdf vs PDFBolt: A Closer Look

How the differences in CSS support, JavaScript rendering, security, and scaling affect real projects.

CSS and JavaScript Rendering

wkhtmltopdf

If your templates use Bootstrap 4+, Tailwind CSS, or Material UI, wkhtmltopdf will not render them correctly – these frameworks rely on Flexbox and Grid. Chart libraries like Chart.js, D3, and Plotly may not render because their current versions require ES6+ JavaScript. The same HTML can render differently on macOS, Ubuntu, and Docker due to font and library differences. Page breaks are unreliable – tables often split mid-element when using page‑break‑inside.

PDFBolt

PDFBolt renders any CSS framework – Bootstrap, Tailwind, MUI, Chakra – because it uses a real Chromium browser. Chart.js, D3, Plotly, and any JavaScript library work as expected. Instead of a blind delay timer, you can wait for specific elements or conditions before rendering with waitUntil, waitForSelector, and waitForFunction. Page breaks work reliably with standard CSS rules like page‑break‑before and page‑break‑inside.

Security in Production

wkhtmltopdf

The SSRF vulnerability (CVE-2022-35583) means that user-submitted HTML can access internal APIs, files, and network resources from whatever server wkhtmltopdf runs on. The CVE-2020-21365 directory traversal vulnerability allows reading arbitrary files from the host. Both vulnerabilities are permanently unpatched. The maintainer explicitly warns against using wkhtmltopdf with any untrusted HTML.

PDFBolt

PDFBolt runs each conversion in an isolated environment on EU-based servers. Both HTML content and template data are used only for PDF generation and immediately discarded – nothing is stored. Sensitive request parameters can be redacted in the Dashboard so they are never logged. For full control, upload generated PDFs directly to your own S3-compatible bucket – documents never touch PDFBolt storage. Full details in the Privacy Policy and DPA.

Scaling and Reliability

wkhtmltopdf

wkhtmltopdf is not thread-safe – concurrent PDF generation requires forking separate processes or managing a pool of Docker containers. A verified memory leak (20–60 KB per call) accumulates over time in long-running services. Processes can hang silently with no built-in timeout, and debugging rendering issues requires reproducing the exact server environment.

PDFBolt

PDFBolt handles concurrent conversions with a 99.9% uptime SLA. For high-volume workflows, the async endpoint processes documents in parallel, sends results via webhook (HMAC-SHA256 signed), and can upload PDFs directly to your S3-compatible bucket. Usage logs and monitoring are available in the Dashboard, and rendering is consistent across all requests.

How to Migrate from wkhtmltopdf to PDFBolt

Replace your wkhtmltopdf wrapper with a simple REST API call.
See how to switch from python-pdfkit, DinkToPdf, Snappy, WickedPDF, or node‑wkhtmltopdf.

Python
C# / .NET
PHP
Ruby
Node.js
cURL

python-pdfkit

import pdfkit

# Requires wkhtmltopdf binary installed on system
html = "<h1>Invoice #1042</h1><p>Amount: $250.00</p>"
options = {
'page-size': 'A4',
'margin-top': '20mm',
'margin-bottom': '20mm',
}

pdfkit.from_string(html, 'invoice.pdf', options=options)

PDFBolt

import requests
import json
import base64

html = "<h1>Invoice #1042</h1><p>Amount: $250.00</p>"
base64_html = base64.b64encode(html.encode()).decode()

url = "https://api.pdfbolt.com/v1/direct"
headers = {
"API-KEY": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
"Content-Type": "application/json"
}

data_json = f'''{{
"html": "{base64_html}",
"format": "A4",
"margin": {{
"top": "20mm",
"bottom": "20mm"
}}
}}'''

data = json.loads(data_json)
response = requests.post(url, headers=headers, json=data)

with open('invoice.pdf', 'wb') as f:
f.write(response.content)

When to Choose wkhtmltopdf

  • Need a completely offline solution with no internet connectivity

  • Have a working integration where the current rendering is sufficient

  • Need built-in Table of Contents generation from H1–H6 headings

  • Need a free tool and don’t require modern CSS or JavaScript

When to Choose PDFBolt

  • Need modern CSS – Flexbox, Grid, CSS variables, and calc()

  • Need JavaScript execution for charts, dynamic content, or frameworks

  • Need a simple REST API for HTML to PDF conversion

  • Need reliable PDF generation at scale with 99.9% uptime SLA

  • Require GDPR-compliant processing with zero data retention

  • Want a fully managed service – no binaries to install or maintain

What Developers Say About PDFBolt

See how teams save time and reduce complexity with our developer‑first PDF solution.

"It has a very intuitive User Interface and easy to use API with a great documentation. What's best, that the support is super fast and even feature requests are discussed and implemented in just a couple of days. It helps us to create individualised PDF gift cards both for digital use as well as print production on the base of modern HTML / CSS."

David Bernhard

David Bernhard

CTO at bon-bon.de

"Amazingly, the owner personally helped solve the issues I was having creating an exported lesson plan with hyperlinks and complex styling. This is a great piece of software. But more importantly, it’s the people behind a product that truly make a company great. His willingness to support my project without payment is truly unique – a rare product and a rare individual. This product just works. Thank you, PDFBolt!"

Robert Reich-Storer

Robert Reich-Storer

Owner of Rhythmstix and Assessify
Source logo

"There's a lot of products that convert to PDF out there, but this one stood out to me, because the output quality is good, it's very easy to use, and pay per use. I also love the interactive API documentation, my request just worked out of the box in my app. And of course the focus on privacy, which is important when working with GDPR data. (...) PDFBolt just works, so I can focus on the business logic."

Malte Bartels

Malte Bartels

Cloud Engineer
Source logo

Frequently Asked Questions

Common questions about wkhtmltopdf deprecation, migration, and switching to PDFBolt.

No. wkhtmltopdf is deprecated. The GitHub repository was archived in January 2023, and the entire organization was archived in July 2024. The last release (0.12.6) was in June 2020. The Homebrew cask was disabled in December 2024. The maintainer recommends WeasyPrint or Prince for static HTML and Puppeteer for dynamic JavaScript content.
It depends on your needs. The best wkhtmltopdf replacement for most teams is a managed REST API like PDFBolt – modern CSS3, full JavaScript, and no infrastructure to maintain. For self-hosted open-source alternatives, Puppeteer and Playwright are the most popular choices. For Python-only projects, WeasyPrint works well if you don't need JavaScript support.
Yes. python-pdfkit, DinkToPdf (.NET), Snappy (PHP), and WickedPDF (Ruby) are all wrappers around the wkhtmltopdf binary – they require wkhtmltopdf to be installed on your system. python-pdfkit has been formally deprecated. To generate PDFs in Python without wkhtmltopdf, you can call PDFBolt's REST API directly with the requests library – no binary needed.
No. wkhtmltopdf uses a Qt WebKit engine frozen circa 2012, before CSS Flexbox and CSS Grid were widely adopted. Modern layout features like Flexbox, Grid, CSS variables (var()), and calc() are not supported. PDFBolt uses modern Chromium with full CSS3 support.
The maintainer explicitly warns: "Do not use wkhtmltopdf with any untrusted HTML". There are two known unpatched CVEs: CVE-2022-35583 (CVSS 9.8 CRITICAL) which enables SSRF attacks via iframe injection, and CVE-2020-21365 which enables directory traversal. No security patches have been released since June 2020.
Replace your wkhtmltopdf CLI call or wrapper library (python-pdfkit, DinkToPdf, Snappy, WickedPDF) with an HTTP POST request to the PDFBolt API. Send HTML (Base64-encoded) or a URL to the /v1/direct endpoint and receive a PDF back. See our quick start guide for code examples in Python, Node.js, PHP, C#, Go, Rust, and Java.

Ready to Leave wkhtmltopdf Behind?

Start with 100 free conversions per month. No credit card required.
Convert HTML, URLs, and templates to pixel‑perfect PDFs.

Try PDFBolt Free