• Typora导出的PDF目录标题自动加编号


    点击上方“Python爬虫与数据挖掘”,进行关注

    回复“书籍”即可获赠Python从入门到进阶共10本电子书

    今当远离,临表涕零,不知所言。

    Typora导出的PDF目录标题自动加编号

    Typora主题文件夹增加如下文件后,标题便自动加上了编号:

    https://gitcode.net/as604049322/blog_data/-/blob/master/base.user.css

    例如:

    b04cfa43035ff3978ad1101e6e685a8d.png

    但是导出的PDF中,目录却没有编号:

    f560b54b491b1a73c0ba2fc2db07c567.png

    这是我使用Python处理该文件,使其具有编号,完整代码如下:

    1. # 博客地址:https://blog.csdn.net/as604049322
    2. __author__ = '小小明-代码实体'
    3. __date__ = '2023/8/31'
    4. from PyPDF2 import PdfReader, PdfWriter
    5. def get_pdf_Bookmark(filename):
    6.     "作者CSDN:https://blog.csdn.net/as604049322"
    7.     if isinstance(filename, str):
    8.         pdf_reader = PdfReader(filename)
    9.     else:
    10.         pdf_reader = filename
    11.     pagecount = len(pdf_reader.pages)
    12.     # 用保存每个标题id所对应的页码
    13.     idnum2pagenum = {}
    14.     for i in range(pagecount):
    15.         page = pdf_reader.pages[i]
    16.         idnum2pagenum[page.indirect_ref.idnum] = i
    17.     # 保存每个标题对应的标签数据,包括层级,标题和页码索引(页码-1
    18.     bookmark = []
    19.     def get_pdf_Bookmark_inter(outlines, tab=0):
    20.         for outline in outlines:
    21.             if isinstance(outline, list):
    22.                 get_pdf_Bookmark_inter(outline, tab + 1)
    23.             else:
    24.                 bookmark.append(
    25.                     (tab, outline['/Title'], idnum2pagenum[outline.page.idnum]))
    26.     get_pdf_Bookmark_inter(pdf_reader.outline)
    27.     return bookmark
    28. def pdf_write_bookmark(bookmark, pdf_file, compress=True):
    29.     pdf_reader = PdfReader(pdf_file)
    30.     num_pages = len(pdf_reader.pages)
    31.     pdf_writer = PdfWriter()
    32.     for page in pdf_reader.pages:
    33.         if compress:
    34.             page.compress_content_streams()
    35.         pdf_writer.add_page(page)
    36.     # pdf_reader.
    37.     last_cache = [None] * (max(bookmark, key=lambda x: x[0])[0] + 1)
    38.     for tab, title, pagenum in bookmark:
    39.         if pagenum >= num_pages:
    40.             continue
    41.         parent = last_cache[tab - 1if tab > 0 else None
    42.         indirect_id = pdf_writer.add_outline_item(title, pagenum, parent=parent)
    43.         last_cache[tab] = indirect_id
    44.     pdf_writer.page_mode = "/UseOutlines"
    45.     with open(pdf_file, "wb") as out:
    46.         pdf_writer.write(out)
    47.     print("已成功将书签写入到", pdf_file)
    48. if __name__ == '__main__':
    49.     file = r"C:\Users\sj\Desktop\集团管理层培训.pdf"
    50.     bookmark = get_pdf_Bookmark(file)
    51.     num_cache = [0] * 7
    52.     last_tab = 0
    53.     new_bookmark = []
    54.     for tab, title, pagenum in bookmark:
    55.         if tab > last_tab:
    56.             num_cache[tab] = 1
    57.         else:
    58.             num_cache[tab] += 1
    59.         new_title = title
    60.         if not title[0].isdigit():
    61.             new_title = ".".join(map(str, num_cache[:tab + 1])) + " " + title
    62.         # print(tab, new_title, pagenum)
    63.         new_bookmark.append((tab, new_title, pagenum))
    64.         last_tab = tab
    65.     pdf_write_bookmark(new_bookmark, file)

    处理后的PDF目录就有编号了:

    f4e7914e0e8e9913b6a9e2c8e50f1795.png

    小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

    4a943fe9cbce1bf44d875fdfad75baea.jpeg

    ------------------- End -------------------

    往期精彩文章推荐:

    690fc8862afaf0d18cba16bd314e7f12.png

    欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

    想加入Python学习群请在后台回复【入群

    万水千山总是情,点个【在看】行不行

    /今日留言主题/

    随便说一两句吧~~

  • 相关阅读:
    java中常用的集合
    NET 3行代码实现文字转语音功能
    JVM 访问对象的两种方式
    唐诗的四个阶段
    【FreeRTOS】04 FreeRTOS 创建任务相关API函数
    如何用Python敲出樱花开放(附零基础学习资料)
    2023山东科技大学计算机考研信息汇总
    armv8单独编译Qt的串口模块
    布隆过滤器
    UML统一建模语言(UML类图)
  • 原文地址:https://blog.csdn.net/pdcfighting/article/details/133003374