# Bullet characters and Unicode symbols in PDF resumes

> We built resumes with •, ▪, ➢, Symbol and Wingdings bullets and read them with pdf.js, pdftotext and our checker. Here is the exact text that came back.

|  |  |
| --- | --- |
| Category | Original research |
| Published | October 19, 2026 |
| Reading time | 7 min |
| Rendered page | https://atsprep.com/blog/pdf-resume-bullet-characters-unicode |
| This document | https://atsprep.com/blog/pdf-resume-bullet-characters-unicode.md |

A bullet survives text extraction when the font tells the reader which Unicode character the glyph stands for. Typed •, ▪, ➢ came back unchanged in all three readers we tried. Bullets drawn from the Symbol font with an empty Unicode map came back as U+0000 from pdf.js and as a private-use code from pdftotext. Our own checker used to merge three of them into one; we fixed that on 20 October 2026 after these tests. Word lists built with Symbol or Wingdings read cleanly as DOCX and turned into private-use codes once saved as PDF.

## The short version

- Typed •, ▪ and ➢ in a font with a working ToUnicode map extracted unchanged in pdf.js 6.3.289, pdftotext 26.10.0 and the ATSPrep checker.
- A Symbol-font bullet whose ToUnicode map was empty came back as U+0000 in pdf.js and U+F0B7 in pdftotext: one file, two answers.
- Deleting a single font's ToUnicode map turned ➢ into ± in all three readers.
- Word's Symbol and Wingdings bullets read as plain list items from the DOCX, but the PDF export carried them as U+F0B7, U+F0A7 and U+F0D8.
- The fix is a round bullet (•, U+2022) typed in your body font, then a fresh export.

## What each reader returned

Six versions of the same experience section, each with three bullets. The cells show the character each reader put in front of the bullets, and how many bullets our checker filed.

*The mark in front of each bullet, by reader*

| Fixture | pdf.js | pdftotext | ATSPrep checker |
| --- | --- | --- | --- |
| Typed • ▪ ➢ (Chromium PDF) | • ▪ ➢ | • ▪ ➢ | • ▪ ➢; 3 of 3 bullets |
| CSS list discs (drawn, not text) | no bullet character | no bullet character | no bullet character; 3 of 3 bullets |
| Symbol font, empty ToUnicode map | U+0000 U+0000 U+0000 | U+F0B7 U+F0B7 U+F0B7 | U+0000 U+0000 U+0000; 3 of 3 bullets |
| Typed ➢, its ToUnicode map deleted | • ▪ ± | • ▪ ± | • ▪ ±; 2 of 3 bullets |
| Word list, Symbol and Wingdings (DOCX) | not a PDF | not a PDF | • • •; 3 of 3 bullets |
| The same Word list saved as PDF | U+F0B7 U+F0A7 U+F0D8 | U+F0B7 U+F0A7 U+F0D8 | U+F0B7 U+F0A7 U+F0D8; 3 of 3 bullets |

## Symbol-font bullets and private-use codes

Word's default bullet is the Symbol font's character 0xB7, stored as U+F0B7. That code is in Unicode's Private Use Area (U+E000 to U+F8FF), a block the Unicode Standard leaves without any assigned meaning. Wingdings bullets are stored the same way.

A PDF reader turns glyphs into text through the font's ToUnicode map. In our Chromium fixture the Symbol font carried a ToUnicode map with 0 entries. PDF 32000 §9.10.2 covers exactly this case (checked 19 October 2026): "If these methods fail to produce a Unicode value, there is no way to determine what the character code represents in which case a conforming reader may choose a character code of their choosing."

The two readers chose differently. pdf.js returned U+0000, a null character, for every bullet and for the envelope icon beside the email. pdftotext returned U+F0B7 for the bullets and dropped the icon. The ATSPrep checker reads through pdf.js, so it sees the same U+0000. It used to file all three bullets as one; we fixed that on 20 October 2026 after these tests, and it now treats a U+0000 at the start of a line as a bullet mark.

*Before: Symbol-font bullets (pdf.js 6.3.289, bullets-private-use.pdf)*

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

*Before: the same file (pdftotext 26.10.0, bullets-private-use.pdf)*

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

*Since the fix: the first bullet as the ATSPrep checker files it (bullets-private-use.pdf)*

```text
Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
```

