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.
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-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."
"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!"
"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."
Frequently Asked Questions
Common questions about wkhtmltopdf deprecation, migration, and switching to PDFBolt.
Is wkhtmltopdf still maintained?
What is the best wkhtmltopdf alternative?
Does python-pdfkit or DinkToPdf require wkhtmltopdf?
Does wkhtmltopdf support CSS Flexbox or Grid?
Is wkhtmltopdf secure for production use?
How do I migrate from wkhtmltopdf to PDFBolt?
