Blog · PDF tips

Create an ATS-friendly CV from your PDF resume

The designed CV looked sharp and scored like a blank page. It was a PDF of text boxes and a sidebar in a tinted shape. The parser that AI ATS Checker stands in for — and the cruder ones employers actually run — mostly saw the name and a row of icons. I had the same content in a single column, pasted as text, and the review suddenly had opinions about Python and the year I left a job. The opinions were not a hire. They were evidence the words were visible. Visibility is the first gate. Taste is a later one, and a human sits there.

What I paste, and what I refuse to paste

I paste the CV as text plus the job post. I do not paste the PDF and hope. If the CV only exists as a designed PDF, I run text extraction and I look at the extract. If the extract is the sidebar first and the jobs as a jumble, that jumble is a preview of a bad parser, and I fix the source in CV Maker or a plain editor before I ask for a critique. Critiquing a jumble produces advice about a document nobody will see, because the parser will not see it either.

The checker returns strengths, missing keywords, gaps, and concrete edits. It is one model’s reading of two blobs of text. Employer systems differ. A high “match” here is not an interview. I treat the output as a diff against the posting: which tools did they name, which of those have I actually used, which lines of mine hide the tool under a metaphor.

CV shapeExtract or pasteChecker behavior I have seen
Single column, real text, standard headingsCleanTalks about skills and dates
Two columns, icons, text in shapesFragmented or emptySays the CV is thin. The CV is not thin. It is unreadable
Scanned CV someone photographedEmpty until OCRUseless until you transcribe
Keyword-stuffed footer in white-on-whiteSometimes visible to a parser, obvious to a human who copies the textI will not help you do this. It is a good way to be rejected by a person

Keywords I will add, and keywords I will not

The posting said “GCP.” My line said “shipped the job queue on Google Cloud.” I changed it to name GCP, because that was true. The posting said “Kubernetes.” I have not run a cluster. I did not add Kubernetes. The checker listed it as missing. Missing is allowed. Invented is how you spend an interview explaining a word you pasted.

I add the tool to the bullet that already describes the work, not to a dump of nouns at the bottom. Dumps are easy for a crude scorer and insulting to the person who reads the same file an hour later. The person is the one who hires. The scorer only decides whether the person sees you.

Dates and titles: I keep them boring. “Software engineer, 2022–2024” parses. A graphic timeline does not. If a template’s charm depends on the timeline, I keep that template for humans I meet in person and I send the boring file to the portal. Two files is not dishonesty when they say the same facts. It is two readers.

A loop I run once per application

Paste CV text and the post. Read the missing list. Change only true lines. Paste again. Stop when the remaining gaps are things I will not claim. Three loops in, the checker starts asking me to repeat the same noun in every bullet. That is my cue to quit. Coverage of the real stack is enough. Saturation reads as spam even when a model smiles at it.

I do not run the checker on a CV with no job post “to see if it is ATS friendly” in the abstract. Friendly means readable structure plus overlap with a specific post. A generic score pushes people into buzzword stew. Structure I can check without a model: one column, text not outlines, headings a stranger would recognize, file that highlights when I drag the mouse. If it does not highlight, fix that before any AI step.

The paste includes your work history and their post. Do not include your phone number if you are jumpy about it — the model does not need it to talk about keywords. I strip contact details and the full address. The city can stay if the post is location-specific. National ID numbers never go in. This should not need saying, and yet the CV template had a field for one, and someone will fill every field.

After the words are right, I export a plain PDF from the maker and I re-extract it once. If the extract matches what I pasted into the checker, the portal will probably see those words. If the export reintroduced columns, I exported the wrong template. The check is mechanical. I trust it more than the model’s praise.

A posting that wanted a certificate I had under another name

The ad said “OSHA 10.” My CV said “10-hour construction safety card, 2023.” The checker called the keyword missing. It was not missing. The words did not match. I added “OSHA 10” in parentheses because that is what the card is. I did not add “OSHA 30.” The checker then suggested a list of warehouse nouns from the ad’s boilerplate — “fast-paced team player” was not among the nouns I was willing to print, and it also was not a skill. I ignored adjectives. I only negotiated nouns I could point at.

Dates in the sidebar of the designed PDF had come through as a vertical string, “2 0 2 2,” which the checker treated as noise. The plain export had “2022–2024” on one line. That single change did more than any keyword. A human reader can assemble a vertical year. A lot of portal parsers will not. I keep years on one line, with an en dash, and I do not put them in a graphic.

I run the checker again after the export extract, not only after the draft in the editor. The editor text and the PDF text have diverged on me when a template truncated a bullet. The truncated bullet was the one that contained GCP. The checker on the editor was happy. The portal would have been less happy. The second run is the one I believe.

Rejection still happens with a clean, truthful, single-column file. I do not go back and stuff the missing keywords after a rejection unless I was actually underselling a real tool. Stuffing is how the next human, when there is one, decides you are noisy. I would rather be a readable no than a noisy no. The readable file also gets reused. The noisy file has to be detoxed before the next application, which is a worse chore than writing the bullet properly the first time.

I keep the job post in the same folder as the CV version I sent, because “which keywords did I refuse” is only meaningful next to that post. A month later the post is offline and the checker cannot reconstruct it. The text file can. I do not need the model’s old answer. I need the ad and the PDF that actually went out.