python:PyPDF2 从PDF中提取目录

我发现 pypdf 和 pypdf2 的作者是同一人:Mathieu Fenniak

pip install pypdf2 ;

pypdf2-3.0.1-py3-none-any.whl (232 kB)

编写 pdf_read_dir.py 如下

python 复制代码
# -*- coding: utf-8 -*-
""" pypdf2==3.0.1 从PDF中提取目录 """
import os
import sys
from PyPDF2 import PdfReader

#每个书签的索引格式
#{'/Title': '书签名', '/Page': '指向的目标页数', '/Type': '类型'}

# 查找指定的字符出现次数
def find_char(str1, char):
    cs = 0
    for c in str1:
        if c == char:
            cs += 1
    return cs
    
directory_str = ''
def bookmark_listhandler(list):
    global directory_str
    for message in list:
        if isinstance(message, dict):
            title = message['/Title'].strip()
            if title.startswith("Chapter"): 
                directory_str += '\n' + title + '\n'
            elif title[0:2] in ("序章","前言") or title.startswith("序"):
                directory_str += '\n' + title + '\n'
            elif title.startswith("第") and title.split()[0][-1] =="章":
                directory_str += '\n' + title + '\n'
            elif title.startswith("第") and title.split()[0][-1] =="节":
                directory_str += '  ' + title + '\n'
            elif title.startswith("第"):
                directory_str += '\n' + title + '\n'
            elif title[0] in ('一','二','三','四','五','六','七','八','九','十'):
                directory_str += '    ' + title + '\n'
            elif title[0] in "1234567890":
                cs = find_char(title, '.')
                directory_str += '  '*cs + title + '\n'
            else:
                directory_str += '        ' + title + '\n'
        else:
            bookmark_listhandler(message)

# main()
if len(sys.argv) ==2:
    file1 = sys.argv[1]
else:
    print('usage: python pdf_read_dir.py file.pdf')
    sys.exit(1)

if not os.path.exists(file1):
    print(f"{file1} is not exists.")
    sys.exit(2)    

fn,ext = os.path.splitext(file1)
if ext.lower() != '.pdf':
    print("Please specify a valid pdf file")
    sys.exit(3)
  
with open(file1, 'rb') as f1:
    pdf = PdfReader(f1)
    # 检索文档中存在的文本大纲,返回的对象是一个嵌套的列表
    bookmark_listhandler(pdf.outline)

if len(directory_str) >0:
    fname = fn.split('\\')[-1]
    file2 = fn + '.txt'
    with open(file2, 'w', encoding='utf-8') as fp:
        fp.write(fname +'\n')
        fp.write(directory_str)
else:
    print("it no directory.")

运行 python pdf_read_dir.py your_ebook.pdf

生成 your_ebook.txt

由于算法优劣原因,生成的结果正确性始终比不过 java : pdfbox 读取 PDF文件内书签

相关推荐
凤枭香20 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
测试杂货铺27 分钟前
外包干了2年,快要废了。。
自动化测试·软件测试·python·功能测试·测试工具·面试·职场和发展
艾派森32 分钟前
大数据分析案例-基于随机森林算法的智能手机价格预测模型
人工智能·python·随机森林·机器学习·数据挖掘
小码的头发丝、1 小时前
Django中ListView 和 DetailView类的区别
数据库·python·django
Chef_Chen2 小时前
从0开始机器学习--Day17--神经网络反向传播作业
python·神经网络·机器学习
千澜空2 小时前
celery在django项目中实现并发任务和定时任务
python·django·celery·定时任务·异步任务
斯凯利.瑞恩2 小时前
Python决策树、随机森林、朴素贝叶斯、KNN(K-最近邻居)分类分析银行拉新活动挖掘潜在贷款客户附数据代码
python·决策树·随机森林
yannan201903133 小时前
【算法】(Python)动态规划
python·算法·动态规划
蒙娜丽宁3 小时前
《Python OpenCV从菜鸟到高手》——零基础进阶,开启图像处理与计算机视觉的大门!
python·opencv·计算机视觉
光芒再现dev3 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理