Free tools Windows power users keep installed
One-click scans. No signup required.
Direct answer: render the HTML in a real browser engine, then export the page to PDF, or submit the HTML (or template data) to a hosted conversion API. In either case, choose print or screen CSS deliberately, set paper dimensions and margins, wait for fonts and dynamic assets, and test representative documents before relying on the output.
Choose a rendering route
There are two sound architectures. A self-hosted browser such as Chromium, controlled with Puppeteer or Playwright, keeps rendering in your infrastructure. A hosted API accepts raw HTML, a URL, or a stored template and returns a PDF or an asynchronous job result.
| Decision | Self-hosted browser | Hosted API |
|---|---|---|
| Operational ownership | You manage browser processes, scaling, sandboxing and updates. | The provider runs the rendering service; you manage credentials, requests and service dependency. |
| Template model | Set page content or navigate to your rendered template. | Send raw HTML or reference a stored template with data. |
| CSS requirements | Direct control over print/screen media, fonts, backgrounds and page rules. | Verify the provider’s supported CSS, PDF profiles and limits. |
| Job model | Usually an in-process result, unless you build a queue. | May return a PDF immediately or a job ID and callback for longer documents. |
| Delivery | Write the returned bytes to your storage. | Depending on the API, receive binary data, a temporary URL or a hosted document. |
Documentation describes capabilities, not a universal speed, cost or reliability winner. Decide using your workload, then render actual templates.
Self-hosted conversion with Puppeteer
Install and prepare a renderer
Install Node.js and Puppeteer in the service that will create PDFs:
The Tool Desk
Outbyte Driver Updater FREEScan for outdated or missing drivers - takes under a minuteDriver Scan →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →#1 Best Overall
- HTML CSS Design and Build Web Sites
- Comes with secure packaging
- It can be a gift option
npm install puppeteer
The example below accepts an HTML string, waits for network activity and fonts, selects screen media when requested, and writes a PDF. Puppeteer documents Page.pdf() and its PDF options; its PDF guide explains the general navigation-to-export flow.
Complete Node.js example
const puppeteer = require('puppeteer');
const fs = require('node:fs/promises');
const html = `<!doctype html>
<html><head>
<meta charset="utf-8">
<style>
@page { size: A4; margin: 18mm 16mm 20mm; }
* { box-sizing: border-box; }
body { font-family: Arial, sans-serif; color: #1f2937; }
h1 { break-after: avoid; }
.invoice { page-break-inside: avoid; }
@media print { .screen-only { display: none; } }
</style>
</head><body>
<h1>Invoice 1042</h1>
<section class="invoice">Customer and line-item content</section>
</body></html>`;
(async () => {
const browser = await puppeteer.launch({headless: true});
try {
const page = await browser.newPage();
await page.setContent(html, {waitUntil: 'networkidle0'});
await page.emulateMediaType('screen'); // omit for print CSS
await page.evaluate(() => document.fonts.ready);
await page.pdf({
path: 'invoice.pdf',
format: 'A4',
printBackground: true,
preferCSSPageSize: true,
displayHeaderFooter: false,
margin: {top: '18mm', right: '16mm', bottom: '20mm', left: '16mm'}
});
} finally {
await browser.close();
}
})();
Use page.goto(url, {waitUntil: 'networkidle0'}) instead of setContent when the template is served by your application. Treat user-supplied HTML as untrusted: isolate the browser, restrict outbound requests and never expose internal credentials to page scripts.
Control media, paper and pagination
Print versus screen styles
Puppeteer and Playwright use print CSS by default for PDF generation. If your design depends on screen rules, call page.emulateMediaType('screen') before exporting. Chromium may modify printed colors; -webkit-print-color-adjust: exact can preserve specified colors, although it can increase ink-heavy output. Confirm the result visually.
Dimensions and margins
Use a standard format such as A4 or Letter, or explicit dimensions with units. preferCSSPageSize: true lets an @page rule win. Define margins once—either in CSS or in the PDF options—to avoid unexpected double spacing. Set printBackground: true when colored panels or backgrounds are part of the document.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →Headers, footers and breaks
Header and footer templates are limited: Playwright notes that scripts in those templates do not execute and page styles are not visible inside them. Use the documented page-number variables and simple inline markup. Apply break-before, break-after, break-inside: avoid and table-header repetition rules to keep headings and rows together. Long tables still need testing; a row may be too tall to avoid splitting.
Rank #2
Fonts, images and dynamic data
Bundle production fonts or serve them from an authenticated, reachable origin. Wait for document.fonts.ready and for images or charts that load after initial HTML. A network-idle event is useful but is not proof that an application finished its own rendering; add an explicit readiness selector or application signal.
Playwright alternative
Playwright exposes the same basic page.pdf() mechanism through its Page API. It accepts standard paper formats and dimensions with units. The architectural steps remain: create a page, load or set HTML, wait for assets, choose media, then export. Pick one browser library for a service rather than mixing option names; consult the current API reference for exact defaults.
Hosted HTML-to-PDF APIs
Raw HTML requests
A raw-HTML endpoint is convenient when your application already has the complete document. PDF.co documents POST /pdf/convert/from/html, including an asynchronous mode that returns a job identifier for longer processing. Its documentation says output links normally expire after 60 minutes, with maximum duration dependent on subscription plan; verify current limits before storing links as permanent records: PDF.co HTML-to-PDF API.
Stored templates and data
For recurring invoices, certificates or reports, keep markup in a provider template and send data per request. PDF.co documents a template ID, template data, page settings and an optional callback; it also documents a request size below 4 MB. Confirm current endpoint behavior and limits in its template reference.
Document content or URL
DocRaptor documents a JSON POST /docs with type: "pdf" and document_content; a URL can also be supplied. Depending on mode, the response is a PDF binary or an asynchronous status identifier/callback. See the API overview and API reference.
Rank #3
- 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
Reusable and raw-HTML endpoints
APITemplate.io documents reusable-template, raw-HTML, URL and Markdown paths. Its asynchronous calls return a transaction reference and can notify your webhook. See its overview and generation methods.
Keep API keys server-side. Do not assume parameters, retention, authentication, timeouts or input limits are interchangeable between providers.
Recommended Free Tools
Calling a hosted API safely
- Validate and sanitize template data before interpolation; escape user text and URLs.
- Set an explicit request timeout and attach an idempotency key where the provider supports one.
- If the response is asynchronous, persist the job ID, process success and failure callbacks, and download the result into your own storage before a temporary link expires.
- Record provider request IDs, render duration and output size, but never log API keys or sensitive document contents.
- Retry only transient transport or provider errors, with bounded exponential backoff. Do not blindly retry a completed job.
Or skip the browser setup
ScreenshotNeo is a website screenshot API and MCP server that can capture a page as PNG, JPEG, WebP or PDF. Its PDF capture is useful when your HTML template is already hosted at a URL and you prefer one request over managing Chromium. Before capture it accepts cookie/consent banners and removes more than 60 known consent platforms, newsletter popups and chat widgets. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed; response headers report the page verdict and billing status. An MCP server provides take_screenshot, get_page_info and capture_pdf tools for Claude, Cursor and other MCP clients.
See the ScreenshotNeo documentation for all options, including paper size, margins, landscape mode, page ranges, custom CSS and JavaScript, waits, headers, cookies, user agents, blocking rules, caching and asynchronous webhooks.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
For a PDF, use the documented PDF output parameter for your account and endpoint configuration. The same endpoint also supports HTML/CSS-to-image workflows; do not treat an image response as a PDF.
Python
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
r.raise_for_status()
open("shot.webp", "wb").write(r.content)
Node.js
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`${res.status} ${await res.text()}`);
require('node:fs').writeFileSync('shot.webp', Buffer.from(await res.arrayBuffer()));
ScreenshotNeo has 1,000 free shots per month with no card; paid plans start at $5 for 3,000 shots. Create a free ScreenshotNeo account.
Rank #4
Verification checklist
- Render a short document, a multi-page document and a document with a very long table.
- Check page breaks, repeated table headings, widows/orphans, links and selectable text.
- Test locally and in the production container, including missing-font and slow-network cases.
- Verify images, charts, SVG, right-to-left text and transparent or colored backgrounds.
- Open the PDF with a parser or validator and confirm page count, metadata and file size.
- For asynchronous providers, test duplicate callbacks, expired output URLs and failed jobs.
Troubleshooting
Styles look wrong
Print media is probably active. Call emulateMediaType('screen'), or add the required rules under @media print. Check that your @page size is not overridden by a conflicting option.
Fonts fall back
The font request may be blocked, unauthenticated or unfinished. Make the font reachable from the renderer, wait for document.fonts.ready, and inspect browser console/network errors.
Images or charts are missing
Wait for a real application-ready selector, ensure image URLs are absolute and accessible, and avoid closing the browser before pending requests finish.
The request times out
Reduce unbounded scripts and third-party resources, set a deliberate navigation timeout, and use an asynchronous API mode for documents that legitimately take longer. Check provider limits rather than increasing retries indefinitely.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
A hosted link no longer works
Temporary output URLs expire. Download the bytes into your storage immediately, or configure the provider’s retention option if available.
FAQ
Should I send HTML or a URL?
Send raw HTML when the caller owns the complete, self-contained document. Use a URL when the provider must load an already deployed page and its assets.
Can I guarantee identical output across machines?
Not without controlling the browser version, fonts, locale, timezone, network responses and CSS. Pin your renderer image or use a provider with documented environment controls, then compare generated PDFs in tests.
When should PDF generation be asynchronous?
Use a job and callback/status flow when rendering includes large images, many pages, slow external resources or provider-documented long-running cases. Your application should persist the job state and handle both success and failure.
Do these 3 things before closing this tab:
1Scan for outdated or missing drivers - takes under a minute2Clear out junk files and repair common Windows errors3Fix the driver behind crashes, sound loss and screen glitchesFrequently Asked Questions
Which PDF API is fastest?
The available documentation does not establish a comparable speed benchmark. Measure your own representative templates and network conditions.
Is a screenshot the same as a text PDF?
No. Screenshot output is image-based unless the service’s PDF mode renders a document with selectable text. Validate the resulting PDF for your accessibility and search requirements.
The Bottom Line
Start with a browser renderer when you need direct control over HTML and CSS; choose a hosted API when you want to delegate browser operations and accept its request, job and retention model. In both cases, wait for real assets, set print geometry explicitly and verify output with the templates your users will receive.
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.

