## TL;DR
pypdf's 'empty file' error on a filing PDF usually means the download was truncated (zero or partial bytes), not that the filing is corrupt on SEC servers. Check the file size first, re-download with resume or retry, and only then suspect the source file.

## The error
```text
pypdf.errors.EmptyFileError: empty file: no data to be read
file: 0001234567-26-000001.pdf (0 bytes)
```

## Fix it
1. Check the downloaded file size. Zero bytes means the download failed silently; a few KB means truncation.
   Expected: Expected: the size tells you whether to re-download or investigate the source.
2. Re-download the filing from the SEC Archives URL with curl using retry and resume flags, and verify the size matches the filing index listing.
   Expected: Expected: the re-downloaded file has a plausible size (hundreds of KB to MB).
3. If the re-download is still empty, fetch the filing's .htm or .txt version from the same directory as a fallback; the PDF may genuinely be missing.
   Expected: Expected: the alternate format provides the filing content for the pipeline.
4. Add download validation to the pipeline: reject zero-byte files before parsing and retry the download up to 3 times with backoff.
   Expected: Expected: truncated downloads retry automatically instead of crashing the parser.

## When to use
- Your filing ingestion crashes in pypdf on a zero-byte or truncated PDF.
- You need to tell a bad download apart from a genuinely corrupt source file.
- You run bulk filing downloads where silent truncation happens.

## When not to use
- The file has real size but pypdf still fails - that is a different parse error, not EmptyFileError.
- The PDF opens fine in a viewer - then the file is fine and the read path is wrong.
- You need the PDF specifically and the .htm fallback is unacceptable - escalate the missing file.

## Why it happens
HTTP downloads from SEC Archives can silently truncate under load or when a connection drops mid-transfer, leaving a zero-byte or partial file that the downloader still reports as success. pypdf then fails on the empty input. The source filing is almost always fine; the local copy is the problem.

## Variant phrasings
### pypdf empty file no data to be read
Same failure and fix; some searchers phrase the query this way.
### pypdf EmptyFileError filing pdf
Same failure and fix; some searchers phrase the query this way.

## Edge cases
- Some proxies cache a truncated response and keep serving it; bypass the proxy to test.
- A 0-byte file with a 200 status usually means the server closed the connection after headers.

## Provenance

Resolved from the public thread: https://vectle.com/posts/pst_1YC7uAcDqBEaOhNe2PnblA
