PDF 連結擷取器會讀取 PDF 中所有可點擊的連結註解,檔案上限為 25 MiB 與 40 頁,接著在您的瀏覽器內產生一份依頁序排列的報告,整個過程不會上傳文件,也不會經過遠端伺服器。當檔案碰到任一上限時,就算作本工具定義的「大型」檔案;一旦超過,擷取器會顯示明顯的錯誤,而不是靜默地略過註解。在您按下按鈕後,所有處理都在本機完成:PDF.js 載入後,逐頁讀取註解陣列,保留支援的外部通訊協定(HTTP、HTTPS、mailto、tel),並將 javascript、data、file、blob 等不安全通訊協定排除在報告之外。由於輸出為純文字,惡意目標無法以指令碼形式執行,也無法在您開啟報告時自動導向。同一頁內的完全重複項目會被合併,但跨頁的重複則會保留,因為頁面出現位置對移轉與 QA 工作來說是有用的證據。

extract links from pdf large file
從大型 PDF 擷取連結:檔案大小限制

為什麼大型 PDF 會讓大多數連結擷取工具失效

當文件大小超過數 MB 時,大多數 PDF 連結工具會以三種可預測的方式變慢或失敗:一次性讀取整個位元組串流、在渲染後的文字中搜尋形似 URL 的字串而非讀取連結註解,或是將檔案上傳至遠端伺服器並等待每次請求的網路往返。這三種做法都與檔案大小產生不良的交互作用。在壓縮過的物件串流中進行天真的位元組搜尋,會因為字型表、中繼資料與影像二進位資料而產生大量誤判,這就是為什麼某些「總結磁碟區的 URL 搜尋器」報告中會夾雜數十行看似 https:// 開頭、實際上卻解析不到真實目的地的垃圾內容。伺服器上傳受限於您的連線與伺服器佇列,在一份 20+ MiB、數百頁的 PDF 上,等待時間是實實在在的。本文使用的瀏覽器工具是圍繞 PDF.js 註解資料建構,而非純文字掃描,這就是為什麼多 MB、註解密集的 PDF 仍能保持快速,結果也保持乾淨。

另一種常見的失敗是靜默截斷。一個只載入前 N 頁、忽略其餘頁面的工具,會回傳一份看似完整、實際上卻少了三分之一文件的報告。這種結果比硬錯誤更糟,因為使用者無從察覺有缺漏。當文件被加密、格式損壞、不受支援,或超過 25 MiB 與 40 頁的上限時,擷取器會顯示明顯的錯誤,因此您複製或下載的報告永遠只反映工具實際開啟過的頁面。

本工具如何定義大型 PDF

本工具以兩項互相影響的限制來定義「大型」:您選擇的檔案大小上限為 25 MiB,解析後的文件頁數上限為 40 頁。兩者都在您選擇檔案後才會強制檢查,因此工具無法事先告知您會先碰到哪一項上限。一份 30 頁、充滿高解析度掃描頁面的 PDF 仍可能超過 25 MiB 限制;而一份 60 頁、純文字的 PDF 雖然在位元組上限內,仍會因超過頁數預算而被拒絕。結果面板中的摘要列會回報已檢查的註解數、接受的連結數、合併的重複數,以及略過的不安全或不支援目標,讓您能快速確認工具是否完整讀取整份文件,還是提前停止。

限制數值超過時的處理方式
檔案大小25 MiB顯示明顯錯誤,不開始擷取
頁數40 頁顯示明顯錯誤,不開始擷取
加密 PDF不支援顯示明顯錯誤,不開始擷取
格式損壞或不支援的 PDF不支援顯示明顯錯誤,不開始擷取
每份文件的註解數受限的輸出預算強制限制;避免無限的工作量或輸出
目標字串長度受限的輸出預算強制限制;避免無限制的輸出

任何可以作為附件寄出的 PDF 通常都在位元組上限內,而任何頁數少於一般 30 頁報告的 PDF 通常也都在頁數上限內。更大的檔案應該先分割或分批處理,這將在下一節中介紹。

如何從大型 PDF 擷取連結

  1. 在瀏覽器中開啟 PDF 連結擷取器。在您動作之前,頁面不會載入任何內容;PDF.js 及其共用 worker 僅在您首次按下按鈕後才會載入。
  2. 點擊檔案選擇器,從您的裝置中選擇一個 PDF 檔案。本工具完全在瀏覽器內執行;檔案不會被上傳。請選擇大小不超過 25 MiB、頁數不超過 40 頁的文件。
  3. 點擊「Extract Links」。本工具會透過 PDF.js 逐頁讀取註解資料,篩選出可點擊的連結註解,並丟棄通訊協定不屬於 HTTP、HTTPS、mailto 或 tel 的目標。即使通訊協定本身允許,含有控制字元的目標也會被拒絕。
  4. 檢視螢幕上的報告。項目依頁序與註解順序顯示。每一列會顯示頁碼、該頁的註解索引、連結類型,以及純文字目標字串。指向同一份文件內部的 PDF 目的地(具名目的地或指向同一文件內部的明確目的地陣列)會標示為內部目標,並以可讀的形式呈現。
  5. 使用「複製」將相同的純文字報告複製到剪貼簿,或下載 UTF-8 的 TXT 檔或 CSV 檔。TXT 版本使用穩定的頁面標籤;CSV 版本包含頁碼、註解編號、類型與目標欄位,並對引號與換行進行跳脫處理;任何以試算表公式前置字元開頭的值都會被中和,以防止擷取出的目標在您稍後於試算表軟體中開啟報告時變成公式。

