Free tools Windows power users keep installed
One-click scans. No signup required.
To make wkhtmltopdf bold text resemble Google Chrome, first make both renderers use the same font files and explicit weight mapping. Chrome may synthesize a heavier face when a family has no suitable bold file; wkhtmltopdf may choose a different face, fail to load the web font, or use an older WebKit implementation. Declare regular and bold files explicitly, verify they are available to the PDF process, test synthesis settings in the exact wkhtmltopdf binary, and compare output from the same fixture.
There is no universal pixel-identical setting. The result depends on the font, operating system, Chrome version, wkhtmltopdf build, patched Qt WebKit, and fontconfig/FreeType environment.
What Chrome “faux bold” actually is
Faux bold is synthetic bold: an approximation used when the requested family does not contain a suitable designed bold face. A renderer can create the approximation by adding a thin stroke around glyphs. It is not necessarily the type designer’s real bold face, and different engines can synthesize different stroke widths and shapes.
CSS Fonts defines font-synthesis-weight. auto allows synthetic weight; none forbids it. The related font-synthesis shorthand can control synthetic faces more broadly. These declarations are fallback controls, not a promise that every Qt WebKit build implements them. A current WebKit feature table describes WebKit generally, while wkhtmltopdf bundles a particular, older Qt WebKit snapshot.
Do these 3 things before closing this tab:
1Fix the driver behind crashes, sound loss and screen glitches2Clear out junk files and repair common Windows errors3Scan for outdated or missing drivers - takes under a minute#1 Best Overall
- Create a mix using audio, music and voice tracks and recordings.
- Customize your tracks with amazing effects and helpful editing tools.
- Use tools like the Beat Maker and Midi Creator.
- Work efficiently by using Bookmarks and tools like Effect Chain, which allow you to apply multiple effects at a time
- Use one of the many other NCH multimedia applications that are integrated with MixPad.
1. Start with explicit font-face mapping
The most reliable way to reduce a Chrome–wkhtmltopdf difference is to stop leaving face selection implicit. Supply the same regular and bold files to both environments and give each file the weight it actually represents.
@font-face {
font-family: "Report Sans";
src: url("fonts/report-sans-regular.woff2") format("woff2");
font-style: normal;
font-weight: 400;
font-display: block;
}
@font-face {
font-family: "Report Sans";
src: url("fonts/report-sans-bold.woff2") format("woff2");
font-style: normal;
font-weight: 700;
font-display: block;
}
body {
font-family: "Report Sans", sans-serif;
font-weight: 400;
}
strong, b, .headline {
font-weight: 700;
}
Do not label a regular file as 700 merely to make it darker. That asks the renderer to treat the wrong outlines as a bold face and can produce worse results than synthesis. If the family has variable-font axes, verify that the wkhtmltopdf build can consume that format; a static 700 file is usually easier to make deterministic in a legacy converter.
Use identical inputs
- Copy the same font files, not just the same family name, into the browser and conversion environments.
- Check file versions and hashes; a system-installed font can silently override a web font.
- Use the same CSS, including the order of
@font-facerules and the requested weight. - Ensure the PDF process can read local files or fetch the font URLs. A browser that has a cached font is not evidence that wkhtmltopdf loaded it.
2. Decide whether to permit synthetic weight
If you intentionally want a Chrome-like approximation because no bold file exists, test:
.chrome-like-weight {
font-family: "Report Sans", sans-serif;
font-weight: 700;
font-synthesis-weight: auto;
}
.no-synthetic-weight {
font-synthesis-weight: none;
}
auto permits synthesis when a suitable face is missing. none prevents synthetic bold, so the renderer must use an available face instead. Use none when a missing font should be obvious rather than silently approximated.
Rank #2
- Full-featured professional audio and music editor that lets you record and edit music, voice and other audio recordings
- Add effects like echo, amplification, noise reduction, normalize, equalizer, envelope, reverb, echo, reverse and more
- Supports all popular audio formats including, wav, mp3, vox, gsm, wma, real audio, au, aif, flac, ogg and more
- Sound editing functions include cut, copy, paste, delete, insert, silence, auto-trim and more
- Integrated VST plugin support gives professionals access to thousands of additional tools and effects
For broader control, you may encounter:
.controlled-synthesis {
font-synthesis: weight style;
}
.no-synthesis {
font-synthesis: none;
}
Run a minimal fixture through the exact wkhtmltopdf binary before depending on these properties. Older Qt WebKit builds may ignore them. If the declaration is ignored, changing it cannot make that binary match Chrome; use a real bold file or change renderer.
3. Verify fonts in the conversion environment
wkhtmltopdf uses Qt WebKit and relies on the host fontconfig and FreeType stack. Its project documentation also notes that builds differ, particularly between packages with patched Qt and distribution-provided packages. The project’s stable series is 0.12.6, released June 11, 2020; the version string alone is not enough to identify every feature, because packaging and patches matter.
Checks before conversion
- Record
wkhtmltopdf --version, the operating system, and whether the binary reports patched Qt. - Confirm the font file exists at the path or URL used by the HTML process and that the conversion user has permission to read it.
- Check
FONTCONFIG_PATHand the fontconfig configuration used by the service, container, or worker. A shell test and a production worker can resolve different font directories. - Confirm the font format is supported by the installed stack. If a WOFF2 file fails, test a known-good WOFF or an installed system font to separate format problems from CSS problems.
- For remote fonts, verify DNS, TLS, proxy rules, and access from the conversion host. A browser on your laptop may have network access that the PDF worker does not.
- Wait for font loading before capture. If your page starts conversion while a web font is still downloading, the PDF can preserve fallback metrics or weight.
Make loading observable
Create a diagnostic HTML page containing the same short sentence in weights 400 and 700, plus a deliberately missing family. Render it repeatedly with the production command. Keep the HTML, CSS, font hashes, command line, and output PDF together. This distinguishes a missing resource from a synthesis difference.
4. Compare Chrome and wkhtmltopdf fairly
Use one fixture rather than comparing unrelated pages. Fix the viewport, device scale, page background, text, font files, and CSS. Capture the same sentence at regular, semibold, and bold weights. Record:
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 →Rank #3
- Transform audio playing via your speakers and headphones
- Improve sound quality by adjusting it with effects
- Take control over the sound playing through audio hardware
- Chrome version and operating system.
- wkhtmltopdf version, package source, patched-Qt status, and operating system.
- Font file names, formats, versions, and hashes.
- All relevant
@font-facedeclarations and the requested CSS weights. - Whether the font was local, embedded, or fetched over the network.
- PDF page size and any rasterization used for visual comparison.
If Chrome is bold but the PDF is normal, inspect loading and face mapping first. If both are bold but strokes differ, you are likely seeing renderer-specific synthesis or different text rasterization. If the requirement is visual identity rather than approximate weight, a real bold face is a better input than trying to imitate a synthetic stroke.
5. A repeatable diagnostic fixture
<!doctype html>
<meta charset="utf-8">
<style>
@font-face {
font-family: "TestFamily";
src: url("fonts/test-regular.woff2") format("woff2");
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: "TestFamily";
src: url("fonts/test-bold.woff2") format("woff2");
font-weight: 700;
font-style: normal;
}
body { font-family: "TestFamily", sans-serif; font-size: 32px; }
.allow { font-weight: 700; font-synthesis-weight: auto; }
.forbid { font-weight: 700; font-synthesis-weight: none; }
</style>
<p>Regular: The quick brown fox 400</p>
<p class="allow">Allowed synthesis or bold file 700</p>
<p class="forbid">Synthesis forbidden 700</p>
Render this file with the same command and environment used by production. If the two 700 samples are identical, the binary may be selecting the supplied bold file. If they differ, the property is being honored or the available faces differ. If they are both indistinguishable from 400, the bold file probably did not load, the family declaration is wrong, or the engine ignored the CSS and found no bold face.
6. Choose the remedy that fits your requirement
| Remedy | When to choose it | Trade-off |
|---|---|---|
| Use a real 700 font file | You need predictable face selection and branding fidelity. | Requires licensing, packaging, and a file that matches the design. |
Allow synthesis with font-synthesis-weight: auto |
No bold face exists and an approximation is acceptable. | Support and stroke appearance vary by wkhtmltopdf build. |
Forbid synthesis with none |
You prefer a visible fallback over silently thickened glyphs. | Text may appear regular or fall back to another family. |
| Adjust source design | Small-size text becomes muddy or spacing changes after emboldening. | Requires typography changes and another visual review. |
| Move to a modern PDF renderer | Pixel-level fidelity or newer CSS/font behavior is a hard requirement. | Migration, deployment, and output-difference work are required. |
Issue reports for wkhtmltopdf 0.12.2.2 (2016) and 0.12.3 (2017) describe inconsistent Google Fonts weight selection and intermittent missing bold with remote Lato fonts. They are useful symptoms to compare with your case, not proof of a universal defect or a confirmed root cause.
Troubleshooting common failures
Chrome is bold; the PDF is regular
- Cause: the 700 file was not loaded or is mapped to the wrong weight. Fix: use an explicit
@font-face, test a local file, and inspect permissions and network access. - Cause: the conversion starts before the web font arrives. Fix: self-host the font or add a deterministic wait in the conversion workflow.
- Cause: a system fallback family is selected. Fix: check fontconfig and remove competing family names from the test.
The PDF is darker than Chrome
- Cause: wkhtmltopdf synthesized weight differently. Fix: supply the same designed bold face or test
font-synthesis-weight: none. - Cause: the font files differ. Fix: compare hashes and versions, not only filenames.
The CSS property has no effect
The bundled Qt WebKit may not implement it. Confirm with the minimal fixture and exact binary. Do not assume a current WebKit support table describes wkhtmltopdf’s engine.
Rank #4
- Mix an audio, music and voice tracks
- Record single or multiple tracks simultaneously
- Intuitive tools to split, trim, join, and many other editing features
- Loaded with audio effects including EQ, compression, reverb, and more.
- Load an audio file and export to all popular audio formats from studio quality wav to high compression formats
Only some machines fail
Compare package builds, operating-system fonts, fontconfig paths, container images, and environment variables. Pin the binary and font files in deployment rather than relying on host defaults.
Output changes after a package upgrade
Record the old and new version/build, patched-Qt status, FreeType/fontconfig versions, and font hashes. Re-run the fixture. Treat a changed PDF as a rendering change until those inputs are proven identical.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Or skip the browser setup
If your actual goal is dependable website images or PDFs rather than reproducing wkhtmltopdf’s typography engine, ScreenshotNeo makes one API request and returns a PNG, JPEG, WebP, or PDF. Before capture it accepts cookie/consent banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status. Its MCP server exposes take_screenshot, get_page_info, and capture_pdf to Claude, Cursor, and other MCP clients.
See the complete parameter reference in the ScreenshotNeo documentation. A basic call is:
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}`);
Every feature is available on every plan, including full-page and lazy-image capture, CSS-selector element shots, device presets, custom viewport and retina scale, PDF paper and margin controls, custom CSS and JavaScript, clicks, waits, blocking rules, headers, cookies, user-agent, authorization, timezone, geolocation, transparent backgrounds, resizing, configurable caching, signed links, asynchronous webhooks, bulk capture of up to 100 URLs per call, usage data, and an OpenAPI specification. The parameter names used by other screenshot APIs also work.
Best Value
- Simple shift planning via an easy drag & drop interface
- Add time-off, sick leave, break entries and holidays
- Email schedules directly to your employees
The Free plan includes 1,000 screenshots each month with no card. Paid plans start at $5 for 3,000 shots; yearly billing provides two months free. Sign up for the free plan to try it without a card.
Cost, reliability, and operational notes
- Self-hosted wkhtmltopdf has no per-capture API charge, but you own font licensing, binary pinning, worker capacity, security updates, and debugging.
- Remote fonts and pages add network failure modes. Self-hosting the exact font files makes output more reproducible.
- Cache behavior can hide a changed font during testing. Clear caches or use a versioned font URL when validating a fix.
- Do not treat a visually close result as proof of identical glyph outlines. Keep a regression fixture and compare rendered PDFs after any browser, OS, font, or package change.
Frequently Asked Questions
Does wkhtmltopdf support font-synthesis?
Some builds may recognize the CSS property, but support depends on the bundled Qt WebKit snapshot. Test the exact binary with a minimal fixture; do not infer support from modern WebKit documentation.
Can CSS force wkhtmltopdf to use Chrome’s exact faux-bold stroke?
No. CSS can permit or forbid synthesis, but it does not standardize the renderer’s stroke geometry. A matching designed bold file or a different renderer is required for strict visual fidelity.
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREERepair Windows errors before they cause bigger problemsFix Now →What should I pin for reproducible bold text?
Pin the wkhtmltopdf binary and patched-Qt build, operating-system image, fontconfig/FreeType stack, font files and hashes, CSS, and conversion command.
The Bottom Line
Use explicit, identical font files first; then test font-synthesis-weight in the exact wkhtmltopdf build. If the legacy Qt WebKit renderer still differs from Chrome, use a real bold face or migrate rather than expecting faux bold to be pixel-identical.
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.




