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.

Use Puppeteer’s page.pdf() after your single-page application (SPA) has rendered the complete report or document. Wait for an application-specific selector or state, load content that normally appears only after scrolling or interaction, then choose print options deliberately. The fullPage: true option belongs to page.screenshot(); it does not make a PDF.

PDF or full-page image: choose the right API

Puppeteer has two separate output workflows:

Goal Method Result
Searchable, selectable document with page breaks page.pdf() Paginated PDF rendered with print CSS by default
Pixel-accurate visual capture of the entire document page.screenshot({ fullPage: true }) Image capture, such as PNG or JPEG

A PDF is laid out on paper-sized pages. It is not one infinitely tall screenshot. If you need an image for visual archiving, use the screenshot API; if you need a document users can search, print or annotate, use page.pdf().

Complete Node.js example

Install Puppeteer in a Node.js project, then replace the URL and readiness condition with values from your application. The selector below is illustrative: your SPA must set it only when all intended data and sections are rendered.

import puppeteer from 'puppeteer';

const browser = await puppeteer.launch();
try {
  const page = await browser.newPage();
  await page.goto('https://example.com/app/report', {
    waitUntil: 'domcontentloaded'
  });

  // Implement this marker in the target application.
  await page.waitForSelector('[data-pdf-ready="true"]', {
    visible: true,
    timeout: 30_000
  });

  // A heuristic only; keep the app-specific condition above.
  await page.waitForNetworkIdle({
    idleTime: 500,
    concurrency: 0
  });

  await page.pdf({
    path: 'report.pdf',
    format: 'A4',
    printBackground: true,
    preferCSSPageSize: true,
    waitForFonts: true
  });
} finally {
  await browser.close();
}

The current Puppeteer API reference reviewed for this workflow is version 25.12.0. Check the documentation matching the version installed in your project before relying on a version-specific option.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Sale
ETIKEZ D90E Inkless Portable Thermal Printer with Case – 8.5" x 11", Black
  • Portable Wireless Printer - The ETIKEZ D90E is an inkless printer and portable printer that uses advanced thermal technology, requiring no ink, toner, or ribbons, delivering cost-effective prints. Weighs only 2.08lb, the portable printer is incredibly lightweight and compact. Perfect for on-the-go printing during business travels, work, or university, it easily fits into backpacks or briefcases. Ideal for emergency scenarios, contracts, office documents, and more. only prints black and white
  • Bluetooth & USB Connectivity - Connect this D90E portable printer to iPhones or Android via Bluetooth. This wireless printer also works with PC over USB. As a thermal printer, it requires the Labelnize app for mobile printing; for PC, install drivers from Labelnize.com or the USB drive. This small portable printeris not compatible with Chromebooks. (Note: For laptop and computer use, connect via USB after downloading the driver from Labelnize.com.)
  • Multiple Printing and Format – The wireless portable printer supports 8.5" x 11" US Letter thermal paper (B0GD61HPDC, B0GD5JFC2Q). It meets all your various printing requirements, whether you're on the go or in a car. (Note: This thermal printer is compatible exclusively with A4 thermal paper and does not accept ordinary copy paper)
  • Gift-Ready - This portable printer, a gift for pros & students, works as a thermal printer for classroom, classroom printer for teachers, printer for college student, small classroom printer, printer for dorm room, thermal printer for teachers, and portable printer for classroom. It combines thermal & inkless, ideal for notaries, truckers, teachers, parents. Package: D90E Printer, USB-C Cable, 10-sheet Paper, Travel Case, Guide. (Charging adapter not included.)
  • How to solve paper jams: 1) Click once to pop up the paper - If the machine gets a paper jam, simply press the power button and the machine will automatically eject the paper. 2) Do not forcefully open the machine cover as it may cause injury or scratches . 3) Choose our flat thermal paper to avoid curling of the paper after printing. Note: Cannot use regular paper for printing

Make SPA readiness deterministic

domcontentloaded, load and network-idle events describe browser activity, not whether your application has finished rendering. A React, Vue or Angular view can fetch data after navigation, replace loading placeholders, poll continuously or defer sections until they enter the viewport.

Use a readiness selector

Have the application add a marker after data, charts and intended sections are complete:

<main data-pdf-ready="true">...complete report...</main>

Then wait for that marker with page.waitForSelector(). A visible match proves the element exists and is visible; it cannot prove that every child component contains final data, so place the marker at the point your application considers complete.

Use an application state condition

When a global flag is more reliable than a DOM marker, wait for it explicitly:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
await page.waitForFunction(
  () => window.reportState?.status === 'complete',
  { timeout: 30_000 }
);

Expose only a deliberate, stable readiness signal. Do not substitute an arbitrary sleep for a state condition.

Trigger deferred loading

Infinite lists, intersection observers and “load more” controls may not render content until a user scrolls or clicks. Reproduce those interactions before printing:

