Free tools Windows power users keep installed
One-click scans. No signup required.
The quickest free method is your browser: open the rendered HTML, press Ctrl+P (Windows/Linux) or Command+P (Mac), choose Save as PDF, set the paper and print options, preview every page, and save. This works for a local .html file as well as a hosted page. If you need to paste raw HTML into a web converter or automate hundreds of documents, use an HTML-to-PDF service instead.
1. Convert a rendered HTML page with your browser
Browser printing is free, requires no account, and gives you immediate control over paper size, orientation, margins, scale, and page range. It converts what the browser has rendered, not the source code sitting in a text editor.
- Save your document as an
.htmlfile, or open the public URL in Chrome, Edge, or Firefox. Make sure images, fonts, and JavaScript-driven sections have finished loading. - Open the print dialog with Ctrl+P on Windows/Linux or Command+P on macOS. You can also use the browser menu and choose Print.
- Choose Save as PDF in Chrome or Firefox. Edge presents the same PDF destination in its print workflow.
- Select the paper size (usually A4 or Letter), portrait or landscape orientation, margins, scale, and the page range.
- Enable Background graphics when colored sections, background images, or shaded table cells are part of the design. Decide whether headers and footers should appear.
- Inspect the preview page by page. Check for clipped columns, blank pages, missing images, and headings stranded at the bottom of a page.
- Click Save, choose a filename, and open the resulting PDF to verify it.
Firefox’s print preview labels the destination Save to PDF. The exact wording and placement of controls can vary slightly by browser version and operating system.
2. Make HTML print-ready before you export
A screen layout is not automatically a good paper layout. Add print-specific CSS so navigation, buttons, and interactive controls do not consume pages.
#1 Best Overall
<style>
@media print {
nav, .toolbar, button, .chat-widget { display: none !important; }
a { color: #000; text-decoration: none; }
h1, h2, h3 { break-after: avoid; }
table, figure, pre { break-inside: avoid; }
.page-break { break-before: page; }
}
</style>
Use a real print preview rather than guessing. If a page is too wide, reduce the browser scale or switch to landscape before rewriting the markup. For long tables and code blocks, test several representative pages; a rule that prevents splitting can move a large object to the next page and create unexpected white space.
External fonts, images, and scripts must be reachable when printing. A local file may be blocked from loading a remote resource, and a page that renders content after a delay may print before that content appears. Wait for the page to settle, or use a converter with an explicit JavaScript wait setting.
3. Paste raw HTML into an online converter
If you only have markup in an editor and do not want to create a temporary web page, use a service whose interface accepts raw HTML. HTML2PDF.app advertises a browser converter that accepts either a URL or raw HTML. HTMLPDF.dev advertises a playground where you paste HTML, choose paper settings, and download the PDF.
HTML2PDF.app
The service documents an API that accepts “Raw HTML markup or a publicly reachable URL” and returns a PDF from an authenticated request. Its documentation says conversions run in headless Chromium, so modern HTML, CSS, and JavaScript are supported, subject to resource availability and load timing. Keep the API key on your server or in a trusted job; do not place it in browser-side JavaScript.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchHTMLPDF.dev
Its API accepts either url or html, not both, and documents options including A4, Letter, orientation, and margins. The online playground is useful for a one-off conversion because you can paste markup and adjust paper settings without writing code.
| Need | Browser print | Raw-HTML web converter | API conversion |
|---|---|---|---|
| One document, no account | Best fit | Usually possible, depending on the service | Not ideal |
| Paste markup directly | Requires opening a rendered file | Supported by HTML2PDF.app and HTMLPDF.dev | Supported when the provider exposes an html field |
| Repeatable batch jobs | Manual | Limited | Best fit |
| Paper, margin, and orientation controls | Print dialog | Playground controls vary | Provider parameters |
| JavaScript and external assets | Rendered by your browser | Depends on the converter’s renderer and timing | Depends on the provider’s renderer and timing |
| Privacy | HTML stays on your device | Markup is sent to a third party | Markup or URL is sent to a third party |
4. Automate HTML-to-PDF conversion
For invoices, reports, or scheduled exports, send either the raw markup or a public URL to an authenticated API and save the binary response as a PDF. The exact endpoint, authentication header, and option names differ by provider, so replace the illustrative values below with the service’s current documentation.
cURL
curl -X POST 'https://api.example.invalid/pdf'
-H 'Content-Type: application/json'
-H 'Authorization: Bearer YOUR_API_KEY'
-d '{"html":"<h1>Invoice</h1><p>Total: $25</p>","format":"A4"}'
--output invoice.pdf
Do not use api.example.invalid in production; it is only a request-shape example. A production script should check the HTTP status, content type, and file size before treating the response as a valid PDF.
Python
import requests
html = "<h1>Invoice</h1><p>Total: $25</p>"
r = requests.post(
"https://YOUR_PROVIDER.example/pdf",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={"html": html, "format": "A4"},
timeout=90,
)
r.raise_for_status()
content_type = r.headers.get("content-type", "")
if "pdf" not in content_type.lower():
raise RuntimeError(f"Unexpected response type: {content_type}")
with open("invoice.pdf", "wb") as f:
f.write(r.content)
Node.js
const html = '<h1>Invoice</h1><p>Total: $25</p>';
const res = await fetch('https://YOUR_PROVIDER.example/pdf', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({ html, format: 'A4' })
});
if (!res.ok) throw new Error(`HTTP ${res.status}`);
const type = res.headers.get('content-type') || '';
if (!type.toLowerCase().includes('pdf')) throw new Error(`Unexpected type: ${type}`);
const fs = await import('node:fs/promises');
await fs.writeFile('invoice.pdf', Buffer.from(await res.arrayBuffer()));
For URL input, send a public HTTPS URL instead of html. A private localhost address, an intranet hostname, or a page that requires your browser session normally cannot be fetched by an external service unless that provider offers an authenticated-resource mechanism.
Or skip the browser setup
ScreenshotNeo is a URL capture API and MCP server. It can return PNG, JPEG, WebP, or PDF output, and it is the first service to try when you need clean captures: it accepts consent banners like a visitor and removes more than 60 known consent platforms, newsletter popups, and chat widgets before capture. Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed; response headers identify the page verdict and whether the request was billed.
For a public page, one GET request is enough. The example below uses the documented URL parameter; replace the target URL with your own page.
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)
r.raise_for_status()
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}`);
if (!res.ok) throw new Error(`HTTP ${res.status}`);
For PDF jobs, use the PDF option documented at ScreenshotNeo’s documentation or the MCP server’s capture_pdf tool. The MCP server also provides take_screenshot and get_page_info for Claude, Cursor, and other MCP clients.
Rank #3
Relevant controls include full-page capture with lazy images loaded, CSS-selector element capture, dark mode, 12 device presets or a custom viewport, retina scale, paper size, margins, landscape mode, page ranges, custom CSS and JavaScript, pre-capture clicks, hidden selectors, waits for a selector/delay/network idle, ad and tracker blocking, custom headers/cookies/user agent/Authorization, timezone and geolocation, transparent backgrounds, resizing, configurable-TTL caching, signed links, asynchronous jobs with signed webhooks, bulk capture for up to 100 URLs per call, a usage API, an OpenAPI specification, and compatibility with parameter names used by other screenshot APIs. Every feature is available on every plan. Pricing is Free for 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots, followed by $15 for 15,000, $39 for 60,000, $99 for 250,000, and $249 for 1,000,000. Yearly billing gives two months free.
Create a free ScreenshotNeo account to get 1,000 screenshots a month without a card.
5. Choose the right method
- Use browser printing for a one-off file, confidential content, or a local document that must not leave your computer.
- Use a raw-HTML playground when you want to paste markup, adjust paper settings visually, and download once.
- Use an API when your application generates documents repeatedly, needs consistent settings, or processes a queue of URLs.
- Use a URL capture service when the source is already hosted and you need scheduled, bulk, cleaned, or AI-agent-driven captures.
6. Troubleshooting common conversion problems
Colors or background images are missing
Enable Background graphics in the print dialog. Also verify that the asset URL is reachable and that your print CSS does not override the background.
The PDF has blank pages or content is cut off
Check paper size, margins, scale, and orientation first. A fixed-width container or a wide code block can overflow Letter or A4. Add print rules for wrapping and page breaks, then preview again.
Fonts, images, or charts are absent
Wait for network requests and client-side rendering to finish. Confirm that external resources permit access from the browser or conversion service. For automation, use a renderer with a documented JavaScript wait or network-idle control.
The Tool Desk
Outbyte Driver Updater FREEFix the driver behind crashes, sound loss and screen glitchesFind Drivers →Outbyte PC Repair FREEClear out junk files and repair common Windows errorsFree Scan →Rank #4
A table splits badly
Use print CSS such as break-inside: avoid on small tables and repeat table headers with the appropriate table markup. Very large tables may still need to split across pages to avoid excessive blank space.
The API returns HTML instead of a PDF
Inspect the status code and Content-Type. Authentication failures, validation errors, and rate limits are often returned as JSON or HTML. Log the response headers and body for failed requests, but never log API keys or sensitive document data.
The online converter cannot load my page
Check whether the URL is publicly reachable, whether a login or firewall blocks it, and whether robots or bot protection intervenes. A local browser is safer for private pages; an API with custom headers or cookies may be required for authorized resources.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.7. Privacy, retention, and reliability
Local browser printing keeps the HTML and its data on your device. Online tools receive whatever markup or URL you submit, so read their retention policy before uploading invoices, personal data, source code, or credentials.
Quick wins for a faster PC:
Scan for outdated or missing drivers - takes under a minuteDriver Scan →Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Retention terms differ. HTML2PDF.co.uk states that PDFs are served from memory and POST-submitted HTML is not stored, while URLs may be retained in conversion history. HTML2PDF.app says generated PDFs are processed temporarily and that selected metadata or a source URL may be retained in logs. Treat those statements as provider-specific, not as a guarantee for every converter.
Best Value
- HTML CSS Design and Build Web Sites
- Comes with secure packaging
- It can be a gift option
For dependable automation, use bounded timeouts, retry transient network failures with backoff, validate the returned content type, and keep a record of the source URL, renderer settings, and conversion status. Cache only when the document is unchanged and the provider’s cache behavior is acceptable for your data.
8. A practical decision checklist
- Is the HTML local, private, or behind a login? Prefer browser printing or a self-hosted renderer.
- Do you need to paste source markup? Choose a raw-HTML playground or an API that accepts
html. - Do you need JavaScript, web fonts, or lazy-loaded images? Confirm the renderer and its load-wait controls.
- Do you need A4/Letter, margins, landscape, or page ranges? Verify those options before committing to a provider.
- Will you convert many URLs? Use an authenticated API, asynchronous jobs, webhooks, or bulk requests rather than manual printing.
- Does the provider’s retention policy fit the sensitivity of your documents?
Frequently asked questions
Can I convert HTML that is only in a text editor?
Yes. Save it as an .html file and open it in a browser, or paste the markup into a converter that explicitly accepts raw HTML.
Should I send HTML or a URL to an API?
Send raw HTML when the document is generated inside your application or is not publicly hosted. Send a URL when the page already exists online and the renderer can reach all required resources.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Is a screenshot the same as a PDF?
No. A screenshot captures the rendered page as an image, while an HTML-to-PDF renderer lays content onto paper-sized pages. Choose PDF output when selectable text, pagination, or printing is important.
Frequently Asked Questions
Can I convert HTML that is only in a text editor?
Yes. Save it as an .html file and open it in a browser, or paste the markup into a converter that explicitly accepts raw HTML.
Should I send HTML or a URL to an API?
Send raw HTML when the document is generated inside your application or is not publicly hosted. Send a URL when the page already exists online and the renderer can reach all required resources.
Is a screenshot the same as a PDF?
No. A screenshot captures the rendered page as an image, while an HTML-to-PDF renderer lays content onto paper-sized pages. Choose PDF output when selectable text, pagination, or printing is important.
Recommended Free Tools
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.

