# Resume PDF spacing, line breaks and paragraphs in text extraction

> Letter-spaced headings, typed spaces, justified text and hard line breaks, read back by pdf.js, pdftotext and our checker. Only letter spacing did damage.

|  |  |
| --- | --- |
| Category | Original research |
| Published | October 19, 2026 |
| Reading time | 6 min |
| Rendered page | https://atsprep.com/blog/resume-pdf-spacing-line-breaks |
| This document | https://atsprep.com/blog/resume-pdf-spacing-line-breaks.md |

Spacing problems in a resume come down to one question: does the extractor see the words you meant? Letter-spaced headings came back from pdf.js and our checker as “E X P E R I E N C E”, and our checker used to find no skills under them; we fixed that on 20 October 2026 after these tests. pdftotext rejoined the same headings. Justified text extracted intact everywhere, and line breaks inside a bullet came back as two lines that our checker joined into one bullet.

## The short version

- Letter-spaced headings, whether set with CSS or typed with spaces, came back as “E X P E R I E N C E” from pdf.js and our checker.
- With “S K I L L S” as the heading, our checker used to find 0 skills; the same file with a normal heading gave 5. Since our fix on 20 October 2026 both give 5.
- pdftotext returned EXPERIENCE and SKILLS for both versions: the outcome depends on the extractor.
- Justified text, with its uneven word gaps, extracted word for word in all three readers.
- A wrapped bullet and a hard-broken bullet both extracted as two lines; our checker rejoined each into one bullet.

## What spacing did to the extracted text

Five spacing cases against a control with ordinary headings.

*Spacing cases by reader*

| Case | pdf.js | pdftotext | ATSPrep checker |
| --- | --- | --- | --- |
| Headings with CSS letter-spacing | E X P E R I E N C E | EXPERIENCE | 5 skills found |
| Spaces typed between letters | E X P E R I E N C E | EXPERIENCE | 5 skills found |
| Normal headings (control) | EXPERIENCE | EXPERIENCE | 5 skills found |
| Justified paragraph | words intact | words intact | words intact |
| Two bullets: one wrapped, one hard break | 4 lines | 4 lines | 2 bullets |
| Word: wrapped vs hard break (DOCX) | not a PDF | not a PDF | 3 lines, 2 bullets |

## Letter-spaced headings

