Skip to content
ATSPrep
Build my resume

Resume PDF reading order: columns, sidebars and text boxes

A single-column resume read the same in pdf.js, pdftotext and our checker. Columns, sidebars and text boxes came back in different orders.

From Reading order by layout and reader
In this guide

Reading order is the sequence in which an extractor hands your lines to the parser. A single-column resume came back identically in all three readers we tested. A two-column page, a left sidebar and a contact block in a text box each came back in at least two different orders from the same file. Our own checker used to read across columns; we fixed that on 20 October 2026 after these tests.

The short version

  • Single column: pdf.js, pdftotext and the ATSPrep checker returned the same lines in the same order.
  • Two columns: pdf.js read column by column and pdftotext set the two headings side by side. Our checker used to interleave the lines and file the wrapped “Present” as the first bullet; we fixed both on 20 October 2026.
  • Left sidebar: pdf.js and pdftotext read the whole sidebar first, so the name arrived on line 11.
  • Contact text box: pdf.js returned the email and phone after the last bullet; our checker returned the email before the name.
  • Greenhouse's own support page lists columned layouts and contact details in a text box as causes of a failed parse.

Reading order by layout and reader

Each fixture holds the same name, contact line, role, three bullets, skills and education. Only the layout changes.

Layoutpdf.jspdftotextATSPrep checker
Single columnin orderin orderin order
Two columnscolumn by columnheadings side by sidecolumn by column
Left sidebarsidebar first, name on line 11sidebar first, name on line 11main column first, then sidebar
Contact details in a text boxcontact box lastcontact box after the nameemail before the name
Word two-column section (DOCX)not a PDFnot a PDFin order
The same section saved as PDFcolumn by columncolumn by columncolumn by column
The order each reader returned

Single column: one order everywhere

The single-column control came back line for line the same from all three readers: name, contact, heading, role, bullets, skills, education. That is the order a parser expects, and it is the order you wrote.

  1. 01Maya Ortiz
  2. 02maya.ortiz@example.com | (555) 010-4477 | Denver, CO
  3. 03EXPERIENCE
  4. 04Senior Data Analyst, Northwind Traders Inc. | 2021 - Present
  5. 05• Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
  6. 06• Built a churn model that three regional sales teams now use to plan renewals
  7. 07• Trained 12 analysts on dbt and code review
  8. 08SKILLS
  9. 09SQL, Python, Tableau, dbt, Excel
  10. 10EDUCATION
  11. 11B.S. Statistics, Lakeview University, 2018
Single column (the ATSPrep checker, order-single-column.pdf)

Two columns

PDF 32000 §14.8.2.3 (checked 19 October 2026) defines page content order as "determined by the sequencing of graphics objects within a page's content stream", and says that order "should normally (for Western writing systems) proceed from top to bottom (and, in a multiple-column layout, from column to column)". pdf.js follows the content stream, and Chromium wrote the left column first, so pdf.js read it cleanly.

pdftotext deliberately ignores the stream. Its manual says the default is to "'undo' physical layout (columns, hyphenation, etc.) and output the text in reading order", and with -raw it will "Keep the text in content stream order". On our page its reconstruction put SKILLS straight under EXPERIENCE and slotted single skills between the bullets.

Our checker used to group text by line position only, so it read across both columns: EXPERIENCE and SKILLS fused into one line, and each skill landed between bullet fragments. The date “2021 - Present” had wrapped in the narrow column, and the checker filed “Present” as the first bullet.

We fixed both on 20 October 2026 after these tests. The checker now looks for a clear gap that runs down the page between two blocks of text and reads one column at a time, and it puts a date end that wrapped onto its own line (“- Present”) back with the role. The text it shows still has “- Present” on a line of its own, because that is where the PDF put it.

  1. 01Maya Ortiz
  2. 02maya.ortiz@example.com | (555) 010-4477 | Denver, CO
  3. 03EXPERIENCE
  4. 04SKILLS
  5. 05Senior Data Analyst, Northwind Traders Inc. | 2021
  6. 06- Present
  7. 07SQL
  8. 08• Cut weekly reporting time from 6 hours to 40
  9. 09minutes by automating SQL pipelines
  10. 10Tableau
  11. 11• Built a churn model that three regional sales teams
  12. 12now use to plan renewals
  13. 13Excel
  14. 14• Trained 12 analysts on dbt and code review
  15. 15Python
  16. 16dbt
  17. 17EDUCATION
  18. 18B.S. Statistics, Lakeview University, 2018
