🔍 一、PDF大綱簡介
📌 ?PDF大綱(Outline)?? 是PDF文檔中的導航結構,通常顯示在閱讀器的側邊欄中,方便用戶快速跳轉到文檔的不同部分。大綱通常以層級結構組織,包含標題和對應的頁面位置。
本文實現的最終效果圖如下:
🛠? 二、準備工作
所需工具
# 核心庫
pip install pdfminer -i https://pypi.tuna.tsinghua.edu.cn/simple
# 防止內容亂碼
pip install chardet -i https://pypi.tuna.tsinghua.edu.cn/simple# 推薦測試文件
https://static.cninfo.com.cn/finalpage/2024-04-30/1219917147.PDF
?? 常見安裝問題
# 未安裝時的報錯
ModuleNotFoundError: No module named 'pdfminer'
ModuleNotFoundError: No module named 'chardet'
💻 三、代碼實現
完整代碼
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocument
from pdfminer.pdftypes import PDFObjRef
from pdfminer.pdfpage import PDFPage
from pdfminer.psparser import PSLiteral
import chardetdef extract_pdf_outline(pdf_path):"""使用pdfminer提取PDF文檔大綱(書簽)返回包含層級結構的書簽列表"""with open(pdf_path, 'rb') as file:parser = PDFParser(file)document = PDFDocument(parser)# 檢查是否存在大綱if 'Outlines' not in document.catalog:return []# 預先創建頁面列表以便索引pages = list(PDFPage.create_pages(document))outlines = []def resolve(obj):"""解析PDF對象引用"""if isinstance(obj, PDFObjRef):return document.getobj(obj.objid)return objdef decode_pdf_string(s):"""專門處理PDF字符串解碼"""if isinstance(s, (bytes, bytearray)):# 檢測編碼try:# 嘗試UTF-16-BE(PDF標準編碼)return s.decode('utf-16-be')except UnicodeDecodeError:try:# 嘗試自動檢測detected = chardet.detect(s)if detected['confidence'] > 0.7:return s.decode(detected['encoding'])except:pass# 最終回退方案return s.decode('latin1') # 最寬松的解碼elif isinstance(s, PSLiteral):return s.namereturn str(s)def process_outline_item(item, level=0):"""遞歸處理大綱項"""item = resolve(item)if not item:returnif isinstance(item, dict):# 處理書簽項title = item.get('Title')if title:# 解碼標題title = decode_pdf_string(title).strip()# 獲取目標頁面dest = item.get('Dest')page_num = Noneif dest:if isinstance(dest, (bytes, str, PSLiteral)):# 命名目標dest = decode_pdf_string(dest)if 'Dests' in document.catalog:named_dests = resolve(document.catalog['Dests'])if named_dests and dest in named_dests:dest_obj = named_dests[dest]if isinstance(dest_obj, list):page_ref = dest_obj[0]try:page_num = pages.index(page_ref) + 1except ValueError:passelif isinstance(dest, list):# 直接目標page_ref = dest[0]try:page_num = pages.index(page_ref) + 1except ValueError:passoutlines.append({'title': title,'page': page_num,'level': level})# 處理子項和同級項if 'First' in item:process_outline_item(item['First'], level + 1)if 'Next' in item:process_outline_item(item['Next'], level)elif isinstance(item, list):# 處理大綱項列表for child in item:process_outline_item(child, level)# 從根大綱開始處理root_outline = resolve(document.catalog['Outlines'])process_outline_item(root_outline)return outlines# 使用示例
pdf_path = 'C:/Users/Administrator/Desktop/1219917147.pdf'
outline = extract_pdf_outline(pdf_path)# 打印大綱(帶縮進層級)
for bookmark in outline:indent = ' ' * bookmark['level']page_info = f" (Page {bookmark['page']})" if bookmark['page'] else ''print(f"{indent}- {bookmark['title']}{page_info}")
? 核心功能解析
?PDF解析引擎?
parser = PDFParser(file) document = PDFDocument(parser)
?遞歸處理大綱?
def process_outline_item(item, level=0):# 處理當前項if 'First' in item: # 處理子項if 'Next' in item: # 處理同級項
?智能編碼處理?
def decode_pdf_string(s):# 嘗試UTF-16-BE → 自動檢測 → Latin1回退
🎯 四、使用效果
控制臺輸出示例
- 第一節 重要提示、目錄和釋義- 第二節 公司簡介和主要財務指標- 一、公司信息- 二、聯系人和聯系方式- 三、信息披露及備置地點- 四、注冊變更情況- 五、其他有關資料- 六、主要會計數據和財務指標- 七、境內外會計準則下會計數據差異- 1、同時按照國際會計準則與按照中國會計準則披露的財務報告中凈利潤和凈資產差異情況- 2、同時按照境外會計準則與按照中國會計準則披露的財務報告中凈利潤和凈資產差異情況- 八、分季度主要財務指標- 九、非經常性損益項目及金額- 第三節 管理層討論與分析- 一、報告期內公司所處行業情況- 二、報告期內公司從事的主要業務- 三、核心競爭力分析- 四、主營業務分析- 1、概述- 2、收入與成本- (1) 營業收入構成- (2) 占公司營業收入或營業利潤10%以上的行業、產品、地區、銷售模式的情況- (3) 公司實物銷售收入是否大于勞務收入- (4) 公司已簽訂的重大銷售合同、重大采購合同截至本報告期的履行情況- (5) 營業成本構成- (6) 報告期內合并范圍是否發生變動- (7) 公司報告期內業務、產品或服務發生重大變化或調整有關情況- (8) 主要銷售客戶和主要供應商情況- 3、費用- 4、研發投入- 5、現金流- 五、非主營業務分析- 六、資產及負債狀況分析- 1、資產構成重大變動情況- 2、以公允價值計量的資產和負債- 3、截至報告期末的資產權利受限情況- 七、投資狀況分析- 1、總體情況- 2、報告期內獲取的重大的股權投資情況- 3、報告期內正在進行的重大的非股權投資情況- 4、金融資產投資- (1) 證券投資情況- (2) 衍生品投資情況- 1) 報告期內以套期保值為目的的衍生品投資- 2) 報告期內以投機為目的的衍生品投資- 5、募集資金使用情況- (1) 募集資金總體使用情況- (2) 募集資金承諾項目情況- (3) 募集資金變更項目情況- 八、重大資產和股權出售- 1、出售重大資產情況- 2、出售重大股權情況- 九、主要控股參股公司分析- 十、公司控制的結構化主體情況- 十一、公司未來發展的展望- 十二、報告期內接待調研、溝通、采訪等活動- 十三、“質量回報雙提升”行動方案貫徹落實情況- 第四節 公司治理- 一、公司治理的基本狀況- 二、公司相對于控股股東、實際控制人在保證公司資產、人員、財務、機構、業務等方面的獨立情況- 三、同業競爭情況- 四、報告期內召開的年度股東大會和臨時股東大會的有關情況- 1、本報告期股東大會情況- 2、表決權恢復的優先股股東請求召開臨時股東大會- 五、董事、監事和高級管理人員情況- 1、基本情況- 2、任職情況- 3、董事、監事、高級管理人員報酬情況- 六、報告期內董事履行職責的情況- 1、本報告期董事會情況- 2、董事出席董事會及股東大會的情況- 3、董事對公司有關事項提出異議的情況- 4、董事履行職責的其他說明- 七、董事會下設專門委員會在報告期內的情況- 八、監事會工作情況- 九、公司員工情況- 1、員工數量、專業構成及教育程度- 2、薪酬政策- 3、培訓計劃- 4、勞務外包情況- 十、公司利潤分配及資本公積金轉增股本情況- 十一、公司股權激勵計劃、員工持股計劃或其他員工激勵措施的實施情況- 1、股權激勵- 2、員工持股計劃的實施情況- 3、其他員工激勵措施- 十二、報告期內的內部控制制度建設及實施情況- 1、內部控制建設及實施情況- 2、報告期內發現的內部控制重大缺陷的具體情況- 十三、公司報告期內對子公司的管理控制情況- 十四、內部控制評價報告或內部控制審計報告- 1、內控評價報告- 2、內部控制審計報告- 十五、上市公司治理專項行動自查問題整改情況- 第五節 環境和社會責任- 一、重大環保問題- 二、社會責任情況- 三、鞏固拓展脫貧攻堅成果、鄉村振興的情況- 第六節 重要事項- 一、承諾事項履行情況- 1、公司實際控制人、股東、關聯方、收購人以及公司等承諾相關方在報告期內履行完畢及截至報告期末尚未履行完畢的承諾事項- 2、公司資產或項目存在盈利預測,且報告期仍處在盈利預測期間,公司就資產或項目達到原盈利預測及其原因做出說明- 二、控股股東及其他關聯方對上市公司的非經營性占用資金情況- 三、違規對外擔保情況- 四、董事會對最近一期“非標準審計報告”相關情況的說明- 五、董事會、監事會、獨立董事(如有)對會計師事務所本報告期“非標準審計報告”的說明- 六、與上年度財務報告相比,會計政策、會計估計變更或重大會計差錯更正的情況說明- 七、與上年度財務報告相比,合并報表范圍發生變化的情況說明- 八、聘任、解聘會計師事務所情況- 九、年度報告披露后面臨退市情況- 十、破產重整相關事項- 十一、重大訴訟、仲裁事項- 十二、處罰及整改情況- 十三、公司及其控股股東、實際控制人的誠信狀況- 十四、重大關聯交易- 1、與日常經營相關的關聯交易- 2、資產或股權收購、出售發生的關聯交易- 3、共同對外投資的關聯交易- 4、關聯債權債務往來- 5、與存在關聯關系的財務公司的往來情況- 6、公司控股的財務公司與關聯方的往來情況- 7、其他重大關聯交易- 十五、重大合同及其履行情況- 1、托管、承包、租賃事項情況- (1) 托管情況- (2) 承包情況- (3) 租賃情況- 2、重大擔保- 3、委托他人進行現金資產管理情況- (1) 委托理財情況- (2) 委托貸款情況- 4、其他重大合同- 十六、其他重大事項的說明- 十七、公司子公司重大事項- 第七節 股份變動及股東情況- 一、股份變動情況- 1、股份變動情況- 2、限售股份變動情況- 二、證券發行與上市情況- 1、報告期內證券發行(不含優先股)情況- 2、公司股份總數及股東結構的變動、公司資產和負債結構的變動情況說明- 3、現存的內部職工股情況- 三、股東和實際控制人情況- 1、公司股東數量及持股情況- 2、公司控股股東情況- 3、公司實際控制人及其一致行動人- 4、公司控股股東或第一大股東及其一致行動人累計質押股份數量占其所持公司股份數量比例達到80%- 5、其他持股在10%以上的法人股東- 6、控股股東、實際控制人、重組方及其他承諾主體股份限制減持情況- 四、股份回購在報告期的具體實施情況- 第八節 優先股相關情況- 第九節 債券相關情況- 一、企業債券- 二、公司債券- 三、非金融企業債務融資工具- 四、可轉換公司債券- 1、轉股價格歷次調整情況- 2、累計轉股情況- 3、前十名可轉債持有人情況- 4、擔保人盈利能力、資產狀況和信用狀況發生重大變化的情況- 5、報告期末公司的負債情況、資信變化情況以及在未來年度還債的現金安排- 五、報告期內合并報表范圍虧損超過上年末凈資產10%- 六、報告期末除債券外的有息債務逾期情況- 七、報告期內是否有違反規章制度的情況- 八、截至報告期末公司近兩年的主要會計數據和財務指標- 第十節 財務報告- 一、審計報告- 二、財務報表- 1、合并資產負債表- 2、母公司資產負債表- 3、合并利潤表- 4、母公司利潤表- 5、合并現金流量表- 6、母公司現金流量表- 7、合并所有者權益變動表- 8、母公司所有者權益變動表- 三、公司基本情況- 四、財務報表的編制基礎- 1、編制基礎- 2、持續經營- 五、重要會計政策及會計估計- 1、遵循企業會計準則的聲明- 2、會計期間- 3、營業周期- 4、記賬本位幣- 5、重要性標準確定方法和選擇依據- 6、同一控制下和非同一控制下企業合并的會計處理方法- 7、控制的判斷標準和合并財務報表的編制方法- 8、現金及現金等價物的確定標準- 9、外幣業務和外幣報表折算- 10、金融工具- 11、合同資產和合同負債- 12、存貨- 13、持有待售資產- 14、長期股權投資- 15、投資性房地產- 16、固定資產- (1) 確認條件- (2) 折舊方法- (3) 固定資產處置- 17、在建工程- 18、借款費用- 19、無形資產- (1) 使用壽命及其確定依據、估計情況、攤銷方法或復核程序- (2) 研發支出的歸集范圍及相關會計處理方法- 20、長期資產減值- 21、長期待攤費用- 22、職工薪酬- (1) 短期薪酬的會計處理方法- (2) 離職后福利的會計處理方法- (3) 辭退福利的會計處理方法- 23、預計負債- 24、股份支付- 25、收入- 26、合同成本- 27、政府補助- 28、遞延所得稅資產/遞延所得稅負債- 29、租賃- (1) 作為承租方租賃的會計處理方法- (2) 作為出租方租賃的會計處理方法- 30、其他重要的會計政策和會計估計- 31、重要會計政策和會計估計變更- (1) 重要會計政策變更- (2) 重要會計估計變更- (3) 2023年起首次執行新會計準則調整首次執行當年年初財務報表相關項目情況- 六、稅項- 1、主要稅種及稅率- 2、稅收優惠- 七、合并財務報表項目注釋- 1、貨幣資金- 2、衍生金融資產- 3、應收票據- (1) 應收票據分類列示- (2) 按壞賬計提方法分類披露- (3) 本期計提、收回或轉回的壞賬準備情況- (4) 期末公司已背書或貼現且在資產負債表日尚未到期的應收票據- 4、應收賬款- (1) 按賬齡披露- (2) 按壞賬計提方法分類披露- (3) 本期計提、收回或轉回的壞賬準備情況- (4) 本期實際核銷的應收賬款情況- (5) 按欠款方歸集的期末余額前五名的應收賬款和合同資產情況- 5、合同資產- (1) 合同資產情況- (2) 按壞賬計提方法分類披露- (3) 本期計提、收回或轉回的壞賬準備情況- 6、應收款項融資- (1) 應收款項融資分類列示- (2) 期末公司已質押的應收款項融資- (3) 期末公司已背書或貼現且在資產負債表日尚未到期的應收款項融資- (4) 本期實際核銷的應收款項融資情況- 核銷說明:- (5) 其他說明- 7、其他應收款- (1) 應收股利- 1) 應收股利分類- 2) 按壞賬計提方法分類披露- (2) 其他應收款- 1) 其他應收款按款項性質分類情況- 2) 按賬齡披露- 3) 按壞賬計提方法分類披露- 4) 本期計提、收回或轉回的壞賬準備情況- 5) 按欠款方歸集的期末余額前五名的其他應收款情況- 8、預付款項- (1) 預付款項按賬齡列示- (2) 按預付對象歸集的期末余額前五名的預付款情況- 9、存貨- (1) 存貨分類- (2) 存貨跌價準備和合同履約成本減值準備- 10、一年內到期的非流動資產- (1) 一年內到期的債權投資- (2) 一年內到期的其他債權投資- 11、其他流動資產- 12、其他權益工具投資- 13、長期應收款- (1) 長期應收款情況- (2) 按壞賬計提方法分類披露- (3) 本期計提、收回或轉回的壞賬準備的情況- 14、長期股權投資- 15、固定資產- (1) 固定資產情況- (2) 暫時閑置的固定資產情況- (3) 通過經營租賃租出的固定資產- (4) 未辦妥產權證書的固定資產情況- (5) 固定資產的減值測試情況- (6) 固定資產清理- 16、在建工程- (1) 在建工程情況- (2) 重要在建工程項目本期變動情況- (3) 在建工程的減值測試情況- (4) 工程物資- 17、使用權資產- (1) 使用權資產情況- (2) 使用權資產的減值測試情況- 18、無形資產- (1) 無形資產情況- (2) 未辦妥產權證書的土地使用權情況- (3) 無形資產的減值測試情況- 19、長期待攤費用- 20、遞延所得稅資產/遞延所得稅負債- (1) 未經抵銷的遞延所得稅資產- (2) 未經抵銷的遞延所得稅負債- (3) 以抵銷后凈額列示的遞延所得稅資產或負債- (4) 未確認遞延所得稅資產明細- (5) 未確認遞延所得稅資產的可抵扣虧損將于以下年度到期- 21、其他非流動資產- 22、所有權或使用權受到限制的資產- 23、短期借款- (1) 短期借款分類- 24、衍生金融負債- 25、應付票據- 26、應付賬款- (1) 應付賬款列示- 27、其他應付款- (1) 應付股利- (2) 其他應付款- 按款項性質列示其他應付款- 28、合同負債- 29、應付職工薪酬- (1) 應付職工薪酬列示- (2) 短期薪酬列示- (3) 設定提存計劃列示- 30、應交稅費- 31、一年內到期的非流動負債- 32、其他流動負債- 33、長期借款- (1) 長期借款分類- 34、應付債券- (1) 應付債券- (2) 應付債券的增減變動(不包括劃分為金融負債的優先股、永續債等其他金融工具)- (3) 可轉換公司債券的說明- 35、租賃負債- 36、長期應付款- 37、預計負債- 38、遞延收益- 39、其他非流動負債- 40、股本- 41、其他權益工具- (1) 期末發行在外的優先股、永續債等其他金融工具基本情況- (2) 期末發行在外的優先股、永續債等金融工具變動情況表- 42、資本公積- 43、庫存股- 44、其他綜合收益- 45、專項儲備- 46、盈余公積- 47、未分配利潤- 48、營業收入和營業成本- 49、稅金及附加- 50、管理費用- 51、銷售費用- 52、研發費用- 53、財務費用- 54、其他收益- 55、公允價值變動收益- 56、投資收益- 57、信用減值損失- 58、資產減值損失- 59、資產處置收益- 60、營業外收入- 61、營業外支出- 62、所得稅費用- (1) 所得稅費用表- (2) 會計利潤與所得稅費用調整過程- 63、現金流量表項目- (1) 與經營活動有關的現金- (2) 與投資活動有關的現金- (3) 與籌資活動有關的現金- 64、現金流量表補充資料- (1) 現金流量表補充資料- (2) 本期收到的處置子公司的現金凈額- (3) 現金和現金等價物的構成- 65、外幣貨幣性項目- (1) 外幣貨幣性項目- (2) 境外經營實體說明,包括對于重要的境外經營實體,應披露其境外主要經營地、記賬本位幣及選擇依據,記賬本位幣發生變化的還應披露原因。- 66、租賃- (1) 本公司作為承租方- (2) 本公司作為出租方- 八、研發支出- 九、合并范圍的變更- 1、同一控制下企業合并- (1) 本期發生的同一控制下企業合并- (2) 合并成本- (3) 合并日被合并方資產、負債的賬面價值- 2、處置子公司- 3、其他原因的合并范圍變動- 十、在其他主體中的權益- 1、在子公司中的權益- (1) 企業集團的構成- (2)重要的非全資子公司- (3)重要非全資子公司的主要財務信息- 2、在子公司的所有者權益份額發生變化且仍控制子公司的交易- (1)在子公司所有者權益份額發生變化的情況說明- (2)交易對于少數股東權益及歸屬于母公司所有者權益的影響- 3、在合營安排或聯營企業中的權益- (1)重要的合營企業或聯營企業- (2)重要聯營企業的主要財務信息- (3)不重要的合營企業和聯營企業的匯總財務信息- (4)合營企業或聯營企業發生的超額虧損- 十一、政府補助- 1、報告期末按應收金額確認的政府補助- 2、涉及政府補助的負債項目- 3、計入當期損益的政府補助- 十二、與金融工具相關的風險- 1、金融工具產生的各類風險- 十三、公允價值的披露- 1、以公允價值計量的資產和負債的期末公允價值- 2、持續和非持續第二層次公允價值計量項目,采用的估值技術和重要參數的定性及定量信息- 3、持續和非持續第三層次公允價值計量項目,采用的估值技術和重要參數的定性及定量信息- 4、本期內發生的估值技術變更及變更原因- 十四、關聯方及關聯交易- 1、本企業的母公司情況- 2、本企業的子公司情況- 3、本企業合營和聯營企業情況- 4、其他關聯方情況- 5、關聯交易情況- (1)購銷商品、提供和接受勞務的關聯交易- (2) 關聯租賃情況- (3) 關聯擔保情況- (4) 關聯方資金拆借- (5) 支付關聯方資金占用費及擔保費情況- (6) 關聯方資產轉讓、債務重組情況- (7) 關鍵管理人員報酬- 6、關聯方應收應付款項- (1) 應收項目- (2) 應付項目- 7、關聯方承諾- 十五、股份支付- 1、股份支付總體情況- 2、以權益結算的股份支付情況- 3、以現金結算的股份支付情況- 4、本期股份支付費用- 十六、承諾及或有事項- 1、重要承諾事項- 十七、資產負債表日后事項- 1、重要的非調整事項- 2、利潤分配情況- 十八、其他重要事項- 1、分部信息- (1) 報告分部的確定依據與會計政策- (2) 報告分部的財務信息- 十九、母公司財務報表主要項目注釋- 1、應收賬款- (1) 按賬齡披露- (2) 按壞賬計提方法分類披露- (3) 本期計提、收回或轉回的壞賬準備情況- (4) 按欠款方歸集的期末余額前五名的應收賬款和合同資產情況- 2、其他應收款- (1) 應收股利- (1) 應收股利- (1) 應收股利- (1) 應收股利- 1) 應收股利分類- (1) 應收股利- 1) 應收股利分類- (1) 應收股利- 1) 應收股利分類- (2) 其他應收款- 1) 其他應收款按款項性質分類情況- 2) 按賬齡披露- 3) 按欠款方歸集的期末余額前五名的其他應收款情況- 3、長期股權投資- (1) 對子公司投資- (2) 對聯營、合營企業投資- 4、營業收入和營業成本- 5、投資收益- 二十、補充資料- 1、當期非經常性損益明細表- 2、凈資產收益率及每股收益- 3、境內外會計準則下會計數據差異- (1) 同時按照國際會計準則與按中國會計準則披露的財務報告中凈利潤和凈資產差異情況- (2) 同時按照境外會計準則與按中國會計準則披露的財務報告中凈利潤和凈資產差異情況- (3) 境內外會計準則下會計數據差異原因說明,對已經境外審計機構審計的數據進行差異調節的,應注明該境外機構的名稱
🌟 輸出特點
- ? 完整保留層級關系
- ? 自動關聯頁碼
- ? 支持復雜編碼
🧠 五、代碼深度解析
關鍵技術點
技術點 | 實現方案 | 圖標 |
---|---|---|
遞歸處理 | DFS算法遍歷樹結構 | 🌳 |
頁面定位 | 解析Dest和NamedDest | 📑 |
編碼處理 | 三級降級策略 | 🔠 |
對象解析 | PDFObjRef解引用 | 🔗 |
流程圖
graph TDA[開始解析PDF] --> B{是否有Outlines?}B -->|是| C[解析根節點]B -->|否| D[返回空列表]C --> E[遞歸處理First/Next]E --> F[提取標題和頁碼]F --> G[生成結構化數據]
? 六、常見問題解答
Q1: 提取結果為空?
🔧 可能原因:
- PDF本身無大綱結構
- 大綱被加密
- 非常規大綱實現
Q2: 中文亂碼怎么辦?
🔄 解決方案:
- 檢查chardet檢測結果
- 嘗試添加GBK編碼
- 手動指定編碼參數
🚀 七、擴展應用場景
實用案例
- 📑 自動生成文檔目錄
- 🌐 轉換為HTML導航菜單
- 📊 文檔結構分析報表
- 🔗 與OCR結合實現智能檢索
📝 八、總結
本文介紹了使用pdfminer庫提取PDF大綱的完整方法,包括PDF解析、遞歸處理大綱結構、編碼處理和頁面定位等關鍵技術點。這種方法可以處理大多數包含大綱的PDF文檔,并保留層級結構信息。
希望這篇文章對你有所幫助!如果有任何問題,歡迎在評論區留言討論。