Free tools Windows power users keep installed

One-click scans. No signup required.

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

Use WeasyPrint first. On a Debian-based 32-bit ARM system, verify whether the userspace is armhf or armel, install the distribution’s weasyprint package, and run weasyprint input.html output.pdf. WeasyPrint is designed for paged HTML/CSS and works well for invoices, reports, receipts, and other documents whose content is already present in the HTML. If the page depends on JavaScript to build its content, use a Chromium/Chrome headless binary that is actually available for your ARM32 image instead.

1. Check which ARM32 userspace you have

“ARM32” does not identify one universal binary target. Debian’s armhf port is 32-bit hard-float ARMv7 with VFPv3, while armel targets older 32-bit ARM processors. A package built for ARM64 (arm64 or aarch64) is not an ARM32 package, and an armhf package should not be assumed to run on armel.

  1. Check the kernel architecture:
    uname -m
  2. Check the Debian package architecture:
    dpkg --print-architecture
  3. Record the release and CPU details when diagnosing a package failure:
    cat /etc/os-release
    lscpu

For this procedure, the useful result is normally armhf or armel. If the operating system reports arm64, you are not running an ARM32 userspace and should follow the package instructions for that architecture instead.

2. Convert static or print-oriented HTML with WeasyPrint

Install the packaged version

On Debian and Debian-derived distributions, the simplest route is the native package:

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.
#1 Best Overall
PUSR WiFi ARM-Based Linux Industrial Computer Ubuntu 22.04 Edge Computing Diverse I/O 2* RS485 2*CAN FD Industrial PC ARM Based IPC USR-EG228-EW
  • IPC Based ARM: Cortex-A7@1.2GHz, RAM 512M, ROM 8G
  • Ubuntu OS: Ubuntu 22.04 environment, original Node-RED
  • Edge Computing: WukongEdge engine, multiple fieldbus protocol
  • Diverse I/O interface: 2* RS485, 2*CAN FD, 2*Ethernet port, 1*USB
sudo apt update
sudo apt install weasyprint

The package pulls in the native text and graphics components WeasyPrint uses, including Pango, HarfBuzz, image libraries, and libffi. Installing only a Python wheel with pip does not replace those operating-system libraries.

Run a conversion from the shell

weasyprint input.html output.pdf

The command reads the local HTML file, resolves its permitted resources, lays it out as paged media, and writes the PDF. Use an absolute output path when a service runs from an unexpected working directory:

weasyprint /srv/reports/invoice.html /srv/reports/out/invoice.pdf

Call WeasyPrint from Python

from weasyprint import HTML

HTML("input.html").write_pdf("output.pdf")

For a URL or a file whose relative links matter, provide a base URL:

from weasyprint import HTML

HTML(filename="input.html", base_url="/srv/reports/").write_pdf("output.pdf")

A base URL helps the renderer find relative stylesheets, images, and fonts. In a web service, validate and constrain any user-controlled path or URL before rendering.

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

Use a virtual environment only after installing native libraries

If your application needs an isolated Python environment, install the distribution libraries first, then create the environment and install WeasyPrint in it. The exact package names vary by Debian release, so use the current WeasyPrint installation documentation and your distribution’s package index for the Pango, HarfBuzz, image, and libffi development/runtime packages. A virtual environment isolates Python packages; it cannot supply missing C libraries by itself.

Rank #2
OrangePi Zero4 4GB LPDDR5 AllWinner A733 Octa-core Single Board Computer with 3 Tops NPU, WiFi 6.0/Bluetooth 5.4, Development Board Run Linux/Debian/Ubuntu/Android(4GB)
  • 🍊 [High-Performance Octa-Core CPU]: OrangePi Zero4 is powered by Allwinner A733 with 2×Cortex-A76 + 6×Cortex-A55 cores up to 2.0GHz, delivering strong performance and efficiency for multitasking, edge computing, and embedded applications.
  • 🍊 [AI Acceleration with 3 TOPS NPU]: Integrated NPU provides up to 3TOPS (INT8) AI computing power and supports INT8/INT16/FP16/BF16 mixed precision. Compatible with mainstream frameworks for AI inference, vision, and smart applications.
  • 🍊 [4K Display & Rich Connectivity]: Features Mini HDMI 2.0 with up to 4K@60Hz output and USB Type-C with DP 1.4 support. Includes Gigabit Ethernet, dual MIPI CSI camera interfaces, USB 3.1, USB 2.0, 26-pin GPIO, and additional expansion interfaces for versatile development.
  • 🍊 [Next-Gen Wireless Connectivity]: Equipped with Wi-Fi 6 and Bluetooth 5.4 (BLE),OrangePi Zero3W offering faster speeds, lower latency, and more stable connections for modern wireless applications.
  • 🍊 [Ultra-Compact & Versatile SBC]: Measuring just 50 × 55mm, the Orange Pi Zero 4 is smaller than a business card while offering powerful computing and extensive I/O. Ideal for AI development, embedded systems, smart home devices, robotics, edge computing, multimedia, education, and other space-constrained applications.