Two columns (pdftotext 26.10.0, order-two-column.pdf)
  1. 01Maya Ortiz
  2. 02maya.ortiz@example.com | (555) 010-4477 | Denver, CO
  3. 03EXPERIENCE
  4. 04Senior Data Analyst, Northwind Traders Inc. | 2021
  5. 05- Present
  6. 06• Cut weekly reporting time from 6 hours to 40
  7. 07minutes by automating SQL pipelines
  8. 08• Built a churn model that three regional sales teams
  9. 09now use to plan renewals
  10. 10• Trained 12 analysts on dbt and code review
  11. 11SKILLS
  12. 12SQL
  13. 13Python
  14. 14Tableau
  15. 15dbt
  16. 16Excel
  17. 17EDUCATION
  18. 18B.S. Statistics, Lakeview University, 2018
Since the fix: two columns (the ATSPrep checker, order-two-column.pdf)
  1. 01Maya Ortiz
  2. 02maya.ortiz@example.com | (555) 010-4477 | Denver, CO
  3. 03EXPERIENCE
  4. 04Senior Data Analyst, Northwind Traders Inc. | 2021 - Present
  5. 05• Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
  6. 06• Built a churn model that three regional sales teams now use to plan renewals
  7. 07• Trained 12 analysts on dbt and code review
  8. 08SKILLS
  9. 09SQL, Python, Tableau, dbt, Excel
  10. 10EDUCATION
  11. 11B.S. Statistics, Lakeview University, 2018
After: the same content in one column (the ATSPrep checker, order-single-column.pdf)

Text boxes

Our text-box fixture positions the email and phone in a box at the top right, written into the page after the body, which is how a floating box usually ends up in an export. Visually it sits beside the name.

Each reader put it somewhere different. pdf.js followed the stream and returned the contact details after the last bullet. pdftotext placed them after the name and title. Our checker returned the email first, then the name, then the phone, because the box sits a little higher on the page than the name's baseline. All three kept the text; none kept it where it appears. Our checker still filed the name, email and phone in the right fields.

  1. 01Maya Ortiz
  2. 02Senior Data Analyst
  3. 03EXPERIENCE
  4. 04Senior Data Analyst, Northwind Traders Inc. | 2021 - Present
  5. 05• Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
  6. 06• Built a churn model that three regional sales teams now use to plan renewals
  7. 07• Trained 12 analysts on dbt and code review
  8. 08maya.ortiz@example.com
  9. 09(555) 010-4477
Before: contact details in a text box (pdf.js 6.3.289, order-text-box.pdf)
  1. 01maya.ortiz@example.com
  2. 02Maya Ortiz
  3. 03(555) 010-4477
  4. 04Senior Data Analyst
  5. 05EXPERIENCE
  6. 06Senior Data Analyst, Northwind Traders Inc. | 2021 - Present
  7. 07• Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
  8. 08• Built a churn model that three regional sales teams now use to plan renewals
  9. 09• Trained 12 analysts on dbt and code review
Before: the same file (the ATSPrep checker, order-text-box.pdf)

Word's two-column sections

Word's own columns (Layout, Columns, Two) flow text from the bottom of the left column to the top of the right. In the DOCX that flow is one sequence of paragraphs, and our importer read it perfectly: 8 roles, 24 bullets, 5 skills.

Exported to PDF by LibreOffice 26.8.1.1, pdf.js and pdftotext still read column by column. Our checker used to pair each left-column line with the right-column line beside it, starting with the name joined to a bullet. Since our fix on 20 October 2026 it returns the same lines as pdf.js and files the same 8 roles, 24 bullets and 5 skills as from the DOCX.

  1. 01Maya Ortiz
  2. 02maya.ortiz@example.com | (555) 010-4477
  3. 03EXPERIENCE
  4. 04Senior Data Analyst, Northwind Traders Inc. | 2021 - Present
  5. 05• Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
  6. 06• Built a churn model that three regional sales teams now use to plan renewals
DOCX with a two-column section (the ATSPrep checker, order-word-columns.docx)
  1. 01Maya Ortiz
  2. 02maya.ortiz@example.com | (555) 010-4477
  3. 03EXPERIENCE
  4. 04Senior Data Analyst, Northwind Traders Inc. | 2021
  5. 05- Present
  6. 06[U+F0B7] Cut weekly reporting time from 6 hours to