Tracking out a heading (CSS letter-spacing, Word's Expanded character spacing, or spaces typed between letters) widens the gap between glyphs until it looks like a word break. pdf.js and our checker took the bait in both fixtures and returned single letters separated by spaces. Our checker then failed to recognise S K I L L S as a heading and returned no skills. We fixed that on 20 October 2026 after these tests: a line of single letters with spaces between them is now matched as the heading it spells, so both fixtures give 5 skills. The text it shows still has the spaces, because that is what the PDF holds.

PDF 32000 §14.8.2.5 (checked 19 October 2026) asks tagged PDFs to include "the spacing characters that would be present to separate words in a pure text representation", so that a reader "does not need to guess about word breaks based on information such as glyph positioning on the page". Untagged or not, a letter-spaced heading gives the reader either real spaces or gaps that look like them. pdftotext rejoined both versions, including the one with typed spaces, which shows how much the result depends on each extractor's own word-gap rules.

Greenhouse names the problem directly (checked 19 October 2026): "A resume with spaces between the letters. While it may appear cohesive to the naked eye, the parser won't recognize the separate letters as a single word and can't make sense of the data."

*Before: headings with letter-spacing (the ATSPrep checker, spacing-letter-spaced.pdf)*

```text
Maya Ortiz
maya.ortiz@example.com | (555) 010-4477 | Denver, CO
E X P E R I E N C E
Senior Data Analyst, Northwind Traders Inc. | 2021 - Present
• Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
• Built a churn model that three regional sales teams now use to plan renewals
• Trained 12 analysts on dbt and code review
S K I L L S
SQL, Python, Tableau, dbt, Excel
```

*Before: the same file (pdftotext 26.10.0, spacing-letter-spaced.pdf)*

```text
Maya Ortiz
maya.ortiz@example.com | (555) 010-4477 | Denver, CO
EXPERIENCE
Senior Data Analyst, Northwind Traders Inc. | 2021 - Present
• Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
• Built a churn model that three regional sales teams now use to plan renewals
• Trained 12 analysts on dbt and code review
SKILLS
SQL, Python, Tableau, dbt, Excel
```

*After: ordinary headings (the ATSPrep checker, order-single-column.pdf)*

```text
Maya Ortiz
maya.ortiz@example.com | (555) 010-4477 | Denver, CO
EXPERIENCE
Senior Data Analyst, Northwind Traders Inc. | 2021 - Present
• Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
• Built a churn model that three regional sales teams now use to plan renewals
• Trained 12 analysts on dbt and code review
SKILLS
SQL, Python, Tableau, dbt, Excel
EDUCATION
B.S. Statistics, Lakeview University, 2018
```

## Justified text

Justification stretches the spaces between words, never inside them, so every reader still found the word boundaries. Our narrow justified summary extracted word for word in pdf.js, pdftotext and our checker. Justify if you like how it looks; it isn't an extraction risk on its own.

*Justified summary (pdf.js 6.3.289, spacing-justified.pdf)*

```text
SUMMARY
Analyst with six years of experience turning
messy operational data into reports that sales
and finance teams use every week to plan
renewals, staffing and budgets.
```

## Line breaks and paragraphs

A PDF has no paragraphs, only positioned lines. A bullet that wraps at the margin and a bullet with a hard line break typed into it look the same on the page, and all three readers returned both as two lines. pdf.js documents that getTextContent hands back text items with whitespace normalised; pdftotext marks a block break with a blank line. Deciding which lines belong together is left to the parser.

Our checker rejoined each pair into one bullet, filing 2 bullets. In a DOCX the difference is real: a wrapped bullet is one paragraph and one line, while a hard break (Shift+Enter in Word) splits it in two inside the same paragraph.

*A wrapped bullet, then a hard-broken one (pdf.js 6.3.289, spacing-line-breaks.pdf)*

```text
• Cut weekly reporting time from 6 hours to 40 minutes by
automating SQL pipelines for finance, sales and operations
• Cut weekly reporting time from 6 hours to 40 minutes
by automating SQL pipelines for finance, sales and operations
```

*What the ATSPrep checker filed as the first bullet (spacing-line-breaks.pdf)*

```text
Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines for finance, sales and operations
```

*DOCX: wrapped, then hard break (the ATSPrep checker, spacing-word-breaks.docx)*

```text
• Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines for finance, sales and operations
• Cut weekly reporting time from 6 hours to 40 minutes
by automating SQL pipelines for finance, sales and operations
```

## How to fix spacing in a resume

- Set headings with normal letter spacing. Use weight, size or a rule for emphasis instead.
- Never type spaces between letters to stretch a word.
- Let bullets wrap on their own. Don't press Shift+Enter to control where a line breaks.
- Keep one idea per bullet so a wrapped line can't be mistaken for a new one.
- Justified or left-aligned both extract; choose on looks.

## 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

### How does resume PDF text extraction handle spacing and paragraphs?

The extractor sees positioned lines, not paragraphs, and decides word breaks from spaces and gaps. In our fixtures justified text came through intact, letter-spaced headings came back as single letters from pdf.js, and a wrapped bullet came back as two lines that the parser had to rejoin.

### Does letter spacing break ATS parsing?

It can. With letter-spaced headings pdf.js and the ATSPrep checker returned “S K I L L S”, and the checker found no skills under it until we fixed that on 20 October 2026. Other parsers may not handle it. pdftotext happened to rejoin the word. Greenhouse lists spaces between letters as a cause of failed parses.

### Is justified text bad for ATS?

Not in our test. Justification widens the gaps between words, not inside them, and our justified summary extracted word for word in pdf.js, pdftotext and the ATSPrep checker.

### Do line breaks inside a bullet point break ATS parsing?

In a PDF a hard break and a natural wrap both extract as two lines, so it depends on whether the parser joins them. Ours did. Let bullets wrap naturally rather than forcing breaks with Shift+Enter.

## Sources and further reading

1. [PDF 32000-1:2008, §9.10 Extraction of Text Content and §14.8.2 Logical Structure](https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/PDF32000_2008.pdf), Adobe / ISO
2. [PDFPageProxy.getTextContent, PDF.js API](https://mozilla.github.io/pdf.js/api/draft/module-pdfjsLib-PDFPageProxy.html), Mozilla
3. [pdftotext(1) manual page, poppler-utils](https://manpages.debian.org/testing/poppler-utils/pdftotext.1.en.html), Debian
4. [Unsuccessful resume parse](https://support.greenhouse.io/hc/en-us/articles/200989175-Unsuccessful-resume-parse), Greenhouse Support
5. [Test fixture: spacing-letter-spaced.pdf](/research/extraction-fixtures/spacing-letter-spaced.pdf), ATSPrep
6. [Test fixture: spacing-typed-spaces.pdf](/research/extraction-fixtures/spacing-typed-spaces.pdf), ATSPrep
7. [Test fixture: spacing-justified.pdf](/research/extraction-fixtures/spacing-justified.pdf), ATSPrep
8. [Test fixture: spacing-line-breaks.pdf](/research/extraction-fixtures/spacing-line-breaks.pdf), ATSPrep
9. [Test fixture: spacing-word-breaks.docx](/research/extraction-fixtures/spacing-word-breaks.docx), ATSPrep

## Related

- [Letter-spacing shreds resume headings](https://atsprep.com/blog/letter-spacing-resume-headings.md)
- [Resume line spacing: what to use, and does ATS care?](https://atsprep.com/blog/resume-line-spacing-ats.md)
- [Bullet characters and Unicode symbols in PDF resumes](https://atsprep.com/blog/pdf-resume-bullet-characters-unicode.md)

## About ATSPrep

ATSPrep (https://atsprep.com) is a free resume and application workspace. Match experience to a posting, strengthen claims with evidence, and track the next action. Its PDF check shows text recovered by ATSPrep's extractor, not an employer's proprietary ATS or hiring decision.

- **Price:** free. Checking, importing, editing and downloading cost nothing, and downloads carry no watermark. Everything listed here is free.
- **Account:** none needed to check, import or edit a resume. A free sign-in is needed to download after the first file, to sync, and for more checks or more than 5 AI edits.
- **Your file:** parsed and exported inside the browser. The resume file itself is never uploaded.
- **Optional:** text leaves the browser only when you press a button: semantic match and AI edits (the lines involved), a job link (the link) and Pip voice calls (your speech). Never your contact details, and none of it is stored.
- **Connection:** some tools load on first use and need a connection to download. Local storage is not a cloud backup.
- **Accepts:** PDF, DOCX, TXT, Markdown, or pasted plain text.

Start here: https://atsprep.com/studio
