

11 September 2026

A resume is, in theory, structured information — name, experience, education, skills. In practice, it's an unstructured PDF with wildly inconsistent formatting: two-column layouts, tables, inconsistent section headers, PDFs exported from five different tools each with their own quirks in how they encode text. Turning that into clean structured data (name, email, skills list, experience entries) is a genuinely underrated data engineering problem, not a solved one-liner.
That's what this backend service does: an API-first service that takes a resume PDF in and returns structured fields out.
A PDF doesn't store text the way a person reads it — it stores positioned glyphs, and "this text is in a table" or "this is a section header" is something you have to infer from layout, not something the format tells you directly. Two-column resumes are a specific pain point: extracted text can interleave the left and right columns line-by-line instead of preserving reading order, which silently corrupts extraction if you don't handle it explicitly.
Structuring this as an API rather than a script that runs once and prints output was a deliberate choice — a parsing service that other systems (an applicant tracking flow, a profile auto-fill feature) can call as infrastructure needs to handle malformed input gracefully, return consistent error responses, and not assume it's the only consumer of its own output. Building it as a script first and "productionizing" it later tends to leave those assumptions baked in.
Resume parsing gets treated as a solved, boring problem because the idea is simple. The actual data is messy in ways that don't show up until you throw a real, diverse set of resumes at a parser — which is exactly why it's a better data engineering exercise than it first appears.
FAQ
PDFs store positioned glyphs, not structured text — layout information like columns, tables, and section boundaries has to be inferred, and two-column resumes in particular can have their text extracted out of reading order if not handled explicitly.