Since the fix: the same file as PDF (the ATSPrep checker, order-word-columns-pdf.pdf)

What ATS vendors say about columns and text boxes

Greenhouse is one of the few vendors that publishes its list. Its support article on unsuccessful parses (checked 19 October 2026) names "Resumes that have a columned layout" and "Resumes with the name and contact information in the header, footer, or text box". The fixtures above show the mechanism: the text is there, but the order it comes back in depends on the extractor.

How to fix reading order

  • Use one column for everything a parser fills in: name, contact details, job titles, employers, dates and bullets.
  • Put contact details in the body as ordinary text under your name, not in a text box or a sidebar.
  • List skills as a comma-separated line or short list under a SKILLS heading in the same column.
  • Keep dates on the same line as the role, and make sure the line doesn't wrap at any width you export.
  • Test the export in two readers. If both return your sections in the order you wrote them, the layout is doing its job.

How we tested

We built every fixture from the same fictional one-page resume, changing one thing at a time. PDFs come from Chromium 153.0.8010.12 (printed through Playwright 1.63.0) and from LibreOffice 26.8.1.1 converting our DOCX files, the way Word users export. Each file was read three ways: pdf.js 6.3.289 getTextContent, poppler pdftotext 26.10.0 in its default mode, and the importer the ATSPrep checker runs in your browser. DOCX files have no PDF text layer, so only our importer reads them. The code blocks on this page are the readers' output, copied by script; private-use and control characters are written as [U+XXXX] because they would otherwise be invisible.

These are three common open readers, not any employer's applicant tracking system. Commercial parsers use their own extractors, so treat a failure here as a risk to remove, not a prediction of what a specific system will do.

Common questions

Does PDF text extraction keep columns in reading order?

Sometimes, and it depends on the extractor. On our two-column fixture pdf.js read column by column because it follows the PDF's content stream; pdftotext rebuilt the layout and set the two headings side by side. The ATSPrep checker used to read straight across both columns; since a fix on 20 October 2026 it reads them one at a time. A single column came back identically in all three.

What is the reading order of a single-column resume PDF?

Top to bottom, exactly as written. Our single-column fixture returned name, contact line, EXPERIENCE, role, bullets, SKILLS and EDUCATION in that order from pdf.js, pdftotext and our checker.

Is a sidebar resume ATS friendly?

It's a risk. In our test pdf.js and pdftotext read the whole sidebar before the name, and our checker interleaved sidebar and body lines until we fixed it on 20 October 2026. Other parsers won't all have that fix. Move contact details under your name and skills into the main column.

Do applicant tracking systems read text boxes?

The text inside a text box usually extracts, but not where you put it. In our fixture pdf.js returned the boxed email and phone after the last bullet, pdftotext after the name, and our checker before the name. Greenhouse lists contact information in a text box as a cause of failed parses.

How do I run a resume ATS text extraction test on a PDF or DOCX?

Read the file the way software does. For a PDF, copy all of its text into a plain-text editor, or run pdftotext resume.pdf - in a terminal, and check that each section comes back in order. For PDF or DOCX, the ATSPrep checker shows the lines its importer read, in order, in your browser.

Sources and further reading

  1. PDF 32000-1:2008, §9.10 Extraction of Text Content and §14.8.2 Logical Structure, Adobe / ISO
  2. pdftotext(1) manual page, poppler-utils, Debian
  3. PDFPageProxy.getTextContent, PDF.js API, Mozilla
  4. Unsuccessful resume parse, Greenhouse Support
  5. Test fixture: order-two-column.pdf, ATSPrep
  6. Test fixture: order-sidebar.pdf, ATSPrep
  7. Test fixture: order-text-box.pdf, ATSPrep
  8. Test fixture: order-word-columns.docx, ATSPrep
  9. Test fixture: order-word-columns-pdf.pdf, ATSPrep

Put it into practice on a real resume.

Each example is a complete resume with role keywords and bullets that show proof. Open one in the Studio and make it yours, then download it. The first download needs no account.

See what a parser reads in your own file.

The ATS checker reads your PDF or Word file with the same importer tested on this page and shows every line it got back, in order. It runs in your browser and the file isn't uploaded.

$0 forever · No watermark · No card · First download needs no account