python使用pdfplumber庫一鍵提取pdf中的所有超鏈接
前言
超鏈接在 pdf 中被歸類為“鏈接注釋”(Link Annotations)。
根據(jù) pdf 規(guī)范,超鏈接是一種特殊的注釋類型,其核心結(jié)構(gòu)包含定義可點(diǎn)擊區(qū)域的矩形、指定跳轉(zhuǎn)目標(biāo)的 URI 或頁面信息,以及可選的視覺樣式。這種設(shè)計(jì)允許 pdf 閱讀器識(shí)別并響應(yīng)用戶的點(diǎn)擊行為。
本文基于 python 開源庫 pdfplumber 來提取 pdf 中的超鏈接。
pdfplumber 庫,專門用于解析 pdf 文檔,可提取 pdf 的基本信息(作者、創(chuàng)建時(shí)間、修改時(shí)間…)及表格、文本、圖片、超鏈接等信息,基本可以滿足所有較為簡單的內(nèi)容提取。
pdfplumber 可直接使用 pip 命令進(jìn)行安裝,具體命令如下:
pip install pdfplumber
提取 pdf 中超鏈接詳解
pdfplumber 自帶的 .hyperlinks 屬性,專門用于獲得 pdf 中的所有超鏈接信息,返回結(jié)果為一個(gè)字典列表。
如以下代碼,使用 pdfplumber 打開 test.pdf 后,采用 .hyperlinks 屬性獲取每一頁的超鏈接信息。
import pdfplumber
with pdfplumber.open(r'./data/test.pdf') as pdf_info:
for page in pdf_info.pages:
links = page.hyperlinks
print(links)上述代碼運(yùn)行后,返回結(jié)果為一個(gè)字典列表,內(nèi)容包含頁碼、URI(目標(biāo)地址)等超鏈接信息。如下圖:

