目录提取,删除,添加

目前有两个问题,一般的目录文本格式有问题,需要用正则化方式,生成比较好的目录文件,比如csv格式,txt格式

另外,生成的目录,层级只有一级

提取目录


import fitz  # PyMuPDF
import pandas as pd

# 打开PDF文件
pdf_path = '力学概论.pdf'  # 请确保替换为正确的文件路径
document = fitz.open(pdf_path)

# 初始化一个列表来存储目录信息
toc_list = []

# 提取目录信息的函数
def extract_toc(toc, level=0):
    for item in toc:
        # 确保目录项至少包含标题
        if len(item) > 1 and item[1]:
            title = item[1]
            # 检查标题的首字符
            if title[0].isdigit():
                title_level = 2
            else:
                title_level = 1
            # 确保页码是数字类型
            page = item[2] if len(item) > 2 and isinstance(item[2], int) else None
            if page is not None:
                # 添加条目到列表
                toc_list.append({
                    'Title': title,
                    'Page': page,
                    'Level': level + title_level
                })
            # 如果有子条目,递归提取
            if len(item) > 3 and item[3]:  # 子条目在索引3
                extract_toc(item[3], level)

# 获取PDF的目录
toc = document.get_toc(simple=False)

# 提取目录信息
extract_toc(toc)

# 关闭PDF文件
document.close()

# 将列表转换为DataFrame
toc_df = pd.DataFrame(toc_list)

# 将DataFrame输出到CSV文件
toc_df.to_csv('output.csv', index=False, encoding='utf-8')



删除目录

import PyPDF2

def remove_bookmarks(input_pdf_path, output_pdf_path):
    # 打开原始的PDF文件
    with open(input_pdf_path, 'rb') as file:
        reader = PyPDF2.PdfFileReader(file)
        writer = PyPDF2.PdfFileWriter()

        # 将每一页复制到新的PDF文件中,不包括书签
        for page_num in range(reader.numPages):
            page = reader.getPage(page_num)
            writer.addPage(page)

        # 将没有书签的PDF写入新文件
        with open(output_pdf_path, 'wb') as output_file:
            writer.write(output_file)

# 使用函数删除书签
remove_bookmarks('力学概论.pdf', '力学概论-无目录.pdf')
print("Book marks removed successfully.")


制作目录

有时候把 gbk 改成 utf-8



import pypdf

# 输入和输出文件名
input_pdf_filename = '力学概论-无目录.pdf'
output_pdf_filename = 'file_with_toc.pdf'
csv_filename = 'output.csv'

# 创建一个PdfWriter实例
writer = pypdf.PdfWriter()

# 读取原始PDF文件
with open(input_pdf_filename, "rb") as input_pdf:
    reader = pypdf.PdfReader(input_pdf)
    writer.append_pages_from_reader(reader)

# 读取CSV文件并创建书签
bookmarks = []  # 用于维护书签层级结构
toc_entries = []  # 用于存储书签信息

# 读取CSV文件内容
with open(csv_filename, 'r', encoding='GBK') as csv_file:
    next(csv_file)  # 忽略第一行
    for line in csv_file:
        title, page_number,hierarchy= line.strip().split(',')
        page_number = int(page_number)-1
        # 根据父子层级关系确定层级数值
        level = hierarchy.count('.') + 1
        toc_entries.append((level, page_number, title))

# 按CSV文件中的顺序,一行行添加书签并确保层级正确
for entry in toc_entries:
    level, page_number, title = entry

    # 根据层级确定父书签
    parent_bookmark = None
    if level > 1:
        # 从当前层级的上一层级开始查找父书签
        for i in range(level - 1, 0, -1):
            try:
                parent_bookmark = next(b for b in bookmarks if b.level == i)
                break
            except StopIteration:
                continue
    else:
        parent_bookmark = None

    # 添加书签
    bookmark = writer.add_outline_item(title=title, page_number=page_number, parent=parent_bookmark)
    bookmark.level = level
    bookmarks.append(bookmark)  # 添加到书签列表

# 写入新的PDF文件
with open(output_pdf_filename, "wb") as output_pdf:
    writer.write(output_pdf)

# 完成后关闭
writer.close()

效果图

原书目录

image

删除目录后的图没放

添加目录:

image

posted @ 2024-11-03 17:00  redufa  阅读(79)  评论(0)    收藏  举报