Extracting links from a PDF means pulling every clickable link annotation out of a document and listing them by page so you can review, copy, or download the targets without retyping them. For most beginners, the stumbling block is not the clicking itself — it is getting a clean list when a PDF holds dozens of scattered links, some pointing to external websites, some to other pages inside the same file, and some that look like URLs but were never actually made clickable. A dedicated extractor reads the underlying link annotations rather than scanning every word for URL-shaped text, which is why the result is far more accurate than copying and pasting from a PDF reader. The PDF Link Extractor does exactly this in your browser: you pick a local PDF up to 25 MiB and 40 pages, click a button, and get a page-ordered report of every supported link the document exposes. The file and its contents never leave your device at any point.
What follows is a beginner-friendly walkthrough of how the tool works, what kind of links it can and cannot read, and how to interpret the report it produces.

What Counts as a Link Inside a PDF
Not every visible URL in a PDF is a clickable link. PDF authors have two ways to put a web address on the page: they can type it as ordinary text that the reader sees and can select, or they can wrap it in a special object called a link annotation. Link annotations are what make a URL clickable in any PDF viewer, and they are also what allows the URL to be retrieved programmatically.
The PDF Link Extractor reads PDF.js annotation data rather than searching the raw bytes of a document for strings that look like URLs. That distinction matters because PDF streams, font tables, and metadata often contain URL-shaped fragments that were never meant to be clickable. By sticking to annotations, the tool avoids surfacing those false positives. According to Mozilla's PDF.js API documentation, the getAnnotations method on a page proxy is the canonical way to enumerate annotations by type, and link annotations are one of the supported categories.
Link annotations come in two flavours. External links point to a URL outside the document using schemes such as HTTP or HTTPS. Internal destinations point to another location inside the same PDF, often another page or a named bookmark target. Internal destinations do not always have a web URL — they may be expressed as a named string or as a structured array describing a page, view, and position.
What You Need Before You Start
The tool has a small list of hard requirements, all of which are visible before you click anything:
- A single PDF file. The extractor accepts one document at a time. If you have several PDFs, run them through the tool separately, or merge them into one file first if that suits your task.
- File size up to 25 MiB. Anything larger is rejected with a visible error.
- Up to 40 pages. Documents beyond this limit are not processed.
- No password protection. Encrypted PDFs return an error before extraction starts.
- A valid, undamaged file. Malformed or unsupported documents surface a clear error rather than producing a partial report.
Because the tool runs locally in the browser, your PDF and the resulting report stay on your computer throughout. There is no upload step and no account to create.
How to Extract Links From a PDF
The actual workflow is short enough that a first-time user can complete it in a couple of minutes:
- Open the PDF Link Extractor page in your browser and click the file picker to choose a local PDF. The tool caps the file at 25 MiB and 40 pages, and rejects encrypted, damaged, or oversized documents up front.
- Click Extract Links. The tool loads PDF.js and its worker only after this user action, requests the annotation list for every page, and filters that list down to supported link annotations.
- Review the report that appears on the page. Each row shows the page number, annotation order, link type, and the inert target text. External targets are kept only when they use HTTP, HTTPS, mailto, or tel; everything else is filtered out and counted in the summary.
- Copy the report to your clipboard, or download a UTF-8 plain-text version or a formula-safe CSV version. Both files are produced locally and never leave your device.
- If you load a different PDF while one is already open, the new run cancels the earlier job and clears the previous results, download URLs, and page state automatically.
Reading the Report: Columns and Labels
The on-screen report and the downloadable files share the same columns. Here is what each one means in plain language.
| Column | What it shows | Why it matters |
|---|---|---|
| Page | The page number where the link annotation lives | Helps you jump back to the original PDF and verify the link visually |
| Annotation number | The order of the annotation on that page | Useful when a page contains many overlapping or stacked links |
| Type | External or internal, plus the scheme or destination kind | Tells you at a glance whether the target is a URL or a position inside the same document |
| Target | The inert text of the URL or the readable representation of an internal destination | Safe to copy; never navigates, fetches, or executes the link on its own |
The summary block above the table tells you how many annotations were examined, how many were accepted, how many duplicates were removed, and how many targets were skipped because they were unsafe or unsupported. Exact duplicates on the same page are removed automatically; the same link appearing on different pages is preserved, because knowing which pages reference it is often useful evidence.
Which URL Schemes Make the Cut
The extractor accepts a narrow set of useful schemes and rejects everything else. The check is case-insensitive and also rejects any URL that contains control characters, which is a common vector for hiding unsafe payloads.
| Scheme | Accepted | Notes |
|---|---|---|
| http | Yes | Plain web links are included in the report |
| https | Yes | Secure web links are included in the report |
| mailto | Yes | Email addresses wrapped as clickable links appear in the report |
| tel | Yes | Phone-number links are included in the report |
| javascript | No | Skipped to prevent executable content from being surfaced |
| data | No | Skipped because inline payloads are not clickable targets |
| file | No | Skipped because local file references are out of scope |
| blob | No | Skipped because these refer to in-memory objects that no longer exist outside the source app |
| Any URL with control characters | No | Skipped as a defensive measure |
The excluded schemes are dropped from the report rather than being made clickable, so opening the CSV or TXT file in another program will not trigger navigation or code execution.
When a Link Does Not Show Up in the Results
A missing row in the report usually comes down to one of a few causes, and recognising them saves a lot of time:
- The URL is printed text, not a link annotation. If the author typed a web address but never wrapped it in a clickable region, the tool will not see it. Visible text and clickability are independent in PDF.
- The PDF is encrypted or password-protected. The tool cannot decrypt on its own and will reject the file outright.
- The link uses a non-supported scheme. Custom schemes, deep links to mobile apps, and JavaScript actions are intentionally filtered.
- The file exceeds the limits. PDFs over 25 MiB or 40 pages return a visible error before extraction starts.
- Internal destinations without a stable URL form. Named destinations and explicit destination arrays are reported, but the tool does not promise to resolve every one of them to a final page number, because destination structures and viewer behaviour can vary across documents.
If you suspect a missing link, opening the PDF in any standard reader and hovering over the spot in question will quickly tell you whether it is clickable at all.
Keeping the Process Safe and Predictable
The extractor is designed for inventory, migration checks, document QA, and reviewing where a PDF sends its readers. It is not a crawler, broken-link checker, phishing detector, accessibility audit, or content scanner. The presence of a target in the report means only that the PDF exposed a supported link annotation — it does not guarantee that the destination is reachable, current, or trustworthy. Important destinations should always be verified independently before they are visited, published, or shared.
The CSV file the tool produces is hardened against a common spreadsheet hazard. According to OWASP's CSV Injection guidance, a cell that begins with characters such as =, +, -, or @ can be reinterpreted as a formula by spreadsheet software, which can then run code or exfiltrate data when the file is opened. The PDF Link Extractor neutralises any such leading characters before serialising a cell, and it escapes embedded quotes and line breaks using standard CSV rules. The TXT file is plain UTF-8 with stable page labels and contains no executable surface area at all.
For a deeper look at how the underlying parser represents annotation data, the Mozilla PDF.js project on GitHub is the source of truth for the annotation schema the tool relies on.
The tool is designed to make a beginner's first attempt produce a useful, complete list without requiring any knowledge of the PDF specification. Choose a local file, click the button, and the page-ordered report is ready to copy or download — a small, predictable workflow that scales from a single-page handout to a 40-page report.
Related reading: PDF to PNG for Beginners: A First-Time Walkthrough.