Why your PDF is blank or missing content (JavaScript pages)
How the converter waits for a page, why late-loading content gets missed, and how to make it appear.
You convert a page and get an empty PDF, a loading spinner, or a dashboard with blank charts. The converter worked; it captured the page at the moment it considered loading finished, and some of your content arrived later. Here’s how waiting works and how to make sure your content is there in time.
How the converter decides a page is ready
The converter opens your HTML or URL in Chromium and runs its JavaScript. It prints once the document has loaded: the HTML is parsed, the load event has fired, and the resources requested during loading have finished. It doesn’t wait for content your code fetches or draws afterwards on a timer, and it doesn’t scroll or click. Each conversion also has an overall time limit (45 seconds for the whole request).
Common causes and fixes
Data fetched after the page loads
Single-page apps often render an empty shell, then call an API and fill it in. If that call starts after load, the PDF may show the empty shell. Best fix: render the data into the HTML before converting. If you generate the HTML yourself, put the values in directly instead of fetching them in the browser.
Content waiting on a timer
Code such as setTimeout(render, 1000) or a fade-in delay runs after the moment of capture. Render immediately, and turn off entrance animations for print.
Animations caught mid-way
Charts, counters and fade-ins are captured in whatever state they’re in. Disable animation in print, or in your chart library (see charts in HTML to PDF):
@media print {
*, *::before, *::after { animation: none !important; transition: none !important; }
}Content that appears on scroll or click
Lazy-loaded images, “load more” lists, accordions and tabs only show what’s visible without interaction. Render everything you need expanded, and avoid loading="lazy" on images that must appear.
Pages that need a login or block bots
The converter can’t sign in, and some sites show a challenge page to automated browsers. You’ll get the login or challenge page instead of your content, or an error. Save the HTML from your own browser and paste it instead.
A script fails
If a script throws an error early, the rest of your rendering code may never run. Test the exact HTML in a browser with the developer console open. Scripts loaded from a URL must be public and reachable. If a host can’t be reached the conversion fails; if a file is missing (for example a 404), the page converts without it, so code that depended on it never runs.
The most reliable approach: render first, convert second
Static HTML always converts predictably. If your page is built by a framework, generate the final HTML on the server (server-side rendering or a static export) and send that, or copy the rendered DOM from your browser’s developer tools (Elements → right-click the html element → Copy outer HTML) and paste it into the converter.
Quick checklist
- Does the content exist in the HTML, or does JavaScript fetch it later?
- Are there timers, animations or transitions?
- Does anything wait for scroll, hover or click?
- Are all scripts, fonts and images on public URLs?
- Is there a login, cookie wall or bot check?