We exported one resume 19 ways and read each PDF back with three text extractors. Two-column layouts kept their text. Wide heading spacing and flattened images did not.
Published by MatchCV. Editorial scope and corrections.
"Avoid columns, tables and fancy layouts" is the most repeated resume formatting advice there is. We wanted to see how much of it holds up when you look at a PDF's text the way a parser has to.
So we built the test. One sample resume went through every MatchCV template and through a set of layouts that are common in design tools. We converted each to a PDF and read the text back with three extraction methods. The short answer is that text almost always survives, and what breaks is structure: which heading a block of text sits under, and which job a date belongs to. Two things broke in every extractor we tried.
The resume is a fictional software engineer ("Alex Chen") with three jobs, 11 bullets, 13 keywords we looked for, and five headed sections. Every PDF was generated by headless Chromium, the same engine MatchCV uses for PDF export. The 19 files were:
We read each PDF with three open-source methods: pdf.js (through the pdf-parse library), poppler in reading-order mode, and poppler in content-stream mode, which returns text in the order the PDF stores it. We scored five things: whether every bullet came out as intact text, whether the keywords were found, whether each heading came out as a readable word with its own content on the next line, whether each start date sat next to its job title, and whether the name was on the first line.
None of these is an ATS. Commercial parsers, such as the ones inside Workday, Greenhouse or Lever, add their own processing on top of the text, and we can't see inside them. The test shows what text a parser is given to work with.

All five MatchCV templates scored full marks in all three extractors. Every bullet was intact, all 13 keywords were found, all five headings were readable and followed by their own content, every date sat beside its job, and the name was the first line. That's 15 clean extractions out of 15.
In the two-column sidebar layout, all 11 bullets and all 13 keywords were recovered by all three methods. The difference came from poppler's reading-order mode, which tries to read the page the way a person would, column by column. It returned the headings and their content interleaved: "SKILLS," then "EXPERIENCE," then the skills list, then the first job. Two of the five headings were no longer next to their own content. The other two methods read the same file correctly.
If a parser sorts text by heading, a skills list sitting under "EXPERIENCE" is a real problem. Whether it happens depends on the parser.
In the table layout, all bullets and keywords were intact. The dates were another matter. In pdf.js and in the content-stream mode, each date came out after that job's bullets, right before the next job's title, so no date was next to the job it belongs to. A parser that reads a date line as the start of the next entry could attach it to the wrong job. Poppler's reading-order mode put them in the right place.
In our first run, the date column was narrow, the dates wrapped onto two lines, and one came out as "202102." We widened the column so the table layout itself was the only difference.
When blocks are placed by coordinates and written to the file out of reading order, pdf.js and the content-stream mode started the text with "EXPERIENCE." The candidate's name appeared later. Poppler's reading-order mode, which sorts by position on the page, handled it fine. All the text was still there. What's at risk is any parser that assumes the first line is the name.
This was the one failure that showed up across all three methods. We tested 12px uppercase section headings at different letter-spacing values and counted how many of the five came out as a readable word.
| Letter-spacing | pdf.js | poppler, reading order | poppler, stream order |
|---|---|---|---|
| 0 to 0.10em | 5 of 5 | 5 of 5 | 5 of 5 |
| 0.15em | 0 of 5 | 3 of 5 | 5 of 5 |
| 0.20em and 0.30em | 0 of 5 | 3 of 5 | 0 of 5 |
| 0.45em | 0 of 5 | 0 of 5 | 0 of 5 |
At 0.10em and below, every extractor was fine. At 0.15em pdf.js had already given up on all five headings, and by 0.45em all three had. The failed headings came out the way they look on the page: E X P E R I E N C E. The bullets, keywords and dates were untouched. Only the headings broke, but headings are how a parser finds sections.
This is an easy one to hit by accident. Wide tracking on uppercase headings is a common "designer" touch, and it looks fine on screen.
When we saved the resume as a picture, which is what "print to image" or some design-tool exports produce, all three extractors returned essentially nothing. pdf.js gave back 12 characters and the other two gave none. This is the failure everyone warns about, and it's real. If you can't select the text in your PDF, a parser can't read it either.
The free ATS checker refuses a PDF it can't read text from, which catches the flattened-image case. Our guide to whether ATS can read PDF resumes covers the file-format side, and the ATS resume template checklist covers layout and headings.
Check if your resume passes ATS screening — free, no sign-up needed
Check my ATS score free →or sign in free to tailor your resume with AI