從 PDF 中擷取連結,代表讀取檔案中與文字和圖片一同儲存的可點擊連結註解,然後產生一份依照頁序排列的清單,列出文件所公開的每一個支援的 URL 和內部跳轉位置。以瀏覽器為基礎的擷取工具,例如 PDF Link Extractor,並不會掃描可見文字來尋找符合 URL 格式的字串;它會透過 PDF.js 走訪註解物件,僅接受目標通訊協定為 HTTP、HTTPS、mailto 或 tel 的項目,並將結果以非作用中文字的形式,寫入一份保留在你裝置上的 CSV 或 TXT 報告。25 MiB 和 40 頁的限制,且不處理加密或格式錯誤的輸入,使工作範圍保持有限且可預測。
人們常在實際操作中才體會到這項差異。他們反白頁面上的 URL、複製它,然後假設文件中的每一個連結運作方式都一樣。PDF 同時保有兩個平行的世界:你看到的繪製文字,以及定義哪些區域為可互動的註解圖層。接下來的文章會說明這兩者——工具讀取了什麼、略過了什麼,以及對於它所列出的目標位置,它無法承諾什麼。

「從 PDF 擷取連結」實際上代表什麼
從根本來看,「從 PDF 擷取連結」就是列出檔案中所有動作為前往目標位置的註解。每一個連結註解至少包含兩項資訊:位置(連結在頁面上涵蓋的矩形區域)和目標(檢視器在該矩形被點擊時應前往的位置)。目標可以是使用一組限定通訊協定的網址,也可以是指向同一份文件中另一頁、命名位置或特定座標的內部目的地。
該工具會將位置與目標的配對轉成報告中的一列。它不會移動、複製或重新編寫原始檔案。PDF 和擷取出的目標會保留在你的裝置上;報告是此工具唯一產生的產物,你可以將它以純文字複製,或下載為 CSV 或 TXT 檔。
連結註解與印刷文字
這是嘗試從 PDF 擷取連結時最常見的混淆來源,值得特別說明。PDF 頁面上的 URL 可能出現在兩個完全獨立的地方:內容串流中的可見文字,以及註解陣列中作為連結註解的目標。只有後者才是可點擊的連結。下方表格清楚說明了實際差異。
| URL 出現的位置 | 是否以連結註解儲存? | 是否包含於報告中? |
|---|---|---|
| 以可見文字輸入的底線文字 "https://example.com" | 否 | 預設為否 |
| 置於標誌圖片上方的超連結 | 是 | 是,並附頁碼 |
| 表單欄位說明文字中的 URL | 通常為否 | 否 |
| 「Email us」按後方的 mailto: 地址 | 是 | 是 |
| 附加於按鈕的 javascript: 連結 | 是,但通訊協定不安全 | 略過 |
| 隱藏在覆蓋段落的有色形狀後方的 URL | 是 | 是 |
PDF Link Extractor 僅回報註解,因此上表中第二、第四和第六列才會在輸出中產生一列。第一列——從未設為可點擊的可見 URL——是最讓使用者感到意外的情況。該工具不進行猜測;它依據 PDF.js 的註解資料運作,這就是為何當某個印刷的 URL 從未成為連結時,它就不會出現。
擷取工具如何讀取檔案
核心引擎為 PDF.js,這是 Mozilla 開發、在瀏覽器中執行的開放原始碼 PDF 解析器。PDF Link Extractor 僅在你按下按鈕後才載入該程式庫,因此初始頁面套件保持精簡,直到你真正要求產生報告時才會開始解析。PDF.js 使用的共享 worker 是從同系列其他 PDF.js 工具所共用的固定 URL 載入,使行為保持一致。
程式庫就緒後,此工具會依照文件順序,向 PDF.js 取得每一頁的註解陣列。它會將該陣列選至 subtype 為 Link 的物件,然後檢查每個連結的目標欄位。目標大致可分為兩類:
- 外部連結,帶有通過審核通訊協定的 URL。通過審核的集合為 HTTP、HTTPS、mailto 和 tel,以不分大小寫方式檢查,若包含控制字元則予以拒絕。其他類型——javascript:、data:、file:、blob:、vbscript: 等等——會從報告中排除,而不會顯示出來。
- 內部目的地,指向同一份 PDF 內的其他位置。這些可以是命名目的地字串,或明確的目的地陣列(頁面參照加上座標或符合模式)。它們不一定有網址,因此報告會將其標示為內部目標,並序列化為有限且易讀的表示形式。
略過的目標會另外彙整,絕不會以可點擊形式顯示,也絕不會被實際前往。完整流程——在使用者明確操作下載入檔案、要求註解、依類型與通訊協定選、於同一頁內去重、強制執行註解與輸出預算、序列化為非作用中 TXT 與公式中和過的 CSV,以及在取代時清理載入工作與下載 URL——即是此工具所記錄的方法論。
在瀏覽器中執行擷取作業
以下是具體的工作流程。每個步對應到頁面上的按鈕或結果;所有過程皆不會上傳到伺服器。
- 在瀏覽器中開啟 PDF Link Extractor。在你選擇檔案之前,頁面是空白的,因此不會有任何背景執行。
- 使用檔案選擇對話框挑選一個本地端的 PDF。檔案大小上限為 25 MiB,頁數上限為 40 頁,且不得為加密、格式錯誤或其他不受支援的狀態。若不符合上述任一條件,此工具會回傳明顯的錯誤並在讀取檔案前停止作業。
- 點選 Extract Links。此工具會載入 PDF.js 及其共享 worker,然後依序走訪每頁的註解陣列。所有作業皆在瀏器中進行,不會傳送至任何地方。
- 檢視出現的報告。每一列包含頁碼、註解編號、類型和目標。外部 URL、內部目的地與略過的目標會分組顯示。
- 複製純文字報告,或下載對公式安全的 CSV 或 UTF-8 TXT 檔。CSV 已進行跳脫與中和處理,因此以 =、+、- 或 @ 開頭的目標在試算表中開啟時,不會被解讀為公式。
- 若你開始新的擷取作業,前一次的執行會被取消。載入工作、下載 URL 和暫存狀態皆會被清理,使下一個檔案從已知的空白狀態開始。
解讀報告:外部、內部與略過的目標
你下載的 CSV 包含四個欄位:頁碼、註解編號、類型與目標。TXT 版本以穩定的純文字版面使用相同的標籤。兩種版本皆依頁面順序,再依 PDF.js 在該頁中回傳的順序,列出註解。同一頁的完全重複項目會被移除;同一個連結若出現於不同頁面則會保留,因為看到同一個目標同時出現在第 4 頁和第 11 頁,有助於了解文件的引用方式。
內部目的地不一定有網址。報告仍會將其納入,但會標示為內部,並寫入有限的表示形式,例如命名目的地或頁面參照。此工具不會聲稱能將每個內部目的地解析為最終頁碼,因為目的地結構會因文件和檢視器而異。
略過的目標會以獨立的摘要計數呈現,而不是以列的形式出現。該摘要也會回報檢視過多少註解、接受了多少,以及合併了多少重複項目。這份摘要正是讓報告適用於盤點工作的關鍵:你一眼就能判斷註解的頁數是否符合已接受連結的頁數,或判斷大部分連結是否因屬於不安全類型而被排除。
報告的安全性與隱私界線
這裡有三個重點。第一是檔案的去向:哪裡都不會去。PDF 和擷取出的目標會保留在你的裝置上。第二是此工具對目標的處理:完全不處理。它不會前往、擷取、驗證或對任何擷取出的目標進行信譽檢查。某個目標出現在報告中,僅代表 PDF.js 公開了一個支援的連結註解。第三是攻擊者可能對匯出檔案進行的操作:以 =、+、- 或 @ 開頭的 CSV 儲存格可能會被試算表軟體解讀為公式。此工具在序列化前會中和這些前置字元,並依 CSV 規則跳脫引號與換行,即使在你開啟報告後,目標仍會保持非作用中狀態。
這些界線也說明了此工具「不是」什麼。它不是壞掉的連結檢查器、不是釣魚偵測器、不是無障礙稽核工具,也不是內容掃描器。如果你需要知道某個目標是否仍然有效、是否指向惡意軟體,或某個連結是否具有無障礙文字,則必須另行驗證。報告是盤點清單;驗證責任由你承擔。
適合與不適合使用此報告的時機
這份報告特別適合四種用途。第一,盤點:你想要一份 PDF 中所有連結的清單,依頁面分組,無需手動點擊。第二,遷移檢查:在將文件移轉至新系統前,你想知道哪些連結需要重新指向。第三,文件品保:你想確認作者預期的連結確實以註解形式存在,而非僅以印刷文字呈現。第四,檢視 PDF 將讀者導向何處——這對合規、編輯審查與內容稽核很有幫助。
這份報告無法取代獨立驗證。即使檔案來自你自己的裝置,也應將目標視為不受信任的資料。在發布或分享文件前,抽樣檢查重要的目標位置。將原始 PDF 保留為正式來源,因為報告是其註解圖層的衍生檢視,無法取代檔案本身。
延伸閱讀:在不浪費紙張的狀態下擷取 PDF 頁面進行列印。
延伸閱讀:初學者指南:如何從 PDF 擷取連結。