Rank #2
Sale
Portable Printers Wireless for Travel, A285M Small Inkless Thermal Printer
  • Portable Printers Wireless for Travel [Compact & Space-saving]: The portable printer weighs only 1.5lb and is small in size. This inkless portable printer fits easily into a backpack or briefcase! Ideal for on-the-go printing during business travel, in car or truck, small office, construction site, school and home use. You can print documents, contracts, invoices, receipts, recipes, lists and boarding passes anytime, anywhere
  • Wireless Bluetooth Printer [High Compatibility]: The portable thermal printer compatible with iPhone, Android Phone, iPad, Tablet via Bluetooth. Print documents, pictures, web pages from your phone anytime, anywhere. You can also use the USB-C cable to connect your laptop or computer for printing. (Note: Laptops and computers only work with USB connection, need to download the driver first: a285m.labelife.cc)
  • Thermal Printer [Multi-Size Printing]: The wireless portable printer with built-in paper bin, support thermal roll paper, continuous and single sheet thermal paper. A285M small wireless printer also supports 5 sizes of thermal paper: 8.5“ X 11” US Letter, A4, 4.33'' (110mm), 3.14'' (80mm), 2.08'' (53mm) width thermal paper, can meet most of your needs
  • Inkless Printer [Cost-Effective & Inkless Printing]: The Bluetooth mobile printer adopts advanced thermal technology, no ink, toner, or ribbon required during printing, no clogging and cleaning problems! (Note: Only support the thermal paper, Does not support regular copy paper. Only supports black and white printing.)
  • Mobile Printer [High Quality Printing]: The compact printer is designed for people who work outside. A wireless inkless portable printer is good for mobile notaries, truck drivers, business travelers, office workers, teachers and students. Note: Charging with 5V 2A. Don't use the charger that outputs above 5V
await page.evaluate(async () => {
  window.scrollTo(0, document.body.scrollHeight);
});
await new Promise(resolve => setTimeout(resolve, 300));
await page.waitForSelector('.report-last-section', { visible: true });

The delay here is only an example. Prefer a selector, count or state change that proves the newly requested content arrived. If the app has a load-more button, click it in a loop until it is disabled or the application reports completion.

Use network idle as a secondary heuristic

page.waitForNetworkIdle() resolves after network activity stays below its concurrency threshold for the configured idle interval and always waits at least that interval. The documented defaults include a 500 ms idle period and a concurrency threshold of zero. Polling, streaming and persistent connections can prevent it from resolving, while cached or already-rendered content can make it resolve too early. Keep your app-specific condition as the primary gate.

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

Ensure content beyond the viewport is present

Before export, inspect the document and the selectors that matter:

const details = await page.evaluate(() => ({
  scrollHeight: document.documentElement.scrollHeight,
  bodyHeight: document.body.scrollHeight,
  sections: document.querySelectorAll('.report-section').length
}));
console.log(details);
  • Confirm every intended section is in the DOM, not merely represented by a virtualized row that has not been rendered.
  • Scroll or interact to activate lazy images and deferred modules.
  • Wait for important images to finish loading and for fonts to become available.
  • Check that print CSS does not hide sections or constrain a container with an unintended height or overflow rule.

Puppeteer’s PDF operation waits for document fonts by default in the current API. If text still appears with fallback fonts, inspect the page and font loading state rather than adding increasingly long sleeps.

Control print media, page size and appearance

Print CSS is the default

page.pdf() uses print media. A stylesheet may change colors, hide navigation, alter layout or remove elements under @media print. This is often desirable for a document, but it means a PDF will not necessarily look like the screen.

If the requirement is explicitly screen styling, request it before generating the PDF:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
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.
await page.emulateMediaType('screen');
await page.pdf({
  path: 'screen-styled.pdf',
  format: 'A4',
  printBackground: true
});

Review the result carefully. For exact colors, author print rules deliberately and consider the CSS -webkit-print-color-adjust property documented by Puppeteer. Screen emulation is not a guarantee that a browser screenshot and a paginated PDF will be identical.

Choose dimensions deliberately

Option Purpose
format Preset paper size such as A4
width, height Explicit page dimensions
margin Top, right, bottom and left printable margins
printBackground Include background graphics; defaults to false
preferCSSPageSize Give CSS @page dimensions priority over format or explicit dimensions
pageRanges Restrict output to selected pages
scale Change rendering scale
waitForFonts Wait for document.fonts.ready; current API default is true

Use normal paper-sized pages for reports users will print or share. A custom, very tall page can be defined with width and height, but it is less portable and usually harder to read than normal pagination.

Author page-break rules

Use print-specific CSS to keep headings with content and prevent cards from splitting where practical:

@media print {
  .report-card { break-inside: avoid; }
  h2 { break-after: avoid; }
  @page { size: A4; margin: 14mm; }
}

With preferCSSPageSize: true, the @page size takes precedence. Test long tables, charts and images because browser pagination can still divide content at unexpected boundaries.

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

Inspect before exporting

When output is missing content, capture diagnostics in the same run:

