🔍 一、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文档,并保留层级结构信息。
希望这篇文章对你有所帮助!如果有任何问题,欢迎在评论区留言讨论。