Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
Short answer: Rotativa does not implement CSS3 itself. Rotativa.AspNetCore passes your HTML and options to a wkhtmltopdf executable, whose old Qt WebKit engine determines what renders. You should therefore treat CSS support as a property of your exact wkhtmltopdf build, patched-Qt variant, operating system, and command-line switches—not as a single “CSS3 supported” feature.
A 2018 wkhtmltopdf issue reports incorrect results for transform: rotate(45deg), display: inline-block, and width: calc(50% - 32px). That is evidence of failures in at least one environment, not proof that every build always fails. The reliable method is to render a small test page with the same binary and switches used in production, then inspect the PDF.
Why Rotativa’s CSS support is really wkhtmltopdf support
Rotativa is a .NET wrapper. Rotativa.AspNetCore documentation describes it as using wkhtmltopdf (and wkhtmltoimage) behind the scenes and allowing custom switches. The wrapper can select a stylesheet, margins, page size, smart shrinking and other conversion settings, but it does not replace the browser engine or add missing CSS parsing and layout code.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
wkhtmltopdf identifies itself as an HTML-to-PDF and image converter based on Qt WebKit. Its GitHub repository was archived on January 2, 2023. The project status information notes that QtWebKit was deprecated in 2015, removed from Qt in 2016, and that the WebKit included in Qt 4 had not been updated since 2012. That history explains why a page that works in current Chrome or Firefox can paginate or lay out differently in Rotativa.
#1 Best Overall
There is no complete, authoritative property-by-property compatibility matrix covering every package and platform. A result from one binary cannot safely be generalized to another.
What the available evidence says about commonly questioned CSS3 properties
| Feature | What is established | How to handle it |
|---|---|---|
transform: rotate() |
A September 18, 2018 issue reports rotation not rendering as expected. | Isolate a transform test with your production executable. Keep a non-transformed fallback if the angle is essential. |
display: inline-block |
The same issue reports an inline-block layout failure. |
Test the exact widths, whitespace and nesting in your document; use simpler block or table layout when necessary. |
calc() |
The issue names width: calc(50% - 32px) as failing in that report. |
Use explicit dimensions generated by your application when predictable pagination matters. |
| Other CSS3 properties | The supplied sources do not provide a comprehensive support list or test matrix. | Do not infer support from a browser preview. Add each required property to a regression fixture. |
| PDF outlines and table of contents | The wkhtmltopdf manual documents these in patched-Qt builds. | These are PDF-generation capabilities, not evidence of broad CSS3 compatibility. |
The table deliberately avoids “supported/unsupported” labels where evidence is incomplete. A property may work in one packaged build and fail in another, or work in a reduced example but break when combined with floats, page breaks, fonts or JavaScript.
Record the rendering variables before testing
Before changing CSS, record the inputs that define your result:
- Executable and version: run
wkhtmltopdf --versionon the machine that creates PDFs. Save the complete output, including any “with patched qt” wording. - Rotativa package and application version: a package update can change argument handling or the binary shipped with your deployment.
- Operating system and architecture: fonts, installed libraries and packaged WebKit builds differ across Windows and Linux.
- Command-line switches: note page size, margins, zoom, print media, smart shrinking, JavaScript delays, custom headers and any user stylesheet.
- Input conditions: capture the exact HTML, CSS, fonts, images, relative URLs and data returned by your application.
Keep this information with the generated PDF in a regression-test artifact. “It works on my browser” is not a useful compatibility result unless the browser is the same wkhtmltopdf build.
Build a minimal CSS compatibility fixture
Reduce one question to one visible test. The following page places the reported properties in separate boxes and includes an explicit fallback for comparison:
Rank #2
- HTML CSS Design and Build Web Sites
- Comes with secure packaging
- It can be a gift option
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<style>
@page { size: A4; margin: 20mm; }
body { font: 14px Arial, sans-serif; }
.case { border: 1px solid #333; margin: 12px 0; padding: 12px; }
.rotate { transform: rotate(45deg); width: 120px; height: 40px; background: #ffd; }
.inline-row span { display: inline-block; width: 30%; padding: 8px; border: 1px solid #06c; }
.calc { width: calc(50% - 32px); background: #dfd; padding: 8px; }
.fallback { width: 220px; background: #fdd; padding: 8px; }
</style>
</head>
<body>
<h1>wkhtmltopdf CSS fixture</h1>
<div class="case"><strong>rotate()</strong><div class="rotate">Rotated test</div></div>
<div class="case inline-row"><strong>inline-block</strong><br>
<span>One</span><span>Two</span><span>Three</span>
</div>
<div class="case"><strong>calc()</strong><div class="calc">Calculated width</div><div class="fallback">Explicit fallback</div></div>
</body>
</html>
- Save the file on the same host as the service, or serve it from a URL reachable by that host.
- Run the exact binary and production-like switches, for example
wkhtmltopdf --print-media-type fixture.html fixture.pdf. Use your real page-size, margin, header/footer and JavaScript options instead of copying this example blindly. - Open the PDF, not the browser preview. Check rotation angle, line wrapping, box widths, clipping and page breaks.
- Change one property at a time and retain the before/after PDFs. A difference caused by smart shrinking or margins is not necessarily a CSS parser failure.
Using the fixture through Rotativa.AspNetCore
A controller action can render a view with Rotativa. The exact constructor names vary by package version, so verify them against the version installed in your project; the important point is to pass the same switches you tested manually.
using Rotativa.AspNetCore;
using Microsoft.AspNetCore.Mvc;
public class ReportsController : Controller
{
public IActionResult CssFixture()
{
var pdf = new ViewAsPdf("CssFixture")
{
FileName = "css-fixture.pdf",
PageSize = Rotativa.AspNetCore.Options.Size.A4,
PageMargins = new Rotativa.AspNetCore.Options.Margins(20, 20, 20, 20),
CustomSwitches = "--print-media-type --disable-smart-shrinking"
};
return pdf;
}
}
Use a user stylesheet or smart-shrinking switch only to control conversion. Rotativa’s switch support cannot be assumed to upgrade Qt WebKit or make an unsupported property work. Keep a copy of the generated command (or enable your application’s command logging) so a test can be reproduced outside the web request.
Practical CSS patterns when a property fails
Prefer explicit geometry for print documents
For invoices, labels and regulated reports, generate pixel or physical-unit dimensions in your view model and emit ordinary width, height, margin and padding values. This is a local workaround for a tested failure, not a universal statement that calc() never works.
Use simpler layout primitives
If an inline-block row is unstable, try block elements, floated columns or an HTML table designed for tabular data. Test whitespace between inline-block elements, percentage widths and border-box calculations together; each can alter the observed result.
Provide a visual fallback for transforms
When rotation is decorative, remove it in print CSS. When it conveys meaning, create an alternate label or pre-rendered image and verify that text remains accessible and legible. Do not rely on a transform that your fixture shows is missing.
Rank #3
Control page flow explicitly
Even when a property renders, old WebKit can differ on page-break-before, page-break-after, overflow and height calculations. Keep related blocks together, avoid content that depends on viewport units, and inspect every page at the target paper size.
Recommended Free Tools
Common failures and fixes
The PDF is blank or missing styles
Check that CSS, fonts and images are reachable from the conversion host, that relative URLs have the expected base URL, and that authentication headers or cookies are supplied. Render a local, dependency-free fixture first to separate networking from CSS.
Layout changes after a package or server upgrade
Compare wkhtmltopdf --version, patched-Qt status, operating system, installed fonts and every switch. Pin the known-good executable and run the fixture in deployment as part of release validation.
JavaScript content is absent
wkhtmltopdf may finish before client-side code has populated the page. Use the appropriate JavaScript delay or wait-for behavior supported by your build, but test whether the script itself relies on APIs unavailable in the old WebKit. For highly dynamic pages, a current browser renderer is often a better fit.
Text or boxes are clipped
Inspect page width, margins, zoom and smart shrinking. Replace percentage-plus-padding calculations with explicit dimensions in the failing component, then retest at every supported paper size.
Rank #4
- Brand: Wiley
- Set of 2 Volumes
- A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers
Works in one environment only
Fonts and binary builds are common causes. Package the same executable and fonts, record locale and timezone, and compare PDFs generated from the identical fixture rather than comparing screenshots from different machines.
When to choose another renderer
The wkhtmltopdf maintainer’s status guidance points to WeasyPrint or Prince for controlled report generation and Puppeteer for pages that depend on dynamic JavaScript. These are recommendations, not a current head-to-head benchmark. Evaluate each candidate against your own document.
- CSS and JavaScript fidelity: test the properties, scripts and fonts your templates actually use.
- Pagination: verify headers, footers, page breaks, repeating table headers and overflow.
- Deployment: check runtime dependencies, supported operating systems, container size and cold-start time.
- Licensing and cost: confirm terms for your distribution and workload; the available sources do not establish current prices.
If your documents pass the fixture and their visual requirements are conservative, keeping Rotativa can be reasonable. If required styling repeatedly fails, changing the engine is usually safer than accumulating fragile CSS exceptions.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Or skip the browser setup
For one-off captures, visual regression images or an AI workflow, ScreenshotNeo provides a website screenshot API and MCP server. It accepts consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups and chat widgets before capture; each step can be disabled. Bot checks, blank pages, timeouts, failed loads and cache hits are not billed, and response headers identify the page verdict and billing status.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Repair Windows errors before they cause bigger problemsFix Now →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →One request returns PNG, JPEG, WebP or PDF. The API supports full-page lazy-image loading, CSS-selector element capture, dark mode, device presets or custom viewports, retina scale, PDF paper and page-range controls, custom CSS and JavaScript, clicks, selector or network-idle waits, request blocking, headers, cookies, user agents, authorization, timezone, geolocation, transparent backgrounds, resizing, TTL caching, signed image links, asynchronous webhooks, bulk capture of up to 100 URLs per call, usage reporting and an OpenAPI specification. Parameter names used by other screenshot APIs also work.
Use the same target URL in any of these clients (replace the placeholder key):
Best Value
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
See the complete option reference at ScreenshotNeo’s documentation. An MCP server exposes take_screenshot, get_page_info and capture_pdf to Claude, Cursor and other MCP clients. The Free plan includes 1,000 screenshots each month with no card; paid plans start at $5 for 3,000 shots, and every feature is included on every plan. Create a free ScreenshotNeo account.
Frequently Asked Questions
Does Rotativa.AspNetCore add CSS3 support beyond wkhtmltopdf?
No. It is a wrapper that forwards HTML and conversion options to the selected wkhtmltopdf executable; the embedded Qt WebKit engine remains the compatibility boundary.
The Tool Desk
Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Is the 2018 CSS issue a complete compatibility test?
No. It is one user report naming rotate(), inline-block and calc() failures in a particular setup. Use it as a reason to test, not as a universal matrix.
Can a patched-Qt build be treated as a modern browser?
No. Patched Qt enables documented conversion features such as outlines and tables of contents, but it does not establish current Chromium-level CSS or JavaScript support.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

