Use Puppeteer’s page.pdf() method after navigating to the page, and set print CSS, readiness checks, and PDF options deliberately. By default, PDF rendering uses print styles, omits background graphics, and may produce different colors or layout from the browser view.
Generate a PDF with Puppeteer
This minimal Node.js example opens a page, waits for navigation to reach a network-idle condition, writes a PDF, and closes the browser:
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
try {
const page = await browser.newPage();
await page.goto('https://example.com', { waitUntil: 'networkidle2' });
await page.pdf({ path: 'page.pdf' });
} finally {
await browser.close();
}
})();
The official guide recommends Page.pdf() for printing PDFs: Puppeteer PDF generation guide. The method returns a Uint8Array if you want to handle the PDF in memory rather than save it with path. Use Page.createPDFStream() when you need a readable stream. See the Page.pdf() API reference.
networkidle2 is a navigation condition, not proof that every application has finished fetching and rendering its data. For client-rendered pages, wait for a meaningful page-specific selector or application signal before calling page.pdf().
Recommended Free Tools
#1 Best Overall
- Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
- Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
- Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
- Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
- 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
Choose the page size, orientation, and margins
Puppeteer’s PDFOptions let you control paper dimensions and layout. The API reference surfaced as Puppeteer 25.12.0 documents these defaults and behaviors; check the reference and your installed version before relying on newer options.
| Option | Behavior | When to use it |
|---|---|---|
format |
Paper preset; defaults to Letter. Takes priority over width and height. |
Choose a standard paper size such as A4 or Letter. |
width and height |
Set dimensions when you are not using a prioritized format. |
Use for a custom page size. |
landscape |
Defaults to false. |
Set to true for a landscape document. |
margin |
Defaults to no margins. | Set top, right, bottom, and left spacing if the printed content needs room around the edges. |
preferCSSPageSize |
Defaults to false. When true, CSS @page size takes priority over API dimensions; otherwise Puppeteer scales content to fit the selected paper size. |
Use true when the page’s print stylesheet owns paper sizing. |
pageRanges |
Selects pages; an empty string means all pages. | Export only the page range you need. |
scale |
Defaults to 1; valid range is 0.1 to 2. | Adjust overall print size if content needs to fit differently. |
For example, this configuration requests landscape A4, adds margins, and tells Puppeteer to respect CSS page sizing:
await page.pdf({
path: 'report.pdf',
format: 'A4',
landscape: true,
margin: { top: '12mm', right: '10mm', bottom: '12mm', left: '10mm' },
preferCSSPageSize: true
});
Use one clear source of truth for page size. If CSS @page rules should control the paper, set preferCSSPageSize: true; otherwise specify the PDF size through the API and expect content to be scaled to fit.
Rank #2
- 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
- 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
- Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
- 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
- What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
Control print styles, backgrounds, and colors
page.pdf() renders with the print CSS media type by default. This means print-specific rules can hide navigation, change spacing, or reflow the page compared with its on-screen appearance. To request screen styles instead, call page.emulateMediaType('screen') before generating the PDF.
await page.emulateMediaType('screen');
await page.pdf({ path: 'screen-styled.pdf', printBackground: true });
Background graphics are off by default. Set printBackground: true when the PDF needs CSS background colors or images. Printing can also adjust colors for readability; use CSS -webkit-print-color-adjust: exact where exact color rendering is important. These settings address distinct issues: the media type selects which styles apply, printBackground includes background graphics, and the CSS color-adjust property requests closer color fidelity. See the PDFOptions reference and PDF generation guide.
For transparency, omitBackground can hide the default white page background. The API also marks tagged and outline as experimental, so verify their status for the Puppeteer version you deploy.
Rank #3
- Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
- Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
- Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
- Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
- What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
Wait for fonts and application content
PDFOptions.waitForFonts defaults to true, so Puppeteer waits for fonts before creating the PDF. The API notes that waiting for fonts may require bringing a background page to the front. See the PDFOptions reference.
Font readiness does not mean that your application’s asynchronous content is ready. If a page populates a report after navigation, wait for an element or condition that represents that completed state:
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemsawait page.goto('https://example.com/report', { waitUntil: 'domcontentloaded' });
await page.waitForSelector('[data-report-ready="true"]');
await page.pdf({ path: 'report.pdf', waitForFonts: true });
Replace the selector with a signal your application actually sets after its data and layout are ready. The guide’s networkidle2 example is useful for many pages, but long-lived connections or delayed application work can make a fixed navigation event the wrong readiness test.
Rank #4
- Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
- Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
- Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
- Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
- Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft
Add headers, footers, and page selection
Set displayHeaderFooter: true to print header and footer templates. The templates can use injected values for date, title, URL, page number, and total page count. pageRanges limits output to selected pages; an empty range string means all pages. timeout defaults to 30,000 milliseconds, and setting it to 0 disables the timeout. Consult the PDFOptions API for the supported fields and template details for your installed version.
Keep browser compatibility reproducible
Puppeteer guarantees compatibility with its bundled browser. Launch options such as executablePath and Chrome channel are available, but the launch reference warns that using a custom executable path is at your own risk. For repeatable PDF output, keep Puppeteer and its browser pairing consistent, and record both versions in deployment documentation. See the launch options reference.
Troubleshoot common PDF differences
- Layout differs from the browser: PDF output uses print media by default. Add or revise print CSS, or call
page.emulateMediaType('screen')before generating the PDF if screen styles are intended. - Backgrounds are missing: Set
printBackground: true; it defaults to false. - Colors look muted or changed: Printing can modify colors. Apply
-webkit-print-color-adjust: exactwhere exact CSS colors matter. - Text uses a fallback font: Keep
waitForFonts: trueand ensure the page can load its fonts. If the page is in the background, bring it to the front when needed for font readiness. - PDF is missing dynamically loaded data: Navigation completion does not guarantee that application work is done. Wait for a page-specific selector or state before calling
page.pdf(). - Content is clipped or unexpectedly scaled: Check whether
formatoverrides width and height, whetherpreferCSSPageSizeis enabled, and whether the CSS@pagesize matches your intended output. - PDF generation times out: The documented default is 30 seconds. Identify whether the page or font readiness is stalled before changing the timeout;
timeout: 0disables it but does not resolve a page that never becomes ready. - Output differs across environments: Use Puppeteer with its bundled browser for the documented compatibility guarantee, and keep the deployed versions consistent.
Or skip the browser setup
If you need a website capture rather than a Puppeteer-controlled print workflow, ScreenshotNeo provides a screenshot API and MCP server. One GET request can return an image or PDF:
Best Value
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
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. Cookie and consent banners, newsletter popups, and chat widgets are removed before capture; those steps can be turned off. Bot checks, blank pages, timeouts, failed loads, and cache hits are not billed, and response headers identify the page verdict and billing status. Its MCP server offers take_screenshot, get_page_info, and capture_pdf for AI agents. The free plan includes 1,000 screenshots per month with no card; paid plans start at $5 for 3,000 shots. Sign up free for 1,000 screenshots a month with no card.
Frequently Asked Questions
Does Puppeteer save a PDF automatically when I call `page.pdf()`?
Only if you provide a `path`; otherwise the method returns a `Uint8Array` containing the PDF.
Can I stream a generated PDF instead of buffering it?
Yes. Puppeteer provides `Page.createPDFStream()` for a readable stream.
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.

