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

The fastest reliable approach is to do less work. Capture only the content you need, set an explicit html2canvas scale instead of inheriting a phone’s full device-pixel ratio, avoid one giant canvas, and measure capture, PDF assembly, and download as separate phases. These changes can reduce memory pressure and generation time, but neither html2canvas nor jsPDF publishes a universal mobile speed percentage. Test the same document on the iOS Safari and Android browser versions your users actually run.

Why mobile PDF exports feel slow

html2canvas is not a native screenshot API. It walks the DOM and reconstructs a canvas from browser-visible content and supported CSS. A complex page, large images, shadows, filters, transformed elements, and unsupported styles all increase work or produce a result that differs from the screen. The browser must then encode the canvas, jsPDF must place that image and assemble PDF objects, and the download handoff must create or transfer the final file.

Those stages compete for a phone’s memory. A high-density screen also increases the default canvas size: html2canvas uses window.devicePixelRatio when scale is not specified. A long page at a device pixel ratio of 3 can therefore require roughly nine times as many canvas pixels as the same CSS-sized page at scale 1 (3 × 3), before PDF encoding overhead.

Measure each phase before changing settings

Do not label one setting a proven speedup without measuring it. Add timings around capture, image insertion/PDF assembly, and saving. Use production-like content and test supported iOS Safari and Android browsers, because canvas limits and download behavior vary by platform.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Sale
Canon PIXMA TR160 Color Wireless Portable Printer
  • LIGHTWEIGHT AND PORTABLE - Connect and print on the go with the PIXMA TR160. This lightweight portable printer can fit into a bag or backpack with room to spare.
  • HIGH-QUALITY PRINTING ON THE GO - Print documents and photos up to 8.5” x 11” that showcase sharp black text and vibrant details with rich color thanks to a 5-Color Hybrid Ink System, including square and borderless prints.
  • SIMPLE & EASY CONNECTIVITY - Printing is only an app away when using the Canon PRINT app, Apple AirPrint4, or Mopria Print Service5 with your compatible device(s) or the cloud.
  • WIRELESS DIRECT MODE - Connect your compatible device to the printer even without a wireless router.
  • 1.44” OLED DISPLAY - Easily check ink levels, printer status, and other settings with the 1.44” Monochrome OLED.
const t0 = performance.now();
const canvas = await html2canvas(document.querySelector('#invoice'), {
  scale: 1.5,
  useCORS: true
});
const t1 = performance.now();

const pdf = new jsPDF({ unit: 'mm', format: 'a4' });
pdf.addImage(canvas, 'JPEG', 0, 0, 210, 0, undefined, 'MEDIUM');
const t2 = performance.now();

const blob = pdf.output('blob');
const t3 = performance.now();
console.table({
  captureMs: t1 - t0,
  pdfAssemblyMs: t2 - t1,
  outputMs: t3 - t2,
  bytes: blob.size
});

Run each candidate more than once, discard a first-load outlier, and record generation time, PDF byte size, text readability, page completeness, and whether the tab becomes unresponsive. The documentation provides options and constraints, not comparative mobile benchmarks.

Reduce the canvas work first

Capture a specific element

Pass the smallest useful element rather than document.body. Remove navigation, cookie notices, hidden templates, and unrelated widgets from the capture tree. A dedicated print component is usually faster and more predictable than cloning an entire application view.

const node = document.querySelector('#receipt');
const canvas = await html2canvas(node, {
  scale: 1.5,
  backgroundColor: '#ffffff',
  windowWidth: 390,
  windowHeight: 844
});

windowWidth and windowHeight let you choose the viewport used for the cloned layout. Set them intentionally when a responsive breakpoint must match a particular phone rather than whatever viewport happens to be active.

Use cullOffscreen for viewport-sized exports

For an export that intentionally covers only what is visible, evaluate cullOffscreen: true. It skips painting nodes that are fully outside the capture viewport and can help on large pages. It is conservative around transformed, fixed, and sticky elements, so inspect headers, overlays, and positioned artwork after enabling it. Do not use it when the PDF must contain an entire long document.

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

Split long documents

A single full-page canvas is the most common memory trap. Render page-sized sections (or bounded vertical slices), add each image to jsPDF, and release references before processing the next page. Validate that fonts, borders, and repeated headers remain complete. Splitting is an implementation strategy, not a guarantee: profile memory on target phones.

Tune scale for readable output

Start with an explicit value such as 1, 1.5, or 2 and compare it with the default device-pixel-ratio behavior. Lower scale means fewer pixels to paint and encode; higher scale can make small text and thin lines sharper. There is no universally correct value.

