Free tools Windows power users keep installed
One-click scans. No signup required.
A blank Puppeteer PDF in production does not point to one universal fix. First determine whether Chrome failed to start, the page never became ready, print CSS hid its content, or the deployed image differs from the one that works locally. Then follow the matching branch below. Record your Puppeteer and Chrome versions, cloud runtime, launch and navigation errors, and whether the same page works in the same container image locally.
Start by identifying what “blank” means
Before changing launch flags or cloud settings, inspect the deployed page and the generated PDF. A truly empty document, missing text, unexpected styling, and a PDF that was never successfully produced are different symptoms. Save the page URL, navigation result, console and page errors, and a screenshot from the deployed browser context if possible.
- No usable PDF or browser connection: investigate Chrome installation, launch errors, shared libraries, writable paths, and sandbox configuration.
- PDF exists but content is absent: check whether the page has populated and whether print CSS hides its content.
- Graphics appear but text or glyphs are missing: check installed fonts and character coverage.
- It works locally but not in the cloud: compare the browser executable and version, operating-system image, runtime restrictions, and timing.
Do not treat a successful HTTP response or a completed page.goto() call as proof that application data has rendered. Record which phase succeeds: browser launch, navigation, application readiness, and PDF generation.
Check readiness before calling page.pdf()
Puppeteer’s PDF guide demonstrates navigating with waitUntil: 'networkidle2' before generating a PDF. That is a useful starting point, not a guarantee that every application has finished rendering. A page may still be waiting for an API response, a timer, client-side hydration, or a canvas operation after network activity becomes quiet.
#1 Best Overall
- Entry-level NAS Personal Storage:UGREEN NAS DH2300 is your first and best NAS made easy. It is designed for beginners who want a simple, private way to store videos, photos and personal files, which is intuitive for users moving from cloud storage or external drives and move away from scattered date across devices. This entry-level NAS 2-bay perfect for personal entertainment, photo storage, and easy data backup (doesn't support Docker or virtual machines).
- Set Your Devices Free, Expand Your Digital World: This unified storage hub supports massive capacity up to 64TB.*Storage drives not included. Stop Deleting, Start Storing. You can store 22 million 3MB images, or 2 million 30MB songs, or 43K 1.5GB movies or 67 million 1MB documents! UGREEN NAS is a better way to free up storage across all your devices such as phones, computers, tablets and also does automatic backups across devices regardless of the operating system—Window, iOS, Android or macOS.
- The Smarter Long-term Way to Store: Unlike cloud storage with recurring monthly fees, a UGREEN NAS enclosure requires only a one-time purchase for long-term use. For example, you only need to pay $459.98 for a NAS, while for cloud storage, you need to pay $719.88 per year, $2,159.64 for 3 years, $3,599.40 for 5 years. You will save $6,738.82 over 10 years with UGREEN NAS! *NAS cost based on DH2300 + 12TB HDD; cloud cost based on 12TB plan (e.g. $59.99/month).
- Blazing Speed, Minimal Power: Equipped with a high-performance processor, 1GbE port, and 4GB RAM on Board, this NAS handles multiple tasks with ease. File transfers reach up to 125MB/s—a 1GB file takes only 8 seconds. Don't let slow clouds hold you back; they often need over 100 seconds for the same task. The difference is clear.
- Let AI Better Organize Your Memories: UGREEN NAS uses AI to tag faces, locations, texts, and objects—so you can effortlessly find any photo by searching for who or what's in it in seconds. It also automatically finds and deletes similar or duplicate photo, backs up live photos and allows you to share them with your friends or family with just one tap. Everything stays effortlessly organized, powered by intelligent tagging and recognition.
Verify that the expected content exists in the page before printing. Use an application-specific condition when the page exposes a reliable signal—for example, waiting for a known element that appears only after its data is rendered. If that condition times out, investigate the page and its network or application errors rather than extending the timeout blindly.
Puppeteer’s documentation says that Page.pdf() waits for fonts to load by default. That helps with font readiness, but it does not establish that application data, images, or every custom rendering task is complete.
Minimal Node.js example
This example follows Puppeteer’s documented navigation and PDF calls. Replace the URL and, where appropriate, add a readiness check for your application.
const puppeteer = require('puppeteer');
async function createPdf(url) {
const browser = await puppeteer.launch();
try {
const page = await browser.newPage();
const response = await page.goto(url, { waitUntil: 'networkidle2' });
if (!response || !response.ok()) {
throw new Error(`Navigation failed: ${response ? response.status() : 'no response'}`);
}
// Add an application-specific readiness check here if content renders asynchronously.
await page.pdf({ path: 'output.pdf' });
} finally {
await browser.close();
}
}
createPdf('https://example.com').catch(error => {
console.error(error);
process.exitCode = 1;
});
The status check is useful for separating an unsuccessful navigation from a PDF-rendering problem. Some sites or workflows may have their own acceptable response conditions; inspect the actual response and page rather than assuming every non-success condition has the same cause.
Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Scan for outdated or missing drivers - takes under a minute3Repair Windows errors before they cause bigger problemsCheck print CSS and page settings
page.pdf() generates output using the print CSS media type by default. The Puppeteer API documentation describes it as generating a PDF “with the print CSS media type.” A site’s print stylesheet may hide content, change visibility, or rearrange the layout for paper. If the PDF is blank while a browser screenshot shows the page, inspect the page in print mode first.
Rank #2
- 【Advanced Home Data & Media Hub】For advanced home users who need phone backup, file storage, and centralized data management. Centralize family photos, 4K videos, movies, computer backups, and personal files in one place while running multiple apps for home entertainment and everyday data management. Suitable for households with growing digital libraries and multiple NAS use cases.
- 【Built for Creators, Media Servers & Advanced Apps】Powered by the Intel N100 Quad-Core CPU, 8GB DDR5 RAM, 2.5GbE networking, and dual M.2 NVMe slots, DXP2800 handles large files and heavier workloads with ease. Run Docker, virtual machines, and media server applications compatible with Plex—ideal for content creators, tech enthusiasts, and advanced home users managing 4K videos, RAW photos, personal media libraries, and multiple NAS apps.
- 【Up to 80TB for Growing Digital Libraries】 Supports up to 80TB of storage using two HDD bays and two M.2 NVMe SSD slots for family photos, movies, RAW photos, 4K videos, work files, and device backups. AI photo management supports recognition of people, objects, scenes, and locations, album organization, and duplicate photo detection. HDDs and SSDs are not included.
- 【AI-powered Home Surveillance】Turn DXP2800 into a centralized home surveillance hub by connecting compatible network cameras and storing recordings locally on your NAS. AI-powered features include Face Recognition, People Detection, and Pet Detection, helping advanced home users review important events more efficiently while managing home surveillance and personal data in one place.
- 【One data Center Across Your Devices】Keep files from desktops, laptops, phones, tablets, and other devices together instead of scattered across cloud accounts and external drives. Access, back up, organize, and share data across Windows, macOS, Android, iOS, web browsers, and compatible smart TVs—ideal for creators and advanced home users working across multiple devices.
If you need the page’s screen styling in the PDF, switch media type before calling page.pdf():
await page.emulateMediaType('screen');
await page.pdf({ path: 'output.pdf' });
Use this only when screen styling is the intended output. For a document meant to print, fix the site’s print CSS or PDF-specific layout instead. Puppeteer also documents that print output modifies colors by default. When exact colors matter, use the CSS property -webkit-print-color-adjust; color adjustment by itself is not evidence that an otherwise fully blank PDF has the same cause.
Verify Chrome is installed and matches your package
A deployed process that cannot start or connect to Chrome is a different problem from a page that renders incorrectly. Check the installation path and executable selected by your application. Puppeteer normally downloads a compatible Chrome for Testing when the puppeteer package is installed. If a package manager blocks install scripts, that download can be skipped and launch may fail with an error such as “Could not find Chrome.”
Recommended Free Tools
Make browser installation explicit in your deployment process or allow Puppeteer’s installation script to run. If you use puppeteer-core, it does not download Chrome; your deployment must provide a compatible browser and configure the executable selection itself. Check that the browser included in the final deployed artifact is the one the application tries to launch.
Check Linux libraries and fonts
On Linux, a browser executable can be present yet fail to launch because required shared libraries are missing. Puppeteer documents ldd as a check for missing libraries. Run it against the Chrome executable in the actual deployment image:
Rank #3
- Your Personal Streaming Server - Build your own Netflix-style media library and stream 4K movies, shows and photos to any device without monthly fees
- Create Your Own Cloud - Store your entire photo, video and music collection; access from anywhere with fast 282 MB/s transfer speeds
- Creator-Grade Backup Solution - Protect your irreplaceable content with automated backups to cloud services, external drives and remote NAS
- Multi-Layered Data Protection - Combine RAID redundancy, automated backups and snapshot technology to prevent data loss from any cause
- Smart Home Surveillance - Support up to 30 IP cameras with AI detection, instant alerts and secure remote monitoring
ldd /path/to/chrome | grep 'not found'
Replace /path/to/chrome with the executable path used in your image. Install dependencies appropriate to that Chrome build and base image; avoid copying an old package list without checking the image and current browser. Puppeteer’s Linux troubleshooting page lists common dependencies but notes that what is needed can depend on what is already installed.
If the PDF has visible graphics but missing or substituted text, compare installed fonts between local and deployed environments. A cloud image may need extra fonts for the document’s scripts; Puppeteer’s troubleshooting guidance specifically notes possible additional font requirements for Chinese, Japanese, and Korean characters in some setups. Font fallback can explain missing glyphs, but it should not be confused with an entirely empty document unless the observed output supports that diagnosis.
Check writable paths and sandbox configuration
Chrome writes profile, configuration, and cache data during startup. In a read-only or tightly restricted container, confirm that the directories Chrome uses are writable. If the deployment mounts only selected paths, configure the browser profile and related paths to use writable storage. Puppeteer gives /tmp as an example when that directory is writable in the environment.
A failure before Puppeteer connects to Chrome belongs in the launch and environment branch, not the print-CSS branch. Use the exact startup error to narrow the investigation.
Do not add --no-sandbox as a routine cloud fix. The Chromium sandbox helps protect the host from untrusted web content, and Puppeteer strongly discourages running without it. If Chrome reports “No usable sandbox!”, investigate the host and container’s sandbox setup and distribution restrictions. Disabling the sandbox removes a security boundary; it is not a general remedy for blank PDF bytes.
Rank #4
- Value NAS with RAID for centralized storage and backup for all your devices. Check out the LS 700 for enhanced features, cloud capabilities, macOS 26, and up to 7x faster performance than the LS 200.
- Connect the LinkStation to your router and enjoy shared network storage for your devices. The NAS is compatible with Windows and macOS*, and Buffalo's US-based support is on-hand 24/7 for installation walkthroughs. *Only for macOS 15 (Sequoia) and earlier. For macOS 26, check out our LS 700 series.
- Subscription-Free Personal Cloud – Store, back up, and manage all your videos, music, and photos and access them anytime without paying any monthly fees.
- Storage Purpose-Built for Data Security – A NAS designed to keep your data safe, the LS200 features a closed system to reduce vulnerabilities from 3rd party apps and SSL encryption for secure file transfers.
- Back Up Multiple Computers & Devices – NAS Navigator management utility and PC backup software included. NAS Navigator 2 for macOS 15 and earlier. You can set up automated backups of data on your computers.
Account for cloud runtime behavior
Cloud services differ in their base images, filesystem permissions, CPU allocation, browser dependencies, and packaging rules. Puppeteer’s troubleshooting documentation covers several providers, but its instructions are not interchangeable or guaranteed to match every current runtime version or account configuration. Check the documentation for the specific service and configuration you deploy.
Cloud Run
Puppeteer’s guide says the default Cloud Run Node.js runtime lacks system packages needed for Headless Chrome and documents using a custom Dockerfile with the required dependencies. The guide also warns that Cloud Run may disable CPU after an HTTP response is sent. If browser work continues after the response, it can appear unusually slow or fail to finish as expected. Complete PDF generation before responding, or review the service’s current options for always-allocated CPU if background work is required. This is a runtime timing concern, not proof that blank PDF content was caused by Cloud Run itself.
App Engine and Cloud Functions
The Puppeteer guide says App Engine standard and Cloud Functions Node.js runtimes include system packages for Headless Chrome. It also suggests placing Puppeteer’s cache inside node_modules to accommodate cached dependency-install behavior on those platforms. Confirm that advice against the exact runtime and deployment configuration in use.
Lambda and EC2
The guide discusses package-size constraints for Lambda and points to a community Chromium package; for EC2, it discusses installing Chromium and its dependencies. These are distinct deployment paths, not universal setup commands. Check the current provider and package documentation before choosing a browser build or copying configuration.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Use a repeatable diagnostic sequence
- Capture the environment: log the Puppeteer version, Chrome executable and version, cloud provider and runtime, and relevant launch options.
- Confirm launch: distinguish a Chrome startup or connection error from a successful browser session.
- Confirm navigation: inspect the final page URL, navigation response, and console or page errors.
- Confirm content: inspect the deployed page and verify the expected application content exists before PDF generation.
- Compare media: determine whether print CSS hides or moves content; try screen media only if that is the intended PDF styling.
- Compare environments: reproduce with the same browser version and operating-system image locally, if possible, then check libraries, fonts, writable paths, sandbox, and runtime behavior.
- Preserve evidence: save the failing PDF, a deployed-page screenshot, and logs from the same attempt so changes can be evaluated against the same input.
Common failure symptoms and fixes
| Symptom | Likely branch to inspect | Next action |
|---|---|---|
| “Could not find Chrome” or browser executable missing | Install script blocked, wrong package, or executable selection | Ensure the compatible browser is installed in the deployed artifact; configure the executable explicitly when using puppeteer-core. |
| Chrome fails before Puppeteer connects | Missing shared libraries, unwritable profile/cache path, or sandbox restriction | Check launch logs, inspect dependencies with ldd, verify writable paths, and investigate sandbox setup. |
| PDF opens but expected content is absent | Application not ready or print CSS hides content | Verify page content before printing and inspect print media; use an application-specific readiness condition. |
| Text is missing or substituted, but other content appears | Font availability or glyph coverage | Compare installed fonts and fallback behavior in the local and deployed images. |
| Browser work becomes slow after an HTTP response | Cloud runtime CPU allocation or background-work timing | Finish PDF work before responding or use the provider’s supported CPU configuration for background processing. |
Performance and reliability considerations
PDF generation depends on more than the final page.pdf() call: Chrome must start, the page must load, application content must render, and the PDF must be written. Measure those phases separately in production logs so a slow navigation is not mistaken for slow PDF rendering. Keep checks specific to the application; waiting indefinitely for network quiet can be a poor fit for pages with ongoing connections, while a short arbitrary delay can print before data is ready.
Best Value
- Secure private cloud - Enjoy 100% data ownership and multi-platform access from anywhere
- Easy sharing and syncing - Safely access and share files and media from anywhere, and keep clients, colleagues and collaborators on the same page
- Automated Backup Protection - Set-and-forget backups for Macs, PCs and mobile devices to multiple destinations including cloud and external drives
- Home Security System - Record and monitor your property 24/7 with support for multiple IP cameras and remote viewing
- 2-Year Warranty - Reliable hardware backed by Synology's expert customer support team and ongoing software updates
Use the same browser build and operating-system image in testing and deployment where practical. That makes differences in libraries, fonts, and browser behavior easier to isolate. Ensure the output path is writable and that the request lifecycle allows generation to complete before the process or runtime suspends work. The documentation does not establish a universal timeout, memory requirement, or cloud configuration that makes all Puppeteer PDFs reliable, so set operational limits based on the actual page and runtime.
Or skip the browser setup
If your task is to obtain a website screenshot or PDF rather than operate Chrome yourself, ScreenshotNeo provides a website screenshot API and MCP server. Its API accepts one GET request with a URL and can return PNG, JPEG, WebP, or PDF. The direct code path avoids installing and configuring Puppeteer in your own cloud runtime:
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 banners are accepted and removed before the shot, along with supported newsletter popups and chat widgets; these cleanup 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 gives AI agents tools for screenshots, page information, and PDF capture. 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 networkidle2 guarantee the page is ready for a PDF?
No. It is a documented navigation example, but an application may still be rendering data or other content. Verify the expected page content or wait for an application-specific readiness signal.
Quick wins for a faster PC:
Clear out junk files and repair common Windows errorsFree Scan →Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Repair Windows errors before they cause bigger problemsFix Now →Does Puppeteer wait for fonts before making a PDF?
Yes. Puppeteer’s PDF generation guide says Page.pdf() waits for fonts by default; the deployed image still needs suitable fonts for the document’s characters.
Should I use --no-sandbox on a cloud server?
Not as a blanket fix. Puppeteer strongly discourages disabling the sandbox; investigate the host and container configuration if Chrome reports a sandbox error.
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.

