> ## Documentation Index
> Fetch the complete documentation index at: https://docs.oviond.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PDF export

> Generate a downloadable PDF of a report on demand.

Oviond renders any report as a PDF on demand. Generation runs asynchronously in the background, so large reports don't block your browser — Oviond queues a job, renders the report headlessly, and stores the finished file for download.

## Generate a PDF

<Steps>
  <Step title="Open the share dialog">
    From the project, open **Share** and switch to the **Download** tab.
  </Step>

  <Step title="Click Generate New PDF">
    Oviond queues a generation job. The button shows **Generating** (or a queued count) while it works, and a new entry appears in the **Download History** list in a processing state.
  </Step>

  <Step title="Download">
    When the job completes, the history row flips to a success state and a **Download** link appears. Use the trash icon to remove an export and its stored file.
  </Step>
</Steps>

The list reflects each generation attempt's state — **processing**, **completed**, or **failed**.

## How it works

Generation is a two-step asynchronous flow:

1. `POST /v1/pdf/generate` validates the request and enqueues the job, returning a `job_id`. The request specifies the `project_id`, `client_id`, a page `format` (**A4** or **Letter**), and `orientation` (**portrait** or **landscape**). The defaults are `A4` and `portrait`.
2. `GET /v1/pdf/status/:job_id` is polled until `status` is `complete` (which returns the file `url`) or `failed`.

Each attempt is recorded in the project's export history, which the **Download History** list reads from.

<Note>
  PDF generation requires Oviond's file storage (S3) to be configured. If it isn't, the generate request is rejected.
</Note>

## Troubleshooting

**Generation fails or times out** — Very large reports with many widgets can occasionally fail to render. Try again, or split the report across more pages. Failed attempts show a **failed** state in the history list.

**Images or logos missing** — Make sure all image URLs in your report are publicly accessible. Private or expired URLs won't render in the headless browser.
