從 PDF 中擷取連結的意思是將文件裡所有可點擊的連結註解全部抽出來,並依頁面列出,讓你可以在不重新輸入的情況下檢視、複製或下載這些目標連結。對大多數初學者來說,困難的地方並不是點擊本身——而是當一份 PDF 散佈著數十個雜亂的連結時(有些指向外部網站,有些指向同一份檔案內部的其他頁面,還有些看起來像網址但其實從未被設定為可點擊),要怎麼取得一份乾淨的清單。專用的擷取工具會直接讀取底層的連結註解,而不是掃描每個字來尋找外觀像網址的文字,這就是為什麼它的結果比從 PDF 閱讀器複製貼上要準確得多。PDF 連結擷取工具正是直接在瀏覽器中執行這個動作:你挑選一個不超過 25 MiB、40 頁以內的本機 PDF,按下按鈕,就能得到一份依頁面排序的報告,列出文件所公開的每個受支援連結。檔案及其內容在任何時刻都不會離開你的裝置。

接下來是一份適合初學者的逐步說明,介紹這個工具如何運作、能夠與不能讀取哪些類型的連結,以及如何解讀它所產生的報告。

extract links from pdf for beginners
如何為初學者從 PDF 中擷取連結

PDF 中的哪些內容算作連結

並非 PDF 中每個可見的網址都是可點擊的連結。PDF 作者有兩種方式在頁面上放置網址:他們可以將其以一般文字的形式輸入,讓閱讀者能看到並選取,也可以將其包裝在一個稱為連結註解的特殊物件中。連結註解讓網址能在任何 PDF 檢視器中變得可點擊,也正是它讓網址能夠以程式方式被取出。

PDF 連結擷取工具讀取的是 PDF.js 的註解資料,而不是在文件的原始位元組中搜尋外觀像網址的字串。這個區別很重要,因為 PDF 的串流、字型表與中繼資料中常常含有外觀像網址的片段,但這些片段其實從未被設定為可點擊。透過只處理註解,工具能避免回傳這些誤判的結果。根據 Mozilla 的 PDF.js API 說明文件,頁面代理物件上的 getAnnotations 方法是依類型列舉註解的標準方式,而連結註解是其中一個受支援的類別。

連結註解有兩種形式。外部連結透過 HTTP 或 HTTPS 等協定指向文件外部的網址。內部目標則指向同一份 PDF 內部的另一個位置,常見的是另一頁或一個已命名的書籤目標。內部目標不一定有網址——它可能以一個具名字串表示,也可能以一個描述頁面、視圖與位置的結構化陣列表示。

開始之前你需要準備什麼

這個工具有一份簡短的硬性需求清單,在你點任何東西之前就能全部看到:

  • 單一 PDF 檔案。擷取工具一次只接受一份文件。如果你有多份 PDF,請分別執行,或先將它們合併成一個檔案再處理,依你的任務而定。
  • 檔案大小不超過 25 MiB。超過的檔案會被拒絕並顯示明確的錯誤訊息。
  • 最多 40 頁。超過此限制的文件不會被處理。
  • 不可設有密碼保護。加密過的 PDF 會在擷取開始前就回傳錯誤。
  • 檔案必須有效且未損壞。格式錯誤或不支援的文件會顯示明確錯誤,而不是產出部分報告。

由於工具完全在瀏覽器本地端執行,你的 PDF 與產生的報告在整個過程中都會留在你的電腦上。沒有上傳步驟,也不需要建立帳號。

如何從 PDF 中擷取連結

實際的操作流程很短,第一次使用的使用者也能在幾分鐘內完成:

  1. 在瀏覽器中開啟 PDF 連結擷取工具頁面,並點擊檔案選擇器來挑選一個本機 PDF。工具會在事前將檔案限制在 25 MiB 與 40 頁以內,並直接拒絕加密、損壞或超大的文件。
  2. 點擊擷取連結。工具會在使用者做出這個動作之後才載入 PDF.js 及其 worker,向每一頁請求註解清單,並將該清單篩選為受支援的連結註解。
  3. 檢視出現在頁面上的報告。每一列會顯示頁碼、註解順序、連結類型,以及非作用中的目標文字。外部目標僅在使用 HTTP、HTTPS、mailto 或 tel 時才會保留;其餘的會被過濾掉,並計入摘要中。
  4. 將報告複製到剪貼簿,或下載 UTF-8 純文字版本,或公式安全的 CSV 版本。這兩種檔案都在本地端產生,絕不會離開你的裝置。
  5. 如果在一份檔案已開啟時又載入了另一份 PDF,新的執行作業會取消前一個任務,並自動清除先前的結果、下載網址與頁面狀態。

