BASALT · JOURNAL
Why redacting a PDF in Preview is not redaction
Preview is the default PDF application on every Mac, it opens instantly, and it has a rectangle tool that draws a filled black box. That combination has produced more accidental disclosures than any other piece of software on the platform. When you redact a PDF in Preview on Mac, the words under the box are still in the file.
This is not a bug and it is not a version-specific problem. Preview is a viewer with annotation features, and annotation is an additive operation by design.
What the black rectangle actually is
Preview's shape tool creates either a square annotation object or, after certain export paths, a set of path-painting operators appended to the page's content stream. Both are additive.
An annotation is a dictionary attached to the page with a rectangle, a color, and an appearance stream describing how to draw it. It sits in the /Annots array. The page content underneath is untouched, which is the entire point of annotations: they are supposed to be removable comments layered over a document.
The painted-path version is barely different in effect. The page content stream already contains the text-showing operators for the sensitive words. Preview appends fill operators after them. A renderer executes the stream in order, so the rectangle paints last and covers the text visually. The Tj and TJ operator arguments carrying the character codes are still there, in the same positions, in the same stream.
Any tool that reads the content stream instead of looking at the rendered page will find them. That includes the text selection in Preview itself, pdftotext, Spotlight's indexer, and every ediscovery platform your document is likely to pass through.
The test that takes ten seconds
Open the file you redacted. Drag-select across the black box. Press Command-C. Paste into TextEdit in plain text mode.
If the text you thought you removed appears in the paste, it was never removed. On many Preview-produced files it does appear, immediately, with no tools and no expertise required. This is the same mechanism behind the well-known pattern of court filings and government releases where reporters recovered redacted names by copying and pasting from the published PDF.
The uncomfortable part is the inverse case. If nothing pastes, that does not prove the file is clean. Copy-paste failure can come from a broken font encoding, a missing /ToUnicode map, or a viewer quirk, while the character codes and the glyph runs remain fully present and recoverable by a parser that maps fonts directly. Passing the paste test is necessary, not sufficient. How to check whether a PDF was really redacted covers the checks that actually settle it.
Flatten and print to PDF
The common advice when someone learns that annotations are not redaction is to flatten the file: print to PDF, or export in a way that bakes annotations into the page.
This does work on the narrow question. Printing rasterizes or regenerates the page, and the text under the box does not survive that. But it is a blunt instrument with real costs.
You lose the text layer across the entire document. The file is no longer searchable, no longer selectable, and no longer accessible to a screen reader. Bookmarks, tagging, and form structure are gone. For anything filed with a court that requires text-searchable PDFs, or anything that has to be produced in a searchable format under a discovery protocol, that is a failing document.
You also usually get a larger file, because a page of crisp text becomes a page of pixels.
And crucially, printing does nothing about the rest of the file. The document information dictionary and the XMP packet ride along or get regenerated with the same author name. Embedded attachments may be dropped or may not. If the original was assembled from several files, an unflattened annotation elsewhere in the document is not caught by the one page you were worried about. Rasterizing is a side effect that happens to destroy some text. It is not a redaction procedure.
What Preview does not touch at all
Even if the visible text problem were solved, a redaction is a claim about the whole file. Preview has no interface for most of what that claim covers.
There is no way to inspect or strip the XMP metadata packet, which routinely carries the author, the originating application, a document identifier that links the file to its ancestors, and a history of edits. There is no way to list or remove embedded file attachments, which can be an entire spreadsheet hidden inside the PDF. There is no view of optional content groups, the layers mechanism, where a turned-off layer is invisible on screen and fully present in the file.
There is no handling of /ActualText, the accessibility field that stores a plain text equivalent for a span of content. A word can be excised from the visible glyph run and remain readable in /ActualText.
There is no control over form field values, which persist in the field dictionary regardless of what is painted over the widget. And there is no view of the incremental update chain, which matters more than any of the rest.
Incremental updates keep your earlier drafts
PDF was designed so a file can be updated by appending. A new set of objects and a new cross-reference table go at the end, and the original bytes stay exactly where they were. Viewers read the newest cross-reference table and show you the current state.
Preview saves edits this way in many situations. That means a file you edited three times contains three versions of the affected objects. Walking back through the update chain, which is a documented and entirely mechanical operation, reconstructs earlier states of the page.
If an earlier state had the text uncovered, which is by definition the state before you drew the box, then the unredacted page is physically present in the file you emailed. No amount of black rectangle is relevant at that point.
A real redaction has to be written as a single generation, with one cross-reference structure and no retained prior revisions. That is a file-writing decision, not something you can apply after the fact from a viewer.
What to require from a tool instead
The bar is straightforward to state. The tool must parse the content stream and remove the covered glyphs from the text-showing operators, then re-emit the surviving glyphs at their original positions so the rest of the line still renders correctly. It must destroy and re-encode image pixels under a mark rather than painting over them. It must strip metadata, XMP, attachments, hidden layers, and stale thumbnails. It must write one generation.
And it must let you verify the result with something that is not itself. A tool's own confirmation dialog is a statement of intent, not evidence. See a black box over text is not a redaction for why the visual result is the least informative signal available to you.
Frequently asked questions
Can you redact a PDF in Preview on a Mac?
Not safely. Preview can draw a black rectangle over text, but it does not parse or rewrite the page content stream, so the original characters remain in the file and can be recovered by copying, by extraction tools, or by deleting the annotation. Preview is a viewer with annotation features, and annotation is additive by design.
Does Preview permanently delete redacted text?
No. The text-showing operators carrying the redacted words are untouched by anything Preview's markup tools do. Painting order changes what you see on screen while the stored data stays identical. Selecting the covered area and pasting into a plain text editor often reveals the words immediately.
Will exporting or flattening in Preview make the redaction stick?
Flattening or printing to PDF does destroy the visible text under the box, but it destroys the text layer of the whole document at the same time, leaving a file that is no longer searchable, selectable, or accessible. It also does nothing about metadata, XMP packets, embedded attachments, form field values, or retained earlier revisions.
Why do black boxes in Preview fail so often?
Because a real redaction and a drawn rectangle look identical on screen at every zoom level, so nothing in the interface signals a problem. The person applying the box sees the expected result and has no reason to check further. That is the same mechanism behind public filings where reporters recovered redacted names by copying and pasting.
Does saving in Preview leave earlier versions in the file?
It can. PDF supports incremental updates, where a new revision is appended and the original bytes remain in place, and viewers save this way in many situations. If a revision from before you drew the box is retained, the unredacted page is still physically present in the file. Counting %%EOF markers reveals how many revisions exist.
Is Preview's Markup or Mail's Markup any different?
No. Both create annotation objects with a rectangle, a color, and an appearance stream, stored in the page's /Annots array. Annotations were designed to be removable comments, so any tool that can delete a comment can restore the page. There is no security boundary in an annotation and none was ever claimed.
What should I use instead of Preview for redaction?
Use a tool that excises the covered glyphs from the text-showing operators, re-emits the surviving glyphs at their original positions, overwrites and re-encodes image pixels under a mark, strips metadata and attachments, and writes one generation. Then verify the output with an independent parser rather than trusting a confirmation dialog.
Can I check a Preview redaction myself before sending it?
Yes. Select the redacted region, copy, and paste into TextEdit in plain text mode, then run pdftotext on the file and search the output for each removed term. Follow with exiftool for metadata and qpdf --qdf --object-streams=disable plus a grep to catch strings hidden in compressed object streams.
Doing it in Basalt
Basalt was built because the gap between "looks redacted" and "is redacted" has no visible edge. It excises text from the content stream glyph by glyph and re-emits the surviving text in place, destroys and re-encodes pixels under a mark, strips metadata, XMP, attachments, hidden layers, and stale thumbnails, and writes the file as one generation so earlier versions cannot be recovered.
Before any file is written, an independent parser re-opens the output and proves the redaction. If the proof fails, nothing is saved. Every redaction produces an Ed25519-signed certificate you can verify with shasum and openssl, and the output is byte-reproducible, so a third party can re-run the same marks on the same source and confirm they get an identical file.
The engine runs in a separate process with no network entitlement, enforced by macOS at the code signature level. It is $29 once, lifetime, up to three Macs, free for 24 hours.
Redaction that proves itself
Basalt destroys the content you mark, then re-opens the file it wrote and proves the content is gone before it saves anything. Your documents never leave your Mac.