docubend

Annotate a PDF

Draw, highlight and add notes on top of the page. The page underneath is left exactly as it was.

How it works

  1. Drop your PDF in.
  2. Draw, highlight or add text on top.
  3. Download the annotated PDF.

What it does

Marking up somebody else's document should not mean changing it. This tool draws on top of the page — highlights, pen strokes, notes, arrows and shapes — and leaves everything underneath exactly as the author set it. When you download, the marks are part of the PDF and open the same way anywhere.

Highlighter, pen and notes

The highlighter follows a line of text the way a marker follows a line on paper. The pen is freehand, with adjustable weight and colour, for circling a figure or crossing something out. Notes are boxes you type into and place where they are needed, and they stay legible at any zoom because they are text rather than a picture of text.

Nothing underneath is touched

Annotations sit in their own layer. The original words keep their font, their position and their selectability, so anybody you send the file to can still search it and copy from it. If you change your mind, undo takes a mark off cleanly rather than leaving a patch where it was.

Reviewing without an account

The document is opened and written by this tab. No copy is sent anywhere, which means a contract you are marking up for a client is not sitting in anyone's storage waiting to be deleted. That is worth knowing when the thing you are annotating is exactly the sort of document you would not email to a stranger.

Doing this from your own code

Marks are nodes in the document model. Fetch it, add them, put it back — there is no annotate verb.

curl
# fetch the model, change it, put the whole thing back
curl -s https://docubend.com/api/v1/documents/$ID.json \
  -H "Authorization: Bearer $TOKEN" -o model.json

# …edit model.json…

curl -s -X PUT https://docubend.com/api/v1/pdfs/$ID \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d "{\"model\": $(cat model.json)}"
JavaScript
const got = await fetch(`${BASE}/api/v1/documents/${id}.json`,
  { headers: { Authorization: `Bearer ${TOKEN}` } });
const model = await got.json();

// …change model.pages…

await fetch(`${BASE}/api/v1/pdfs/${id}`, {
  method: "PUT",
  headers: { Authorization: `Bearer ${TOKEN}`,
             "Content-Type": "application/json" },
  body: JSON.stringify({ model }),
});
Python
model = requests.get(f"{BASE}/api/v1/documents/{id}.json",
    headers={"Authorization": f"Bearer {TOKEN}"}, timeout=60).json()

# …change model["pages"]…

requests.put(f"{BASE}/api/v1/pdfs/{id}",
    headers={"Authorization": f"Bearer {TOKEN}"},
    json={"model": model}, timeout=60)

The model is the same JSON the editor works on. Documents reference.

Questions

Can the person I send it to edit my marks?

They can, in any editor that handles annotations — including this one. Marks are part of the PDF, not a locked overlay.

Will the highlight follow the text if the document changes?

No. A highlight is placed where you drew it. If the underlying text is edited afterwards, the mark stays where it was put.

Does annotating flatten the original text?

No. The text under your marks stays real text and stays searchable.

How big a file can I annotate?

25 MB, three files a session, enforced before the file is read.

Can I annotate a scanned document?

Yes. Drawing and highlighting work on a picture of a page just as well as on text — you are marking the surface either way.

Next

Tool What it does Runs in Same thing, programmatically
Edit a PDF Change the words already in the PDF, in their original font. your browser the document model
Sign a PDF Draw a signature and place it where it goes. your browser the document model
Delete pages from a PDF Remove the pages you do not want to send. your browser the document model
Merge PDF files Join several PDFs into one, in the order you choose. your browser no endpoint

All 16 tools · API documentation · What an account adds