Rank #2
Sale
NDYIN Portable Printers Wireless for Travel, N80 Bluetooth Thermal Printer
  • Wireless Bluetooth Printer: Portable thermal printer compatible with iPhone, Android phones, iPad and tablet computers via Bluetooth. For smartphones, please download the "Nada Print" App. You can also connect to laptops and computers for printing using a USB-C cable. (Note: Laptops and computers can only be connected via USB and require the installation of a driver first. Bluetooth connection is not supported.)
  • No-ink printing: Only supports US Letter and A4 size thermal paper.(Doesn't support regular paper) The no-ink portable thermal printer uses direct thermal technology, requiring no ink, toner or ribbons, making it environmentally friendly, cost-effective and time-saving. The thermal printer package comes with a roll of US Letter thermal printing paper. Note: When installing the paper, remember to switch the paper size switch on APP
  • Clear Print: NDYIN N80 portable thermal printer adopts high-definition printing technology, with a 203DPI resolution to provide you with clear printing results. This mobile printer is compatible with roll paper, folded paper and tattoo transfer paper, supporting printing from your mobile phone PDF, Word, pictures and web pages anytime and anywhere. It is recommended to use our NDYIN thermal paper to achieve good printing quality
  • Portable wireless printer for travel: The thermal printer is equipped with a built-in 1500mAh rechargeable battery, which can print 160 sheets of 8.5" x 11" thermal paper after being fully charged. It weighs only 1.5 pounds and is compact in size. This ink-free portable printer can be easily carried in a backpack or briefcase! It is perfect for business travel, cars, small offices, construction sites, schools and homes. You can print documents, contracts, invoices and boarding passes anytime and anywhere
  • The N80 thermal printer has a wide range of uses. The package includes the N80 printer, a roll of US Letter paper(7m/roll), a user manual, a guide card, a type-C soft cable and a type C adapter. Note: The charging adapter is not included. Special thermal paper is required for use; ordinary paper cannot be used. This ink-free portable thermal printer is suitable for various scenarios such as home, school, travel, office, and outdoor, meeting the printing needs of different groups of people. This tattoo template printer is also compatible with tattoo transfer paper, making it an ideal choice for tattoo art
Scale choice Likely trade-off What to verify
1 Lowest pixel count and memory use Small text remains readable in the PDF
1.5–2 More detail and larger work set Generation time, file size, and phone responsiveness
Default (devicePixelRatio) Automatic sharpness, potentially very large canvases Whether high-density phones hit memory or canvas limits

Keep CSS dimensions and scale decisions separate. A smaller CSS capture with scale 2 can be preferable to a huge page at scale 1, but only a representative test can establish that for your layout.

Prevent blank and partial canvases

Canvas maximum dimensions and total area differ by browser, hardware, and operating-system version. iOS Safari’s limits are lower and device-dependent; exceeding a limit can yield a blank or clipped canvas without a useful JavaScript error. Do not rely on one permanent “maximum iPhone size.”

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
  • Prefer bounded, page-sized captures for long content.
  • Check canvas.width and canvas.height and reject implausibly small results.
  • After each page, remove references and allow garbage collection before starting another capture.
  • Show a retry message instead of silently downloading an empty PDF.
if (!canvas.width || !canvas.height || canvas.toDataURL().length < 1000) {
  throw new Error('Capture returned an empty or unexpectedly small canvas');
}

Fix images and cross-origin content

useCORS: true does not bypass the browser’s origin policy. It works only when the image server permits the request with suitable CORS headers. If a CDN image lacks permission, use a same-origin proxy you control, host a permitted copy, or omit/replace the image.

const canvas = await html2canvas(node, {
  useCORS: true,
  imageTimeout: 15000,
  scale: 1.5
});

Wait for critical images and fonts before starting capture. A missing image can make you blame jsPDF for a delay or visual defect that occurred during DOM reconstruction.

Choose an efficient jsPDF image and output path

jsPDF accepts a canvas directly, so avoid converting it to a base64 data URL unless your workflow requires one. For JPEG images, its documented compression choices are NONE, FAST, MEDIUM, and SLOW. Compression is a quality, byte-size, and CPU trade-off; measure on the same phone.

Rank #3
Sale
Gloryang Inkless Portable Printer for Travel, Wireless Thermal Printer Supports 8.5 x 11 Inch Thermal Paper, Bluetooth Machine Includes Carry Case and 3 Rolls of Paper Kit, Black
  • Inkless Printing – Gloryang portable printer uses advanced thermal technology, requiring no ink, toner, or ribbons. The package includes the printer, 3 thermal paper rolls (1 pre-installed + 2 extras), a carrying case, charging cable, manual, and guide card. Cost-effective and easy to use. Note: Only compatible with Gloryang thermal paper; not for regular, inkjet, or plain paper.
  • Seamless Bluetooth Connectivity – The Gloryang mobile sticker printer connects easily to iOS and Android via Bluetooth through the “Jadens Printer” app. It also works as a compact printer for laptops and computers—simply turn on the printer first, then install the driver to set up. Print anytime, anywhere.
  • Ultra-Portable Design - Weighing just 1.75lb and measuring 1.7in thick, the Gloryang portable printer is incredibly lightweight and compact. Perfect for on-the-go printing during travels, work, or university, it easily fits into backpacks or briefcases. Ideal for emergency scenarios, contracts, office documents, and more.
  • Space-Saving Design - Say goodbye to clutter with the built-in paper bin of the Gloryang printer. It saves space and keeps your workspace tidy, whether you're on the go or in a car. With two ways to load thermal paper and the ability to print documents ranging from 2 to 8.5 inches, it caters to various printing needs.
  • Perfect Gift for Holiday-Gloryang thermal printer can print clear photos, image, design drawings and text. It's perfect for busy professionals and students. Come with a nice case, making it as a perfect Christmas and new year gift for your families and friends.
const pdf = new jsPDF({ unit: 'mm', format: 'a4' });
const pageWidth = 210;
const pageHeight = (canvas.height * pageWidth) / canvas.width;
pdf.addImage(canvas, 'JPEG', 0, 0, pageWidth, pageHeight, undefined, 'FAST');

// Choose the handoff your app measures best:
const blob = pdf.output('blob');
// const buffer = pdf.output('arraybuffer');

output('blob') and output('arraybuffer') are available alongside save and data-URL forms. Benchmark the final handoff, including object-URL creation or share-sheet invocation; an API form that looks efficient in isolation may not be fastest in your app.

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.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Keep repeated exports healthy

In a long-lived single-page application, html2canvas exposes clearImageCache for clearing its shared image cache after rendering. Do not clear it while concurrent captures are using the cache. Serialize exports or coordinate cache ownership, revoke object URLs after download, and drop canvas references when a job finishes.

A complete mobile-oriented example

async function downloadReceipt() {
  const node = document.querySelector('#receipt');
  if (!node) throw new Error('Receipt element not found');

  const started = performance.now();
  const canvas = await html2canvas(node, {
    scale: 1.5,
    windowWidth: 390,
    windowHeight: 844,
    cullOffscreen: false,
    useCORS: true,
    backgroundColor: '#fff'
  });
  if (canvas.width === 0 || canvas.height === 0) throw new Error('Empty capture');

  const pdf = new jsPDF({ unit: 'mm', format: 'a4' });
  const width = 210;
  const height = canvas.height * width / canvas.width;
  pdf.addImage(canvas, 'JPEG', 0, 0, width, height, undefined, 'MEDIUM');
  const blob = pdf.output('blob');
  const url = URL.createObjectURL(blob);
  const link = document.createElement('a');
  link.href = url;
  link.download = 'receipt.pdf';
  link.click();
  setTimeout(() => URL.revokeObjectURL(url), 0);
  console.log(`export finished in ${Math.round(performance.now() - started)} ms`);
}

Why is my jsPDF download still slow?

  • Capture is slow: reduce the element, lower scale, remove expensive CSS and test image loading.
  • PDF assembly is slow: compare JPEG compression modes and avoid base64 conversion.
  • Download is slow: measure Blob creation and the browser handoff separately; the PDF may already be generated.
  • Only iPhones fail: split the canvas, reduce dimensions, and test the affected Safari versions rather than applying a universal pixel threshold.
  • Images disappear: configure server CORS or proxy the assets; useCORS cannot override policy.
  • Sticky or transformed elements move: inspect the cloned layout, adjust capture dimensions, and avoid culling for those regions.

Or skip the browser setup

For server-side or automated screenshots, ScreenshotNeo returns PNG, JPEG, WebP, or PDF from one request. It accepts consent banners before capture, removes more than 60 known consent platforms plus newsletter popups and chat widgets, and bills only clean shots: bot checks, CAPTCHAs, blank pages, timeouts, failed loads, and cache hits are not billed. Its MCP server provides take_screenshot, get_page_info, and capture_pdf tools to Claude, Cursor, and other MCP clients.

cURL:

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

Python:

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)

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}`);

See the parameter reference and PDF options in the ScreenshotNeo documentation. The free plan includes 1,000 screenshots a month with no card; paid plans start at $5 for 3,000. Create a free ScreenshotNeo account.

FAQ

Does html2canvas create a real browser screenshot?

No. It reconstructs a canvas from DOM and supported browser-visible styles, so unsupported CSS and browser restrictions can change the result.

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

Should I always use scale 1 on phones?

No. Scale 1 is a useful low-work baseline, but choose the lowest value that preserves the readability your document requires.

Can I make a cross-origin image work by setting useCORS?

Only when the remote server sends permission through CORS headers. Otherwise use a same-origin proxy or another asset.

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.