console.log(await page.title());
console.log(await page.url());
console.log(await page.evaluate(() => ({
  ready: document.querySelector('[data-pdf-ready="true"]') !== null,
  height: document.documentElement.scrollHeight,
  fonts: document.fonts.status
})));
await page.screenshot({ path: 'debug.png', fullPage: true });

The debug image helps distinguish an application-rendering problem from a print-CSS problem. Also log browser console errors and failed requests while developing the export.

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

Troubleshooting common failures

PDF contains only the loading shell

Cause: navigation completed before asynchronous data rendering. Fix: add a readiness marker or state condition tied to the final report, then wait for it before calling page.pdf().

Lower sections or images are missing

Cause: lazy loading, virtualization or an interaction-gated section. Fix: scroll through the page, click required controls, wait for the last section or image state, and verify the DOM’s scroll height and section count.

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.

Network-idle wait never finishes

Cause: polling, analytics, WebSockets or another persistent request. Fix: rely on an app-specific readiness condition, or configure a bounded network-idle wait only as a supplemental heuristic.

PDF looks different from the browser

Cause: print media and @media print rules are active. Fix: inspect print CSS; use page.emulateMediaType('screen') only when screen styling is the actual requirement, and set printBackground: true when backgrounds are needed.

Colors or backgrounds are absent

Cause: printBackground defaults to false, and print color handling can differ. Fix: enable printBackground and review print color-adjust rules.

Fonts or layout shift after export

Cause: a web font failed, was blocked or had not completed loading. Fix: verify font requests, inspect document.fonts.status, keep waitForFonts: true, and correct the underlying font or CSP issue.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Best Value
Sale
Canon PIXMA TS4320 – Wireless Color Inkjet Printer with Print, Copy, Scan
  • Affordable Versatility - A budget-friendly all-in-one printer perfect for both home users and hybrid workers, offering exceptional value
  • Crisp, Vibrant Prints - Experience impressive print quality for both documents and photos, thanks to its 2-cartridge hybrid ink system that delivers sharp text and vivid colors
  • Effortless Setup & Use - Get started quickly with easy setup for your smartphone or computer, so you can print, scan, and copy without delay
  • Reliable Wireless Connectivity - Enjoy stable and consistent connections with dual-band Wi-Fi (2.4GHz or 5GHz), ensuring smooth printing from anywhere in your home or office
  • Scan & Copy Handling - Utilize the device’s integrated scanner for efficient scanning and copying operations

Blank PDF or navigation error

Cause: an incorrect URL, authentication requirement, certificate issue or application error. Fix: log the final URL, title, console errors and failed requests; establish authentication before navigation and confirm the page is usable in a headed browser during debugging.

Performance, reliability and cost considerations

  • Reuse a browser process for batches, but create a fresh page per export and always close pages and the browser in finally blocks.
  • Set explicit navigation and readiness timeouts so a broken app cannot hold a worker indefinitely.
  • Do not mistake a shorter delay for a faster export: deterministic readiness prevents both premature PDFs and unnecessary waiting.
  • Large images, charts and custom fonts increase memory and PDF size. Optimize those assets in the application when possible.
  • For repeatable output, pin Puppeteer and its browser revision, set viewport and timezone deliberately, and keep the target data stable.
  • Generate a normal paginated PDF unless a downstream system specifically requires a single tall page; standard pages are more portable.

Or skip the browser setup

ScreenshotNeo provides a website screenshot API and MCP server when you need a hosted capture instead of maintaining Chromium. Its PDF endpoint accepts a URL and can handle full-page capture, lazy images, waits, custom headers and cookies, and PDF paper, margin, landscape and page-range settings. Before capture it accepts 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, and response headers identify the page verdict and billing status. Its MCP tools—take_screenshot, get_page_info and capture_pdf—let Claude, Cursor and other MCP clients request captures.

See the ScreenshotNeo API documentation for authentication and options. A direct call is:

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

The same request in 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)

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

The Free plan includes 1,000 shots per month with no card. Paid plans start at $5 for 3,000 shots; every feature is on every plan, and yearly billing gives two months free. Sign up free for ScreenshotNeo.

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

FAQ

Does fullPage: true work with page.pdf()?

No. It is a screenshot option. PDF output is controlled by paper dimensions, print CSS and PDF options.

Can Puppeteer guarantee that any SPA is ready?

No universal wait exists. The application must expose a condition that represents completion for its own data and interactions.

Should I emulate screen media for every PDF?

No. Print media is the default and is usually the appropriate basis for a printable document. Emulate screen media only when preserving screen styling is an explicit requirement.

Frequently Asked Questions

Can I save just selected PDF pages?

Yes. Pass a page range such as pageRanges: '1-3' in the PDF options after the complete document has rendered.

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

Why is a normal paginated PDF preferable to one very tall page?

Standard pages are easier to print, view, share and process across PDF readers; choose a tall custom dimension only when a downstream requirement specifically calls for it.

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.