The pdf worker parses PDF documents on the machine. A PDF is not text: reading
one with a file-reading function returns binary noise and spends the context on
it, so every PDF goes through pdf::* instead. Parsing is local, needs no
credential, and sends nothing anywhere.
Its first job is a routing decision. pdf::classify samples the document's
content streams and answers whether the pages hold real characters or are
photographs of pages, plus which individual pages cannot be read without a
vision model and why. That verdict decides whether the rest of the work is
worth doing at all, and it is what separates "this document is empty" from
"this document is a scan".
Its second job is reading. Text-based documents convert to markdown that keeps the shape of the original, because headings, lists and tables are recovered from font sizes and page geometry rather than from any structure the file promises. Underneath that sit the positions themselves, for callers that need to know where text is and not only what it says.