python3 -m venv .venv
. .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install weasyprint
python -c "from weasyprint import HTML; HTML('input.html').write_pdf('output.pdf')"

3. Prepare HTML that prints predictably

Declare a page size and margins

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <style>
    @page {
      size: A4;
      margin: 18mm 15mm 20mm;
    }
    body { font-family: sans-serif; color: #222; }
    h1, h2 { break-after: avoid; }
    table { width: 100%; border-collapse: collapse; }
    th, td { border: 1px solid #bbb; padding: 6px; }
    thead { display: table-header-group; }
    tr { break-inside: avoid; }
  </style>
</head>
<body>
  <h1>Invoice 1042</h1>
  <table>...</table>
</body>
</html>

Print CSS controls page dimensions, margins, breaks, repeating table headers, and color treatment. Test long tables and images, not just a one-page sample.

Make resources available to the renderer

  • Use a correct base_url for relative paths.
  • Prefer local, deterministic assets for unattended jobs.
  • Use image formats and dimensions suitable for the available memory.
  • Embed or install fonts when the exact typeface matters; otherwise the fallback font can change line wrapping and page count.

Understand JavaScript boundaries

WeasyPrint is an HTML/CSS/SVG paged-media renderer, not a general browser. It does not execute application JavaScript to fetch data, click controls, or construct the final DOM. Render the data into the HTML before calling WeasyPrint. If the page is blank until JavaScript runs, choose a browser engine instead.

WeasyPrint’s own documentation cautions that valid output is not guaranteed when the selected HTML, CSS, or PDF features exceed the limits of the relevant specifications. Unsupported or partially supported CSS can therefore produce a PDF that opens successfully but does not match the browser layout.

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

4. When a headless browser is the right fallback

A browser engine is the conceptual fit for JavaScript-heavy applications, client-side charts, authenticated single-page apps, and pages that depend on browser APIs. Chrome’s headless interface can print a URL directly:

chrome --headless --print-to-pdf=output.pdf https://example.com
chrome --headless --print-to-pdf --no-pdf-header-footer https://example.com

These commands require a usable Chrome or Chromium executable compiled for the exact ARM32 distribution. Do not assume that an x86, ARM64, or unrelated vendor build will run. Verify the binary independently:

command -v google-chrome chromium chromium-browser
chromium --version

If no compatible browser exists for your image, return to the server-side HTML approach: fetch the data, render a complete document, and pass that document to WeasyPrint.

Browser-specific failure points

  • Missing executable: install a repository package for the target architecture or use a different renderer.
  • Sandbox restrictions: a service account may need a correctly configured sandbox; avoid disabling security casually.
  • Incomplete output: client-side requests may still be pending when printing starts. A browser automation wrapper must wait for a reliable application-ready signal.
  • Network access: private pages need the right cookies, headers, certificates, and DNS access from the conversion host.

5. Why wkhtmltopdf is not the default answer

wkhtmltopdf is a headless Qt WebKit HTML-to-PDF converter, but its project lists 0.12.6 as the stable series released on June 11, 2020. Its download guidance also carries a serious warning: do not use it with untrusted HTML unless user-supplied HTML and JavaScript are sanitized, because unsafe input can lead to complete server takeover.

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

If a legacy application is tied to wkhtmltopdf, locate a package for the exact architecture or build it from source and test it on the target image. Never substitute an arm64 package for an ARM32 build. Treat every HTML-to-PDF input as potentially hostile: isolate the renderer, restrict filesystem and network access, and sanitize user content.

6. Choose the renderer by capability, not by brand

Requirement WeasyPrint Headless Chrome/Chromium wkhtmltopdf
ARM32 package availability Use the Debian package for the detected armhf or armel userspace. Must be verified for the exact ARM32 image; do not assume an ARM64 build works. Check the exact architecture package or build; the stable series is 0.12.6 from 2020.
JavaScript fidelity Not a browser; prepare the final HTML first. Best fit when JavaScript creates the content. Legacy WebKit behavior; test modern pages carefully.
Paged-media and print CSS Designed for HTML/CSS/SVG documents and print layouts. Uses browser print layout and browser-specific behavior. Uses its Qt WebKit rendering path.
Operational considerations Usually the simplest small ARM32 deployment for static documents; no benchmark claim is implied. Higher browser startup and memory requirements are common considerations; measure your workload. Legacy security and compatibility concerns require extra review.

7. Troubleshoot common ARM32 conversion errors

Unable to locate package weasyprint

Confirm the distribution release, enabled repositories, and package architecture. Run dpkg --print-architecture and sudo apt update. If the release does not publish WeasyPrint for that userspace, use a supported repository build or a controlled source/virtual-environment installation with all native dependencies.

ImportError for Pango, HarfBuzz, cairo, or libffi

The Python package can be present while a shared library is missing. Install the distribution runtime/development packages named by the current WeasyPrint documentation, then retry in the same environment. Check linkage with your distribution’s package tools rather than copying random libraries from another architecture.

Images or CSS are missing

Relative URLs are being resolved against the wrong directory, or the renderer cannot access a remote resource. Supply base_url, use absolute paths where appropriate, and verify permissions and network policy. A successful PDF does not prove every asset loaded.

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

The PDF has missing text or unexpected page breaks

Install the intended fonts, check font fallback, and simplify unsupported CSS. Inspect @page margins, table widths, explicit breaks, and oversized images. Keep a minimal HTML fixture so you can identify which rule changes pagination.

The page is empty because data is loaded in JavaScript

Use a browser engine with a verified ARM32 binary, or render the data server-side before invoking WeasyPrint. Waiting longer in a non-browser renderer will not execute JavaScript.

Conversion is killed on a small board

This usually indicates memory pressure, especially with large images, many pages, or a browser process. Reduce image dimensions, process documents one at a time, close unused workers, and observe memory while converting. There is no published ARM32 performance or success-rate benchmark to use as a universal sizing rule.

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

8. Or skip the browser setup

ScreenshotNeo provides a website capture API and MCP server. It can return a PNG, JPEG, WebP, or PDF from one request, while handling browser setup on its service. Before capture it accepts cookie/consent banners and removes more than 60 known consent platforms, newsletter popups, and chat widgets; each cleanup step can be disabled. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and the response identifies the result with X-Page-Verdict and X-Billed headers.

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

For an API integration, start with the documented request format:

Best Value
Linux Mint Cinnamon Bootable USB for PC
  • Dual USB-A & USB-C Bootable Drive – works with almost any desktop or laptop computer (new and old). Boot directly from the USB or install Linux Mint Cinnamon to a hard drive for permanent use.
  • Fully Customizable USB – easily Add, Replace, or Upgrade any compatible bootable ISO app, installer, or utility (clear step-by-step instructions included).
  • Familiar yet better than Windows or macOS – enjoy a fast, secure, and privacy-friendly system with no forced updates, no online account requirement, and smooth, stable performance. Ready for Work & Play – includes office suite, web browser, email, image editing, and media apps for music and video. Supports Steam, Epic, and GOG gaming via Lutris or Heroic Launcher.
  • Great for Reviving Older PCs – Mint’s lightweight Cinnamon desktop gives aging computers a smooth, modern experience. No Internet Required – run Live or install offline.
  • Premium Hardware & Reliable Support – built with high-quality flash chips for speed and longevity. TECH STORE ON provides responsive customer support within 24 hours.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://example.com -o page.webp

See the ScreenshotNeo documentation for selecting PDF output and the other capture parameters. The same endpoint supports full-page capture, device and viewport settings, custom CSS and JavaScript, waits, cookies, headers, geolocation, caching, and asynchronous jobs.

Python

import requests

r = requests.get(
    "https://api.screenshotneo.com/v1/shot",
    params={"access_key": "YOUR_API_KEY", "url": "https://example.com"},
    timeout=90,
)
r.raise_for_status()
open("page.webp", "wb").write(r.content)

Node.js

const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://example.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
if (!res.ok) throw new Error(`ScreenshotNeo failed: ${res.status}`);
const data = Buffer.from(await res.arrayBuffer());
await import('node:fs/promises').then(fs => fs.writeFile('page.webp', data));

ScreenshotNeo also exposes take_screenshot, get_page_info, and capture_pdf through its MCP server 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 the free ScreenshotNeo plan to try it.

9. A practical deployment checklist

  • Confirm armhf versus armel before installing binaries.
  • Install WeasyPrint and its native libraries from packages appropriate to the image.
  • Render JavaScript data before WeasyPrint, or verify an ARM32 browser for dynamic pages.
  • Set @page dimensions, margins, breaks, fonts, and asset paths explicitly.
  • Test long tables, remote assets, missing fonts, and failure handling.
  • Sandbox any renderer that processes untrusted HTML and restrict its filesystem and network access.
  • Record the command, package architecture, and input fixture used for reproducible conversions.

Frequently Asked Questions

Can WeasyPrint run on a 32-bit Raspberry Pi?

It can run when the Raspberry Pi’s Debian userspace has a compatible WeasyPrint package and the required native libraries. Check whether the system is armhf or armel rather than relying on the board name alone.

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

Will an ARM64 Chrome package work on ARM32?

No. You need a Chrome or Chromium executable built for the target ARM32 userspace, and availability must be verified on that specific distribution image.

Does WeasyPrint support every CSS property?

No. Its output follows the HTML, CSS, and PDF features it supports; unsupported or partially supported features can change layout or pagination.

Is wkhtmltopdf completely unusable?

Not necessarily. A legacy application may still require it, but you must obtain an exact architecture build, account for its older 0.12.6 stable series, and follow its warning about untrusted HTML and JavaScript.

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.

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