PDF Bookmark Editor
Read, edit and write the clickable outline in a PDF, with nesting, correct UTF-16 titles for any language, and a seed-from-page-text shortcut.
🔒 This tool runs entirely in your browser. Your files are never uploaded to a server.
| Title | Page | Level | Order | Remove |
|---|
Saving replaces the document's entire outline with the list above — bookmarks are a single tree, so there is no way to edit one without rewriting all of them. Each bookmark points at the top of its page, which is what almost every reader shows anyway; precise positions within a page are not preserved from an existing outline. The file is read, edited and saved entirely in your browser.
How to use it
- Drop in the PDF. Any existing outline is read in and becomes editable.
- Edit titles and page numbers, set levels, reorder with the arrows.
- Check the nesting preview — it shows the tree readers will display.
- Save. The outline is rewritten from your list.
A bookmark tree is genuinely a tree
In the file, each bookmark is a dictionary with explicit links in four directions, plus a destination:
/Title the label shown in the sidebar
/Parent the entry one level up
/Prev /Next siblings, in order
/First /Last the range of children
/Count open descendants — what makes a reader expand it
/Dest [pageRef /Fit]
Every one of those is a reference to another object, so there is no such thing as changing a single bookmark in isolation — inserting one entry rewires its neighbours, its parent's First and Last, and every ancestor's Count. That is why this tool presents the whole outline and rebuilds it on save. It is not a shortcut; it is what the format requires.
Because pdf-lib has no outline API, the tree is assembled directly against its object model. That is exactly the kind of hand-built structure that produces a file which opens fine and shows nothing in the sidebar, so it was verified by writing a nested outline and reading it back with a different library: the nesting, the page destinations and an accented title all came through intact.
The encoding trap
plain PDF string Latin-1 "Séction" → mojibake
hex string UTF-16 "Séction" → "Séction"
PDF text strings are Latin-1 unless written as a UTF-16 hex string with a byte-order mark. Anything outside Latin-1 — an accent in the wrong place, Greek, Cyrillic, Chinese, an em dash — is silently corrupted by the simpler option, and the damage only becomes visible in the reader's sidebar. Titles here always take the UTF-16 route, so it does not matter what language the document is in.
Levels that cannot exist
A flat list with an indent column can describe trees that are not trees. If the first entry is indented, it has no parent; if an entry jumps from level 0 to level 2, the intermediate parent does not exist. Rather than producing a malformed outline, the tool clamps such an entry to one level deeper than its predecessor and says so in the warning area — so the preview always shows the tree you will actually get, not the one your indents implied.
Starting from nothing
Scanned documents and many generated PDFs have no outline at all, and typing sixty titles from scratch is the reason people give up on bookmarks. The one-per-page option seeds a bookmark for every page using the first 60 characters of its text, which for a report or a scanned book is often close to the heading already. Editing rough titles is much faster than inventing them, and anything with no extractable text falls back to "Page N" rather than being skipped.
FAQ
What are PDF bookmarks?
The clickable table of contents in a reader's sidebar — formally the document outline. They are stored as a tree of dictionaries in the file, quite separately from any contents page printed inside the document, which is why a PDF can have a visible contents list and no bookmarks at all.
Why does saving replace all my bookmarks rather than editing one?
Because the outline is a single linked tree: every entry points at its parent, its previous and next siblings, and its children. Changing one entry means rewriting those links, so the honest implementation rebuilds the whole tree from your list. That is what the tool does, and why the list it shows you is the complete outline rather than a diff.
Why do my accented or non-Latin titles come out wrong in other tools?
Because PDF text strings default to a Latin-1 encoding that cannot represent them. Written that way, "Séction" becomes mojibake in the sidebar. Titles here are written as UTF-16 hex strings, which is the encoding the format provides for exactly this, so accents, Greek, Cyrillic and CJK all survive.
Can I nest bookmarks?
Yes, up to four levels using the level column. The nesting preview shows the tree you will get. A bookmark cannot be indented more than one level deeper than the one above it — there would be no parent to attach to — so the tool pulls such an entry back and tells you it did.
Do bookmarks point at an exact position on the page?
They can, but these point at the whole page using a Fit destination. That is what most readers display anyway, and it avoids inventing coordinates that would be wrong at a different zoom. It does mean precise scroll positions from an existing outline are not preserved — page numbers are.
What does the one-per-page button do?
Creates a bookmark for every page, titled with the first 60 characters of its text. It is a starting point for a scanned or generated document with no outline at all — quicker to edit sixty rough titles than to type sixty from nothing. Pages with no extractable text get "Page N".
How we compare
| Feature | Online Tool Store | Upload-based PDF sites | Acrobat Pro |
|---|---|---|---|
| File never leaves your device | ✓ | ✗ | ✓ |
| Reads and edits an existing outline | ✓ | Often add-only | ✓ |
| Correct UTF-16 titles for any language | ✓ | Frequently broken | ✓ |
| Seeds bookmarks from page text | ✓ | ✗ | Via structure tags |
| Free, no page limits | ✓ | ✗ | ✗ |
| Exact scroll positions and zoom per bookmark | Whole page only | Varies | ✓ |
| Bookmark actions beyond page jumps | ✗ | ✗ | ✓ |
Does the thing most bookmark tools get wrong — non-Latin titles — and does it without uploading a document that may be confidential. Destinations are whole-page rather than pixel-precise, and there are no scripted bookmark actions, both of which are Acrobat's territory.