# 7 resume templates, 4 PDF parsers: what breaks ATS reading

> In our test, the commonest failure was letter-spaced section headings: one parser read "EXPERIENCE" as "E X P E R I E N C E" in six of seven templates, so the section could not be found. Ligatures, dates placed away from their job, transparency effects and two-column layouts also broke the extracted text.

By Arivu, founder of Shortlist. Published 2026-10-15, updated 2026-10-15. Source: https://shortlist.cruscible.com/guides/resume-parsing-test

An applicant-tracking system does not look at your resume the way you do. Before anything is ranked, a parser pulls the **text** out of the file, and every later step (finding your experience, matching keywords, counting years) works from that text. If extraction goes wrong, a resume that looks perfect on screen reads as noise.

We wanted to know which design choices actually break extraction, so we tested it.

## How we tested

We rendered the **same one-page resume** in seven templates (single-column, serif, compact, centred, a coloured header band, and a two-column sidebar), all printed to PDF by Chromium, the engine behind Chrome's "Save as PDF". We then pulled the text out of each PDF with four widely used extractors: **pdfminer.six**, **pypdf**, **Apple PDFKit** and **poppler's pdftotext**. For each one we checked whether the section headings, a list of keywords and every job's dates came through intact.

Commercial tracking systems use their own parsers, which we cannot test directly. These open-source extractors are a reasonable proxy for the first step all of them share: turning a PDF into text.

## What broke

| Design choice | What the parser read | How often |
|---|---|---|
| Letter-spacing on headings | `S U M M A R Y`, `E X P E R I E N C E` | pdfminer: 6 of 7 templates. Poppler broke `EDUCATION` in 2 |
| Ligatures in the font | `Staﬀ`, `workﬂow`, `certiﬁed` (single ligature characters) | Both templates using Helvetica Neue, in pdfminer and pypdf |
| Dates right-aligned on the job line | Dates listed after the job's bullets, or next to the wrong job | pdfminer: 6 of 7; PDFKit: 4 of 7; pypdf and poppler kept them in place |
| Text with transparency (opacity) | The headline moved to the very end of the document | pdfminer, in the coloured-header template |
| Two columns | Sidebar first (contact, skills, education before experience), or both columns merged line by line | Every extractor: three put the sidebar first, one merged the columns |

### Letter-spaced headings

This was the most damaging and the least obvious. Spacing out uppercase headings (`letter-spacing` in CSS, "character spacing" in Word) is a common stylistic touch. Most extractors decide where words end by looking at the gaps between letters, so widely spaced letters come out as separate one-letter "words". A system looking for a heading called "Experience" never finds one, and everything under it loses its label.

The one template with only slight spacing (1 px at 10.5 pt) survived. Every template with more spacing failed in at least one extractor. We later saw the same failure on a real resume built with the same habit: its `EDUCATION` heading came out as `E D U C AT I O N`.

### Ligatures

Many fonts join letter pairs like "ff", "fi" and "fl" into a single glyph. Some PDFs record that glyph as one special character instead of two letters, so "Staff" is stored as "Sta" followed by a single ligature character (Unicode U+FB00) where the two f's should be. On screen it looks identical; to a search for "Staff Engineer" it is a different word, and the resume does not match. Turning ligatures off in the font settings fixed it.

### Dates away from their job

Right-aligning dates on the same line as the employer looks tidy, but some extractors read the page in blocks, and a right-aligned date is its own block. In our test they often came out after the bullet points, and sometimes next to the following job. That is how a parser ends up attaching the wrong dates to a role and miscounting your years of experience.

### Transparency and two columns

Text drawn with partial transparency is stored separately inside the PDF, and one extractor read it last, so the headline under the name ended up at the bottom of the text. Two-column layouts were mixed up by every extractor; we cover that in [Do two-column resumes fail ATS?](/guides/two-column-resumes-ats).

## What to do

1. **Use one column.** Put skills and education in sections, not in a sidebar.
2. **Keep headings plain:** "Experience", "Education", "Skills", with no letter-spacing.
3. **Turn ligatures off**, or use a common font such as Arial or Calibri.
4. **Keep each job's dates on the job's own line**, in the normal text flow.
5. **Avoid transparency, text boxes and images for text.**
6. **Check the extracted text yourself.** Our [free ATS checker](/tools/ats-checker) shows the text a parser gets from your file. You can also open your PDF, select all the text, paste it into a plain text editor and read it top to bottom.

## Limits of this test

This was one resume in seven templates and four extractors, not a survey of every tracking system. Commercial parsers are more sophisticated and may recover from some of these problems. But they all start by extracting text, and a resume that extracts cleanly removes the risk instead of relying on the parser to fix it.

## FAQ

### Do fancy resume templates fail ATS?

Not because they are attractive. They fail when the styling changes the text a parser extracts: spaced-out headings, ligature characters, columns or text stored as images. A well-designed single-column resume with plain headings extracts cleanly.

### Does letter-spacing on headings really matter?

In our test it was the commonest failure. Wide spacing made one extractor read every heading as separate letters in six of seven templates, so the sections could not be found.

### Should I send a PDF or a Word file?

Both are widely accepted. A text-based PDF (not a scan) keeps your layout and extracts well if you follow the steps above. If an employer asks for a specific format, use that one.

### How can I check my own resume?

Upload it to the [free ATS checker](/tools/ats-checker). It shows which checks pass and the exact text a parser extracts, and nothing is stored.
