A file download QR code points at a file on your own server — a PDF, an installer, a dataset. The code carries the link; whether the phone saves the file or displays it is decided by the headers your server sends.
The payload is a plain HTTPS address, so Website URL on this site makes an identical code for free. What is worth knowing here is not the encoding but the handoff: the code gets the phone to the URL, and everything after that is your server’s headers and the phone’s idea of what to do with the file.
You cannot put the file in the code. A QR code holds a few hundred characters at a scannable size; the smallest useful PDF is thousands of times that. Every "file QR code" anywhere is a link, and anything claiming otherwise is describing a link with extra steps.
Because the destination is a file rather than a page, there is nowhere to show a message when something goes wrong. A missing file gives a bare 404 and a wrong content type gives silence. Pointing the code at a small landing page that then links the file costs one tap and makes every failure legible.
The document that always gets thrown away, available from the box it came in for as long as you keep the URL alive.
A code on the device itself pointing at the current file, so nobody has to search a support site for the right model.
A printable form on a noticeboard, where the alternative is a stack of photocopies that runs out.
The file is not in the code, and it cannot be. Capacity at a printable size is a few hundred characters.
Wrong content type looks like a broken code. The scan worked and the download started; the phone just does not know what it received. Check what your server sends before printing.
Mobile data is a real cost to your reader. A large file behind an unlabelled code is a bad surprise. Print the size.
The link has to outlive the print run. Files get tidied into new folders. Use a stable address and redirect.
Long URLs make dense codes: a 40-character address is 29 modules across and a 98-character one is 41, measured with this site’s encoder at the same error correction.