然后根據(jù)需要,提取字典列表中的超鏈接即可。
完整代碼如下,直接復(fù)制該代碼,修改文件路徑為自己的 pdf 完整路徑,即可獲取到 pdf 所有頁中所有的超鏈接。
import pdfplumber
def get_links(file_path):
res_links = []
with pdfplumber.open(file_path) as pdf_info:
page_number = 0
for page in pdf_info.pages:
page_number += 1
links = page.hyperlinks
if links:
for link in links:
res_link = link.get('uri')
res_links.append(res_link)
print(f'第{page_number}頁,共有{len(links)}個(gè)超鏈接!')
else:
print(f'第{page_number}頁,不存在超鏈接!')
return res_links
if __name__=="__main__":
# 文件路徑為 pdf 完整路徑
res_links = get_links('data/FCC_all.pdf')
print(res_links)以上僅為 pdf 中超鏈接提取的一種方法,可供參考。
方法補(bǔ)充
基本用法:提取所有超鏈接
核心代碼很簡單:打開 PDF,遍歷每一頁,然后從頁面的 hyperlinks 屬性中提取 uri(目標(biāo)網(wǎng)址)。
import pdfplumber
def extract_links(pdf_path):
all_links = []
with pdfplumber.open(pdf_path) as pdf:
for page in pdf.pages:
page_links = page.hyperlinks
if page_links:
for link in page_links:
# 每個(gè) link 是一個(gè)字典,'uri' 鍵存儲(chǔ)了目標(biāo)網(wǎng)址
uri = link.get('uri')
if uri:
all_links.append(uri)
return all_links
if __name__ == "__main__":
links = extract_links("你的文件.pdf")
for link in links:
print(link)你也可以在遍歷時(shí)加上頁碼,方便記錄:
for i, page in enumerate(pdf.pages):
links = page.hyperlinks
if links:
print(f"第 {i+1} 頁 有 {len(links)} 個(gè)鏈接")
for link in links:
print(f" - {link.get('uri')}")
else:
print(f"第 {i+1} 頁 沒有鏈接")高級(jí)用法:靈活處理
處理其他類型的鏈接
除了 uri(網(wǎng)頁鏈接),hyperlinks 可能還包含內(nèi)部鏈接(指向 PDF 內(nèi)其他頁面,鍵為 page)或文檔級(jí)鏈接(鍵為 nameddest)。
if 'uri' in link:
print(f"網(wǎng)頁鏈接: {link['uri']}")
elif 'page' in link:
print(f"內(nèi)部鏈接: 第 {link['page']} 頁")
elif 'nameddest' in link:
print(f"命名目標(biāo): {link['nameddest']}")提取鏈接的鏈接文本(高級(jí)技巧)
有時(shí)你需要知道鏈接所關(guān)聯(lián)的文本(例如“點(diǎn)擊這里”)。pdfplumber 本身不直接提供這個(gè)功能,但可以結(jié)合 chars 屬性(包含每個(gè)字符的詳細(xì)信息,如位置坐標(biāo))來間接獲取。基本思路是獲取鏈接的矩形區(qū)域(x0, y0, x1, y1),然后篩選出落在這個(gè)區(qū)域內(nèi)的字符并組合成文本。這需要一定的坐標(biāo)計(jì)算,但能更精確地處理復(fù)雜文檔。
處理加密PDF
pdfplumber.open() 方法支持通過 password 參數(shù)打開加密的 PDF 文件。
with pdfplumber.open("encrypted.pdf", password="你的密碼") as pdf:
# ... 正常提取鏈接常見問題與注意事項(xiàng)
- 鏈接提取不到:
pdfplumber提取的是 PDF 中的 “鏈接注釋” (Link Annotations)。如果你需要提取的是文本內(nèi)容中直接以 URL 形式出現(xiàn)的字符串,直接使用文本搜索或正則表達(dá)式會(huì)更合適。 CroppedPage相關(guān)Bug:如果你對(duì)頁面進(jìn)行了裁剪操作,可能會(huì)遇到與CroppedPage相關(guān)的超鏈接提取 Bug。如果遇到此類問題,可以嘗試更新pdfplumber到最新版本,或直接在原始Page對(duì)象上提取鏈接。- 掃描版PDF:
pdfplumber主要用于處理由計(jì)算機(jī)生成的 PDF(Machine-generated PDFs)。如果 PDF 是掃描件(圖片形式),它無法直接提取其中的超鏈接或文本。你需要先用 OCR 技術(shù)(如pytesseract)進(jìn)行識(shí)別。
到此這篇關(guān)于python使用pdfplumber庫一鍵提取pdf中的所有超鏈接的文章就介紹到這了,更多相關(guān)python提取pdf超鏈接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python 關(guān)于模塊和加載模塊的實(shí)現(xiàn)
這篇文章主要介紹了Python 關(guān)于模塊和加載模塊的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
大語言模型的開發(fā)利器langchainan安裝使用快速入門學(xué)習(xí)
這篇文章主要為大家介紹了大語言模型的開發(fā)利器langchain安裝使用快速入門學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題
今天小編就為大家分享一篇解決pycharm下os.system執(zhí)行命令返回有中文亂碼的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Python?一篇文章看懂Python集合與字典數(shù)據(jù)類型
集合并不是一種數(shù)據(jù)處理類型,而是一種中間類型。集合(set)是一個(gè)無序、不重復(fù)的元素序列,經(jīng)常被用來處理兩個(gè)列表進(jìn)行交并差的處理性。本文將詳細(xì)講解集合的一些常用方法,感興趣的可以了解一下2022-03-03
Python數(shù)據(jù)分析之pandas比較操作
比較操作是很簡單的基礎(chǔ)知識(shí),不過Pandas中的比較操作有一些特殊的點(diǎn),本文介紹的非常詳細(xì),對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助.需要的朋友可以參考下2021-05-05
python使用selenium模擬瀏覽器進(jìn)入好友QQ空間留言功能
這篇文章主要介紹了python使用selenium模擬瀏覽器進(jìn)入好友QQ空間留言,在本文實(shí)現(xiàn)過程中需要注意的是留言框和發(fā)表按鈕在不同的frame,發(fā)表在外面的一層,具體實(shí)現(xiàn)過程跟隨小編一起看看吧2022-04-04
Python?yaml格式配置文件操作實(shí)戰(zhàn)教程
yaml是專門用來寫配置文件的語言,非常簡潔和強(qiáng)大,用ini也能寫配置文件,看了yaml后,發(fā)現(xiàn)這個(gè)更直觀,更方便,有點(diǎn)類似于json格式,這篇文章主要介紹了Python?yaml格式配置文件操作的相關(guān)資料,需要的朋友可以參考下2025-11-11
對(duì)Pytorch中nn.ModuleList 和 nn.Sequential詳解
今天小編就為大家分享一篇對(duì)Pytorch中nn.ModuleList 和 nn.Sequential詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08