重複執行時會取消先前的作業、釋放先前 PDF 的頁面、撤銷先前的下載網址,並清除暫存狀態,因此在您依序處理多個大型檔案時,記憶體不會持續累積。

當檔案超過 25 MiB 或 40 頁上限時

擷取器對超過上限的檔案會顯示明顯的錯誤並加以拒絕,而非執行部分處理後假裝作業完成。當您的 PDF 超過 25 MiB 時,最快的做法是先分割,再對每個區塊執行本工具。Split PDF 在本機執行,可讓您將大型檔案切割成連續範圍或固定頁數,使每個區塊都符合 25 MiB 與 40 頁的預算。當文件超過 40 頁但低於 25 MiB 時,同樣適用分割做法,因為 41 頁的報告無論位元組大小為何都會超過頁數上限。每次執行的結果彼此獨立,因此您可以在事後將多個區塊的結果貼入試算表,並在需要單一合併報告時將頁碼視為偏移量處理。

若文件已加密,本工具完全無法讀取註解,會回傳明顯的錯誤。先使用在本機運作的工具(例如 Remove PDF Password)移除密碼,即可儲存一份未受保護的點陣版本,讓擷取器能夠開啟。一旦檔案符合大小與頁數上限,前面介紹的五步驟流程即可直接套用,無需任何修改。格式損壞與不受支援的 PDF 會回傳相同的明顯錯誤,超過每文件註解預算的文件亦同,這項限制是為了防止單一文件造成無限制的工作量或輸出。

報告包含哪些內容、又略過哪些內容

結果面板與下載的檔案共用同一組資料。摘要列會列出已檢查的註解數、接受的連結數、合併的重複數,以及略過的不安全或不支援目標。每列資料包含頁碼、該頁的註解索引、連結類型(外部或內部),以及純文字目標字串。TXT 檔為 UTF-8 純文字,使用穩定的頁面標籤;CSV 檔有四個欄位,並依 CSV 規則進行欄位跳脫。以試算表公式前置字元開頭的值會在序列化前被中和,這是針對 OWASP 所記錄之 CSV 注入模式的一項防護。

目標類型是否納入報告原因
http:// URL是支援的外部通訊協定
https:// URL是支援的外部通訊協定
mailto: 地址是支援的外部通訊協定
tel: 號碼是支援的外部通訊協定
javascript: 連結否列為不安全的通訊協定而排除
data: URI否列為不安全的通訊協定而排除
file: 連結否列為不安全的通訊協定而排除
blob: 連結否列為不安全的通訊協定而排除
含有控制字元的目標否即使使用支援的通訊協定也會被拒絕
以可見文字顯示但不可點擊的 URL無法保證本工具讀取的是註解,而非原始文字
內部具名目的地或明確目的地陣列是,標示為內部由 PDF.js 揭露;不會解析為最終頁面

目標出現在報告中,僅代表 PDF.js 揭露了一個支援的連結註解。本工具不會對任何擷取出的目的地進行導向、擷取、驗證、信譽檢查,也不保證其安全性。內部目的地不一定擁有網路 URL,也可能無法解析為最終頁碼,因為目的地結構、頁面參照與檢視器行為會因文件而異。這個標示誠實地反映了本工具能夠、與不能夠,從單一檔案中證明的事項。

大型檔案的隱私與安全注意事項

在整個執行過程中,PDF 都保留在您的裝置上。PDF.js 及其 worker 僅在您按下按鈕後才會載入,且不在初始頁面套件之中,這代表在您動作之前,網路處於閒置狀態。來源檔案大小有上限,目標以純文字呈現,加上不安全通訊協定的過濾,可確保擷取出的 javascript:、data:、file: 或 blob: 連結在報告中永遠不會變成可點擊狀態。CSV 注入的問題則透過在寫入檔案前中和以試算表公式前置字元開頭的值來緩解。以上特性在處理更大的文件時也不會改變:位元組與頁數上限是關於工具能否完成工作,與檔案是否離開您的電腦無關。

請將這份報告用於盤點、移轉檢查、文件 QA,以及檢視 PDF 將讀者導向哪些位置。本工具並非爬蟲、失效連結檢查器、釣魚偵測器、總結磁碟區的可及性稽核工具,也非內容掃描器。底層的註解讀取器是開源的 Mozilla PDF.js 專案,這也是許多瀏覽器 PDF 檢視器所使用的程式庫。在造訪或發布重要目的地之前,請獨立加以驗證,並保留原始 PDF 作為來源紀錄。

如需更深入的說明,請參閱 Can I Split a PDF by Size Without Uploading a File?。

如需更深入的說明,請參閱 Simplify the Process to Compress a PDF to a Target Size。