To get a link from a PDF file, you need to read the document's clickable link annotations, not its visible text. A PDF stores hyperlinks as structured annotation objects attached to specific pages, so a URL that is printed on the page as plain text may not appear in an extraction unless it was also made clickable. Local browser tools that use PDF.js can open the file on your device, walk through each page's annotation list, and surface only the targets that match supported schemes such as http, https, mailto, and tel. The result is a page-ordered, inert text report — never a live, followable hyperlink — which you can then copy as plain text or download as a UTF-8 TXT or formula-neutralized CSV file. The PDF itself never leaves your browser. This approach is well suited to inventorying outgoing references in a report, sanity-checking links before sharing a document, reviewing where a PDF sends readers, or auditing a file you have inherited from someone else.

What "Getting a Link From a PDF" Actually Means
A PDF has two ways of holding a URL. The first is as visible, selectable text — the same way a sentence or a footnote is stored. The second is as a link annotation, a structured object attached to a specific page that ties a region of the page (or the whole page) to a destination. When you click a link in a normal PDF viewer, you are following an annotation, not searching for a URL string.
This distinction matters because most readers who ask how to get link from a PDF file want the clickable destinations, not every URL-shaped string the document happens to contain. A report may have dozens of URLs visible on its pages but only a handful of true link annotations if the creator never made the references clickable. Conversely, a PDF can carry invisible link annotations that wrap an entire page — useful for splash screens — and those will appear in an extraction even though nothing is visually underlined.
The PDF Link Extractor follows the second path. It loads the file with PDF.js and inspects each page's annotation data for objects that carry an external URL or an internal destination. It does not scan raw byte streams for text that looks like a URL, which means compressed content streams, font tables, metadata, and ordinary body copy cannot generate false positives.
How to Pull Every Link From a PDF Locally
Before you begin, confirm your document opens normally in a standard viewer and is not password-protected. The tool accepts one PDF at a time, up to 25 MiB and 40 pages; encrypted, damaged, or over-limit files are rejected with a visible error before any extraction starts.
- Open the PDF Link Extractor in your browser and choose one local PDF using the file picker. The selected file is read by the browser; nothing is uploaded to a server.
- Click Extract Links. PDF.js and its worker load on demand, then the tool walks each page in order and reads its annotation list.
- Review the report that appears in your browser. Each row shows the page, annotation number, link type, and the target string in inert form.
- Copy the report to your clipboard, or download it as a UTF-8 TXT file or a formula-safe CSV file.
- Load a different file if you need to. Starting a new extraction cancels the previous run and cleans up transient state automatically.
If you want the simplest path through a single PDF and care most about the privacy angle, the dedicated guide to extracting every link without uploading walks through the same flow with extra emphasis on what stays on your device.
Which Schemes Make the Report (And Which Don't)
A link annotation can technically target almost anything: a web address, an email, a phone number, a JavaScript expression, a file path, a blob reference, or arbitrary custom schemes. Most of those are unsafe to surface as live, clickable text in a report, so the tool applies a narrow allow-list.
| Scheme | Accepted | Notes |
|---|---|---|
| http | Yes | External web link |
| https | Yes | External web link |
| mailto | Yes | Email address target |
| tel | Yes | Phone number target |
| javascript | No | Filtered out |
| data | No | Filtered out |
| file | No | Filtered out |
| blob | No | Filtered out |
| Anything else | No | Filtered out |
The match is case-insensitive, so HTTPS and https are treated identically. Strings containing control characters are also rejected before they can reach the report. The summary footer of every extraction lists how many annotations were examined, how many targets were accepted, how many duplicates were removed, and how many unsafe or unsupported entries were skipped — useful when you want to confirm the count you see matches the document's full annotation set.
External vs Internal Targets
The report contains two flavors of destination, and they behave differently.
External targets are URLs: an http or https address, a mailto, or a tel. These are presented as inert text exactly as PDF.js exposed them. The tool never visits, fetches, validates, or reputation-checks the target — its presence in the report only confirms that the PDF contained a supported link annotation that pointed to it. Always verify important destinations independently before opening or republishing them.
Internal targets point to another location inside the same document. PDF.js can expose these as either named destinations or explicit destination arrays, and the report labels them as internal. Because internal destination structures and viewer behavior vary across documents and readers, the tool does not promise to resolve every internal target to a final page number. It serializes a bounded, readable representation so you can see where the PDF was pointing within itself, then leaves interpretation to you and your viewer.
Page order and annotation order within a page are preserved for both flavors, so the report reads top to bottom in the same order a reader would encounter the links.
Why a Link May Be Missing
A few common situations cause a link to be absent from the report even though you can see a URL in the document.
The URL is only printed, not made clickable. Visible text that happens to look like a web address is not a link annotation. The tool reads annotations rather than searching all text for URL-shaped strings, so a hyperlink you never underlined will not appear.
The annotation uses an unsupported scheme. If the link points at javascript: or data: or any scheme outside the http, https, mailto, and tel allow-list, it is filtered out of the report rather than surfaced as a clickable target.
The PDF is encrypted or malformed. Encrypted or damaged documents are rejected before extraction, so any links inside them are not inspected at all. Removing the password (if you know it) or repairing the file is a prerequisite.
The same exact target appears twice on one page. Exact duplicates on the same page are removed as redundant, while the same link on a different page is preserved because the page occurrence itself is meaningful evidence of where the document sends readers.
Safe Export Options
The same inert report is available in three forms: an on-screen table you can copy as plain text, a UTF-8 TXT download, and a CSV download. The CSV columns are page, annotation number, type, and target. Quotes and embedded line breaks are escaped using standard CSV rules, and any cell that begins with a spreadsheet formula prefix is neutralized before it is written to the file. This stops an extracted target from being executed as a formula the moment a user opens the report in spreadsheet software.
That CSV escaping behavior is consistent with published guidance on formula injection in spreadsheet imports, and the underlying annotation data comes from PDF.js, the same parser that powers many mainstream browser-based viewers. If you need to inspect the structure of the annotation objects yourself, the PDFPageProxy API is documented in the PDF.js API reference, and the project itself lives at the Mozilla PDF.js repository.
Privacy and Where the File Goes
The PDF and the extracted targets stay on your device throughout the process. The tool does not upload the document to a link-analysis server and does not contact any of the extracted URLs. PDF.js loads only after you press the extract button, so the parser is not part of the initial page bundle. When you start a new extraction on a different file, the previous run is cancelled and any temporary URLs and loading tasks are released.
This local-processing approach makes the tool well suited to inventory, migration checks, document QA, and reviewing where a PDF sends readers. It is not a crawler, broken-link checker, phishing detector, accessibility audit, or content scanner — its result is only as reliable as the annotation data PDF.js can read, and verification of any destination remains your responsibility.