To extract a clickable link from a PDF, open the PDF Link Extractor in your browser, select a local PDF up to 25 MiB, and click Extract Links. The tool reads PDF link annotations using PDF.js, lists each target with its page number and link type, and lets you copy the report or download a formula-safe CSV or UTF-8 TXT file. Because extraction runs against the annotation layer rather than the raw byte stream, you get fewer false positives from compressed objects, font data, metadata, or ordinary printed text. The PDF and the extracted targets stay on your device; nothing is uploaded to a link-analysis server. External targets are accepted only when they use HTTP, HTTPS, mailto, or tel, and the result is shown as inert text that you can review before copying. If you are auditing a document for migration, building a link inventory, or simply want to know where a PDF sends its readers, this approach gives you a clean, page-ordered list without leaving your browser.

What "Getting a Link From a PDF" Actually Means
A PDF carries URLs in two distinct ways. Some URLs are painted as ordinary visible text on the page, the same way a phone number or an address might appear in the running text. Other URLs are wrapped in a PDF link annotation, a clickable object that overlays the visible text and carries a separate target field. A reader who clicks the underlined phrase in a PDF viewer is following that annotation target, not the painted letters.
This distinction matters because the question "how to get a link from a PDF" has two different answers depending on which kind of URL the user wants. Pasting the page text into a search field will surface visible URLs, but it will miss every link that was never made clickable, and it will also pick up string fragments inside compressed object streams, font tables, or metadata that look like URLs but are not destinations at all. Reading the annotation layer is the reliable way to enumerate the clickable destinations the author actually wired up.
The PDF Link Extractor works at that annotation layer. It uses PDF.js to load each page's annotation list and selects only the entries with a usable external or internal destination field, then reports them in the order they appear.
How to Extract Links From a PDF Locally
The extraction runs entirely in your browser, so you never hand the document to a remote service. Here is the path from a saved PDF to a copyable report.
- Open the PDF Link Extractor in your browser. The page bundle loads first; PDF.js and its shared worker only load after you press the button, keeping the initial page light.
- Choose one local PDF up to 25 MiB and 40 pages. Encrypted, damaged, or over-limit documents are rejected with a visible error, so confirm the file is unprotected before you start.
- Click Extract Links. The tool walks each page in order, requests the page's annotations through the PDF.js PDFPageProxy API, and selects the entries that carry a supported external URL or internal destination.
- Review the report on screen. Each row shows the page, the annotation's position in that page's annotation list, the link type, and the inert target string. Unsafe schemes are skipped rather than displayed as clickable links.
- Copy the report to your clipboard, or download a UTF-8 TXT file or a CSV file. A replacement extraction cancels the earlier job and cleans up any previous download URLs.
What the Link Report Contains
The CSV export uses a small, fixed schema. The four columns below are written for every accepted annotation, and cells are escaped using standard CSV rules so quotes and line breaks survive a round trip into spreadsheet software.
| Column | Meaning |
|---|---|
| page | Page number where the annotation lives, in document order. |
| annotation number | The annotation's position in that page's annotation list. |
| type | Whether the target is external (a web URL) or internal (a destination inside the same PDF). |
| target | The inert target string. For external rows this is the URL; for internal rows it is a bounded, readable representation of the destination. |
The TXT version uses the same data with stable page labels and is encoded as UTF-8 so it opens correctly in any text editor. A summary block above the rows records examined annotation counts, accepted links, duplicates that were collapsed, and the targets that were skipped because their scheme was not on the allow list. Exact duplicates on the same page are removed, while a repeated link that appears on different pages stays visible, because seeing where a URL repeats is useful evidence during review.
Allowed and Skipped Schemes
External targets are filtered before they ever reach the report. The allow list is narrow on purpose, so the CSV or TXT you copy contains only destinations that are useful to most workflows.
| Scheme | Treatment | Example |
|---|---|---|
| http | Accepted | http://example.com/page |
| https | Accepted | https://example.com/page |
| mailto | Accepted | mailto:[email protected] |
| tel | Accepted | tel:+14155550199 |
| javascript | Skipped | javascript:alert(1) |
| data | Skipped | data:text/html,... |
| file | Skipped | file:///etc/passwd |
| blob | Skipped | blob:https://... |
| control characters or empty | Skipped | https://example.com%07 |
Scheme checks are case-insensitive and reject any target that contains control characters. Internal PDF destinations, which may be named destinations or explicit destination arrays pointing somewhere else in the same document, are labelled as internal targets and serialized in a bounded, readable form. The tool does not promise to resolve every internal destination to a final page number, because destination structures, page references, and viewer behavior can vary across documents.
Safety: Local Processing and Formula Injection
Two safety boundaries deserve attention. The first is privacy: the PDF never leaves your device. PDF.js and its worker load only after you press Extract Links, and the document is processed in-page rather than transmitted to a link-analysis server. When you start a new extraction or close the tool, loading tasks, page objects, and download URLs are cleaned up.
The second is spreadsheet safety. CSV is convenient, but a target that begins with =, +, -, @, or a tab character can be interpreted as a formula when the file is opened. The extractor handles this by prefixing any cell that begins with a formula character, so an extracted target cannot turn into a formula when you open the report later. Quotes and embedded line breaks are still escaped using standard CSV rules.
The targets themselves are inert text. The tool does not navigate to them, fetch them, validate them, reputation-check them, or guarantee their safety. Treat the extracted list as untrusted data, and verify important destinations independently before visiting or publishing them.
Common Use Cases for a PDF Link Report
A clean list of every clickable target in a document is useful in several recurring situations.
- Inventory: catalog every URL a publication points to so you can update or rotate them in one pass.
- Migration: when a site changes domains, confirm which PDFs still point to the old host and decide whether they need editing.
- Document QA: spot-check that the links inside a deliverable go where the brief says they should, and that no internal jump points to a deleted page.
- Review before sharing: see exactly where a PDF sends a reader before you forward it, without opening every page by hand.
- Catalog and metadata work: feed a structured target list into a catalog or content management system that needs to track outbound references.
The tool is not a crawler, broken-link checker, phishing detector, accessibility audit, or content scanner. A target's presence in the report only proves that PDF.js exposed a supported link annotation; it does not prove that the destination is live, safe, or appropriate. For deeper checks, run a separate broken-link or accessibility pass.