Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

To convert HTML to PDF without launching Chrome, Firefox, or another full browser, use a document-oriented HTML-to-PDF engine. For Python services and static or server-rendered templates, WeasyPrint is a direct open-source option: it lays out HTML, CSS, and SVG as paged documents without relying on a full browser engine. For more elaborate print workflows and commercial support, consider Prince XML. If you only mean “without showing a browser window,” headless tools such as wkhtmltopdf are another category—they still use a browser rendering engine.

The distinction matters: “headless” means no visible browser interface; “browserless” means no full browser engine. This guide shows how to choose and use a browserless converter, handle common layout problems, and decide when a browser-based screenshot or PDF service is a better fit.

What “without rendering the webpage” means

HTML must still be interpreted and laid out before it can become a PDF. The practical distinction is which renderer does that work. A full browser engine is designed to display interactive websites; a document-oriented engine focuses on laying out HTML and CSS as pages. It can avoid starting a full browser runtime, but it does not eliminate rendering altogether.

This approach works best when the HTML already contains the content the PDF needs—for example, an invoice generated by a server template. It is less suitable when the page depends on JavaScript to fetch or assemble its content in the browser. In that case, first render the content in your application, choose an engine with script support, or accept a browser-based workflow.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Choose the right HTML-to-PDF approach

Option Rendering architecture Best fit Trade-off
WeasyPrint Document-oriented HTML/CSS/SVG engine; does not rely on a full browser engine Python services, invoices, reports, certificates, and other paged documents Use supported HTML/CSS features and validate your templates; output is not guaranteed for every combination of web and PDF features.
Prince XML HTML/XML formatter applying CSS; supports optional scripts Complex print CSS, paged-media workflows, or a need for commercial support Commercial product; confirm current licensing and deployment terms for your use.
wkhtmltopdf Headless Qt WebKit renderer Legacy templates that depend on WebKit behavior, or cases where a visible browser window is the only thing to avoid Headless does not mean browserless; it still uses a browser rendering engine.

The available project documentation describes these architectures and capabilities, but does not provide a comparable speed, memory, or fidelity benchmark. Choose based on your template, script needs, pagination requirements, and deployment constraints rather than assuming one is universally fastest.

Convert HTML to PDF with WeasyPrint in Python

Install WeasyPrint using the current instructions for your operating system in its first-steps documentation. Follow its platform-specific dependency guidance, then use the Python API to turn a string of HTML into PDF bytes:

from weasyprint import HTML

html_string = """
<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>Example report</title>
</head>
<body>
  <h1>Example report</h1>
  <p>This HTML is already rendered by the application.</p>
</body>
</html>
"""

# Use the directory or URL that relative image, stylesheet, and font paths
# should resolve against. A local directory is useful for bundled assets.
base_url = "/absolute/path/to/template-assets/"
pdf_bytes = HTML(string=html_string, base_url=base_url).write_pdf()

with open("output.pdf", "wb") as pdf_file:
    pdf_file.write(pdf_bytes)

When the HTML comes from a file or URL, use the corresponding documented input form, such as HTML(filename="report.html").write_pdf("output.pdf") or HTML("https://weasyprint.org/").write_pdf("/tmp/weasyprint-website.pdf"). Calling write_pdf() without an output path returns PDF bytes in memory; supplying an output path writes the result there. See the official API examples and setup details.

Make assets resolve predictably

Relative references such as images/logo.png need a base location. Pass an explicit base_url when constructing HTML, or use absolute paths or URLs for assets. Ensure the converter process can actually read each stylesheet, image, and font. A path that works in a developer’s browser may not exist inside a container or production service.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Design for pages, not a scrolling screen

Add print-oriented CSS so the layout has deliberate paper dimensions, margins, and breaks. For example:

@page {
  size: A4;
  margin: 18mm 16mm;
}

@media print {
  h1, h2 {
    break-after: avoid;
  }

  table, figure {
    break-inside: avoid;
  }

  .new-page {
    break-before: page;
  }
}

Choose page size and margins for your actual output, and test long tables and sections that may span pages. Screen CSS often assumes a continuous viewport; page layout introduces boundaries that can split headings, rows, and figures unless the print rules account for them.

Other ways to convert without a visible browser

Prince XML for advanced paged documents

Prince converts HTML or XML into PDF by applying CSS. Its documentation describes local or remote inputs, optional stylesheets and scripts, and combining multiple inputs into one PDF. A basic command-line invocation is:

prince input.html -o output.pdf

Use it when its paged-document capabilities or commercial support suit your requirements. Licensing and deployment terms depend on your use; verify current terms with the vendor rather than assuming a particular plan or wrapper is included.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

wkhtmltopdf for headless WebKit output