*After: the same bullets typed as •, ▪ and ➢ in Arial and Zapf Dingbats (pdf.js 6.3.289, bullets-typed.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
```

## When the ToUnicode map is missing

To isolate the map itself, we took the working typed-bullet PDF and deleted the ToUnicode entry from one font, Zapf Dingbats, which drew the ➢. Nothing else in the file changed and the page still looks identical.

All three readers returned ± for the arrow. PDF 32000 §9.10.1 explains why the page still looks right: without a known encoding or a ToUnicode map, "the glyphs can still be shown, but the characters cannot be converted to Unicode values without additional information". The checker then saw a line starting with ± and counted 2 bullets instead of 3.

*Before: ToUnicode deleted from the arrow's font (pdf.js 6.3.289, bullets-no-tounicode.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
```

*After: the untouched original (pdf.js 6.3.289, bullets-typed.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
```

## Word lists: Symbol and Wingdings bullets

A Word bullet list doesn't put the bullet in the text at all. The glyph lives in numbering.xml as a list style, so a DOCX reader sees a list item and supplies its own marker. Our DOCX fixture used Word's three stock bullets: Symbol U+F0B7, Wingdings U+F0A7 and Wingdings U+F0D8.

The checker read the DOCX as three • bullets. Converted to PDF by LibreOffice 26.8.1.1, the same list kept its private-use codes in the text layer, in all three readers. Our checker happens to accept those codes as bullets; a parser that only knows the usual bullet characters would see three unknown symbols.

*DOCX: the list as our importer reads it (the ATSPrep checker, bullets-word-list.docx)*

```text
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
```

*PDF export of the same list (pdf.js 6.3.289, bullets-word-list-pdf.pdf)*

```text
Senior Data Analyst, Northwind Traders Inc. | 2021 - Present
[U+F0B7] Cut weekly reporting time from 6 hours to 40 minutes by automating SQL pipelines
[U+F0A7] Built a churn model that three regional sales teams now use to plan renewals
[U+F0D8] Trained 12 analysts on dbt and code review
```

## Bullets that are drawn, not typed

A list styled with CSS discs, which is how most web-based builders and many templates print, draws the dot as a shape. No reader returned a bullet character for it, because there isn't one in the text layer. The bullet text itself came through intact, one item per line, and our checker still filed three bullets.

*CSS list discs (pdf.js 6.3.289, bullets-css-disc.pdf)*

```text
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
```

## How to fix bullet characters in a resume

- Use the round bullet, •, typed in your body font (Arial, Calibri, Helvetica and similar).
- In Word, choose Define New Bullet, then Symbol, set the font to (normal text) and pick •. Avoid the Symbol and Wingdings choices.
- Drop icon fonts next to your email and phone. The envelope in our fixture came back as U+0000 in pdf.js and vanished in pdftotext.
- Export again from the source file. A reader can't recover a character the PDF never mapped.
- Check the export: copy all text from the PDF into a plain-text editor. Boxes, blanks or ± where bullets were mean the mapping is gone.

## 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 do you remove encoded bullet characters (e.g., \u2022) that may render as garbled symbols in some ATS parsers?

\u2022 is the ordinary round bullet (•) and isn't the problem: typed in a normal font it extracted unchanged in pdf.js, pdftotext and our checker. Garbled bullets come from symbol fonts. Word's Symbol and Wingdings bullets are private-use codes (U+F0B7, U+F0A7, U+F0D8), and a font with an empty Unicode map came back as U+0000 in pdf.js. Replace the list style with a • typed in your body font, export the PDF again, then paste its text into a plain-text editor to confirm.

### Which bullet characters are safe for ATS text extraction?

In our fixtures •, ▪ and ➢ all came back intact when they were typed in fonts with a working ToUnicode map. The round bullet • (U+2022) is the safest choice because it exists in every common body font, so it never needs a separate symbol font.

### Why does my resume show squares, question marks or ± instead of bullets?

The PDF draws the bullet from a font that doesn't say which Unicode character the glyph is. PDF 32000 §9.10.2 says a reader then has no way to determine the character and may pick one of its own. In our test, deleting one font's ToUnicode map turned ➢ into ± in all three readers.

### Are Word bullet points ATS friendly?

As a DOCX, yes in our test: the list style lives in numbering.xml and our importer read three plain bullets. Saved as PDF, Word's stock Symbol and Wingdings bullets stayed private-use codes in the text layer. Switch the list to a • from your body font before exporting a PDF.

### What is a PDF ATS text extractor?

It's the component that pulls the text layer out of your file before any parsing happens. pdf.js (Mozilla) and pdftotext (poppler) are two widely used open ones; the ATSPrep checker runs pdf.js. Employer systems use their own, so a file that reads cleanly in more than one extractor is the safer bet.

## 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. [Private Use Area, Range E000–F8FF](https://www.unicode.org/charts/PDF/UE000.pdf), Unicode Consortium
3. [Dingbats, Range 2700–27BF](https://www.unicode.org/charts/PDF/U2700.pdf), Unicode Consortium
4. [PDFPageProxy.getTextContent, PDF.js API](https://mozilla.github.io/pdf.js/api/draft/module-pdfjsLib-PDFPageProxy.html), Mozilla
5. [pdftotext(1) manual page, poppler-utils](https://manpages.debian.org/testing/poppler-utils/pdftotext.1.en.html), Debian
6. [Test fixture: bullets-private-use.pdf](/research/extraction-fixtures/bullets-private-use.pdf), ATSPrep
7. [Test fixture: bullets-no-tounicode.pdf](/research/extraction-fixtures/bullets-no-tounicode.pdf), ATSPrep
8. [Test fixture: bullets-word-list.docx](/research/extraction-fixtures/bullets-word-list.docx), ATSPrep
9. [Test fixture: bullets-word-list-pdf.pdf](/research/extraction-fixtures/bullets-word-list-pdf.pdf), ATSPrep

## Related

- [Resume bullet characters and ATS parsing](https://atsprep.com/blog/resume-bullet-characters-ats.md)
- [How PDF text extraction actually works](https://atsprep.com/blog/how-pdf-text-extraction-works.md)
- [Resume PDF reading order: columns, sidebars and text boxes](https://atsprep.com/blog/resume-pdf-reading-order-columns.md)
- [Resume PDF spacing, line breaks and paragraphs in text extraction](https://atsprep.com/blog/resume-pdf-spacing-line-breaks.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
