Published 2026-09-21. Updated 2026-09-21. · By Blake Crosley · Who makes it

What a resume parser reads from your file, shown on Jini's own

What Jini's parser receives from a PDF or Word file, why columns, tables, and image pages go wrong for it, and how to check your own file before anyone else does.

What the parser reads

Jini does not look at your resume; its parser reads the file, and this page shows what that parser receives. We cannot tell you what any vendor's parser does, because we hold no vendor's documentation and no reproducible test of any. We can show you exactly what Jini's parser does, because its code and its tests are in the open, and Check shows you its reading of your own file beside the original.

Jini's parser reads the text layer: the characters the file carries, taken word by word with their positions and put into lines from the top of the page down, not the page as a picture.[1] Everything Jini then does, from the readouts to the rewrite, starts from that text and from what the parser recorded about it: where each word sat on the page and how large it was, which is how columns and tiny type are found.[1:1]

That is why a file that looks fine can read badly. A page stored as a picture has no text layer for the parser to read: a page holding images and under twenty characters of text is treated as an image-only page.[1:2] Two columns come out as two separate runs of text on each line, which the parser marks as a multi-column layout.[1:3] A table is read row by row, so a value can land far from its label.[2] Text in a header or a footer is read apart from the body and can land out of place or repeat on every page.[2:1] None of that is visible on the page.

What goes wrong, and how much it costs in Jini's readout

Jini's structure readout starts at 100 and deducts a fixed amount for each layout hazard it finds, once per hazard however often it occurs: two columns, tables, text in headers or footers, text boxes, pages that are only images, an unusual reading order, tiny type, many pages, and section names the parser could not place.[3] The amounts are the formula's constants and the methodology page shows them, with a worked example.[3:1]

The extraction readout is the other half: how much of your text lands inside a resume item the parser can name, plus fixed awards for a name, a way to contact you, a job with a role and dates, an education entry, and a skills section.[4]

Check your own file

Drop the file into Check. Jini shows the extracted text beside your original, so you can see what its parser makes of the file before a person ever does, and marks each hazard where it found it. Correct anything it misread, then read the four readouts.[5] Nothing here is a guess about a particular employer's system: every number is computed by a published formula from things you can see on the page.[5:1]

What this page does not claim

What any vendor's parser reads, how often headers are skipped by anyone's software, or how any vendor's system compares with another's on a given file. We publish that only where we hold the vendor's documentation or our own reproducible tests, and we hold neither for the vendors people ask about.


  1. jini/services/check/parser_child.py, the PDF path: pdfplumber's words in text-flow order, grouped into lines by their vertical position and sorted left to right within a line; a run of words separated from the next by a gap much wider than the words around it is a separate block; every block carries its position and its font size, which the layout analysis reads (tests/parsing/test_layout.py: a body set below nine point is tiny type; the same text at eleven point is not); the constant IMAGE_ONLY_CHARS is twenty. Tested 2026-09-21 on the documents tests/check/fixtures.py builds in code (there is no committed resume file), through tests/check/test_parser_child.py (a one-column PDF stays one block per line; two columns are separate blocks and a hazard) and tests/parsing/test_layout.py (pages with images and no text are image-only pages; a page full of text and images is not). Unknown: PDFs with tagged structure, which some producers add and which the parser does not consult. ↩︎ ↩︎ ↩︎ ↩︎

  2. jini/services/check/hazards.json, the English catalog: the tables entry ("Jini read the cells in row order; a value may appear far from its label") and the header_footer_text entry ("extracted it separately from the body, so it may appear out of place or repeat on every page"); jini/services/check/parser_child.py, the Word path, reads a table row by row with the cells joined in order and each header and footer part once. Read 2026-09-21. ↩︎ ↩︎

  3. The deductions are the constants of jini/services/check/formula.py (formula version 1) and are rendered on /methodology from those constants; the hazard catalog is jini/services/check/hazards.json. Read 2026-09-21. ↩︎ ↩︎

  4. The awards and the coverage share are the same module's constants; /methodology computes the arithmetic on a fixture resume on every visit. Read 2026-09-21. ↩︎

  5. /methodology, read 2026-09-21: every readout's inputs are on the page, the page names the four readouts, and it says what Jini cannot see. ↩︎ ↩︎

Guides