A basic invocation is:

wkhtmltopdf http://example.com output.pdf

The project identifies wkhtmltopdf as a headless command-line tool using Qt WebKit. That can meet a requirement to avoid opening a visible browser, and may help with an existing template tied to WebKit behavior. It does not meet a strict requirement to avoid a browser rendering engine.

Handle JavaScript, assets, and repeatability

JavaScript-generated content

A document engine cannot reliably print content that has not been generated or fetched. WeasyPrint is suited to HTML that is already materialized by your application. Prefer server-rendered or otherwise preassembled HTML for deterministic output. Prince documents optional script execution; check its current documentation for the exact workflow your template needs. If a page depends on browser-specific APIs or complex client-side behavior, a full browser renderer may be necessary.

External resources and privacy

When a converter fetches remote images, stylesheets, or fonts, output can change as those resources change, and the conversion process makes network requests. For reproducibility and tighter control, fetch and cache required assets in your application and provide stable local paths or controlled URLs. In a server environment, also consider whether user-supplied HTML or URLs could cause the converter to access resources you did not intend it to reach.

Validate the PDF, not just the HTML

Keep representative documents in your test suite, including a long table, an image-heavy page, and a document with the fonts and styles your production templates use. After conversion, check that the PDF has the expected text, links, fonts, page count, and page breaks. Verify the output using the PDF viewers and downstream systems your recipients use. The documented engine capabilities do not guarantee identical results for every HTML/CSS/PDF feature combination.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Troubleshooting common conversion problems

  • Images, fonts, or stylesheets are missing: Relative URLs may have no usable base. Supply an explicit base URL, check filesystem permissions and container paths, and confirm that remote resources are reachable from the converter environment.
  • The PDF omits text that appears after the page loads in a browser: The content may be created by JavaScript. Generate that content on the server before conversion, or select a tool and workflow that supports the required scripts.
  • Headings or table rows split awkwardly: Add print CSS for page size, margins, and page breaks; use break-avoid rules where appropriate, then test long content because a single row may be too large to fit on one page.
  • The PDF looks cramped or clipped: Replace screen-only assumptions with print styles, set explicit page dimensions and margins, and review fixed widths, overflow, and large images against the paper size.
  • Output changes between runs: Check for remote resources that change, unavailable fonts, or data that is assembled nondeterministically. Bundle or cache assets and keep the HTML input stable.
  • A “headless” tool fails the no-browser requirement: Headless describes the absence of a visible interface, not the rendering architecture. Use a document-oriented engine when avoiding a full browser engine is essential.

Performance, reliability, and cost considerations

Do not select an engine on an assumed speed advantage: the cited project documentation does not provide a like-for-like benchmark. Measure conversion time, resource use, and output quality with your own representative documents and deployment environment. Also assess the work around rendering: asset fetching, font availability, timeouts, concurrent jobs, and retry behavior can affect a production pipeline.

For reliability, keep HTML generation separate from conversion so failed PDFs can be reproduced from the input document. Log conversion errors, test upgrades against representative files, and validate outputs before distributing them. For cost, compare the engine’s licensing and the infrastructure you must operate; Prince is commercial, while the cited WeasyPrint and wkhtmltopdf projects are open source. Check current project and vendor terms for your deployment rather than treating licensing details as static.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

If the goal is to capture a live webpage as a PDF rather than convert already-prepared HTML in your own process, ScreenshotNeo offers a one-request screenshot API and PDF capture. A screenshot or PDF capture service is a different workflow from a local browserless document engine: it is useful when your input is a URL and you want the service to handle webpage capture.

Example cURL request:

curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

See the ScreenshotNeo API documentation for request options. This example saves an image response; use the API’s PDF options when you need a PDF.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

ScreenshotNeo accepts cookie and consent banners before capture and removes more than 60 known consent platforms, newsletter popups, and chat widgets; those steps can be turned off. Bot checks, blank pages, failed loads, timeouts, and cache hits are not billed, and response headers report the page verdict and billing status. Its MCP server provides take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients. The free plan includes 1,000 shots per month with no card; paid plans start at $5 for 3,000 shots. Sign up for 1,000 free screenshots a month with no card.

Frequently Asked Questions

Does browserless HTML-to-PDF conversion work for every website?

No. It is most dependable when the HTML and required assets are ready before conversion; interactive pages and browser-specific behavior may require a browser renderer.

Can WeasyPrint return a PDF without writing a file?

Yes. Calling write_pdf() without an output argument returns the PDF as bytes, which your application can store or send.

Is wkhtmltopdf browserless?

No. It runs headlessly but uses Qt WebKit, so it avoids a visible browser window rather than a browser rendering engine.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

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.