解讀報告:欄位與標籤

畫面上的報告與可下載的檔案共用相同的欄位。以下以淺白的用語說明每一欄的意義。

欄位顯示內容為何重要
頁面連結註解所在的頁碼幫助你跳回原始 PDF 並以視覺方式驗證該連結
註解編號該頁上註解的順序當一頁含有許多重疊或堆疊的連結時相當實用
類型外部或內部,加上協定或目標種類讓你一眼就能看出目標是網址還是同一份文件內部的某個位置
目標網址的非作用中文字,或內部目標的可讀呈現複製時安全無虞;本身絕不會自動導向、抓取或執行該連結

表格上方的摘要區塊會告訴你檢視了多少個註解、接受了多少個、移除了多少個重複項目,以及跳過了多少個因為不安全或不支援而未處理的目標。同一頁上完全相同的重複項目會被自動移除;不同頁上出現的相同連結則會保留,因為知道哪些頁面引用了它常常是有用的證據。

哪些 URL 協定會被納入

擷取工具僅接受一組精選且實用的協定,其餘一律拒絕。檢查不區分大小寫,也會拒絕任何含有控制字元的 URL——這是隱藏不安全內容常見的手法。

協定是否接受備註
http一般網頁連結會包含在報告中
https安全網頁連結會包含在報告中
mailto包裝為可點擊連結的電子郵件地址會出現在報告中
tel電話號碼連結會包含在報告中
javascript略過以避免顯示可執行的內容
data略過,因為內嵌的承載內容並非可點擊的目標
file略過,因為本機檔案參考不在處理範圍內
blob略過,因為這類指的是記憶體中的物件,離開來源應用程式後便不再存在
任何含有控制字元的 URL作為防禦措施略過

被排除的協定會直接從報告中移除,而不會被設為可點擊,因此在其他程式中開啟 CSV 或 TXT 檔案時不會觸發任何導向或程式碼執行。

當連結沒有出現在結果中時

報告中少了一列通常歸結於以下幾個原因,能辨識它們可以省下大量時間:

  • 該網址只是印刷文字,而不是連結註解。如果作者只是輸入了一段網址,卻沒有將其包裝在可點擊的區域中,工具就看不到它。在 PDF 中,可見文字與可點擊性是彼此獨立的。
  • PDF 已加密或有密碼保護。工具無法自行解密,會直接拒絕該檔案。
  • 該連結使用了不支援的協定。自訂協定、行動應用程式的深層連結,以及 JavaScript 動作都會被刻意過濾掉。
  • 檔案超出限制。超過 25 MiB 或 40 頁的 PDF 會在擷取開始前顯示明確錯誤。
  • 沒有穩定 URL 形式的內部目標。具名目標與明確的目的地陣列會被列入報告,但工具並不保證能將每一個都解析為最終的頁碼,因為目的地結構與檢視器的行為會因文件而異。

如果你懷疑有連結遺漏,在任何標準閱讀器中開啟 PDF 並將滑鼠移到你懷疑的位置上方,就能快速判斷它到底是不是可點擊的。

讓流程保持安全與可預測

這個擷取工具是為盤點、移轉檢查、文件品保,以及檢視 PDF 將讀者送往何處而設計的。它不是爬蟲、壞鏈檢查器、釣魚偵測器、無障礙稽核工具,也不是內容掃描器。報告中出現某個目標,僅代表 PDF 公開了一個受支援的連結註解——並不保證該目的地可以連上、最新或值得信賴。重要的目的地在實際前往、發布或分享之前,都應該另行獨立驗證。

工具所產生的 CSV 檔案對試算表常見的危險做了防護。根據 OWASP 的 CSV 注入指引,以 =、+、- 或 @ 等字元開頭的儲存格,可能會被試算表軟體重新解讀為公式,進而在開啟檔案時執行程式碼或外洩資料。PDF 連結擷取工具在序列化儲存格之前,會先將這類開頭字元中和掉,並依標準 CSV 規則跳脫內嵌的引號與換行。TXT 檔案則是純 UTF-8 格式,具有穩定的頁面標籤,完全不包含任何可執行的表面。

若想更深入了解底層解析器如何表示註解資料,GitHub 上的 Mozilla PDF.js 專案是工具所依賴的註解結構描述的權威來源。

這個工具的設計目標,是讓初學者第一次嘗試時就能得到一份實用且完整的清單,而無需具備任何 PDF 規格的知識。選擇一個本機檔案,按下按鈕,依頁面排序的報告就能準備好供你複製或下載——一個小型、可預測的工作流程,無論是單頁的講義或 40 頁的報告都能適用。

相關閱讀:PDF 轉 PNG 初學者指南:首次操作逐步說明