精华内容
下载资源
问答
  • 如何给pdf制作目录
    千次阅读
    2022-02-02 18:57:41


    1. 使用 python 给 PDF 添加书签

    有时下载到扫描版的 PDF 是不带书签目录的,这样阅读起来很不方便。下面通过 python 实现一个半自动化添加书签目录的脚本。

    1.1. 安装 PyPDF2

    pip install pypdf2
    

    未避免后续运行程序报错,python 版本必须是 3.7 之前的(3.6)。

    1.2. 提取 PDF 的目录信息并保存在 txt

    这一步是比较麻烦的,需要手动实现。一般可以使用一些 OCR 文字识别工具,或者将目录页转化为 word 来操作。然后整理为如下的 txt 格式:

    • 每一行包含三项:级别 level、 标题 title、 页数 page,用空格隔开
    • 使用“.”来判断书签的级别,例如:
      • “第1章” 包含 0 个 “.” 是一级标题
      • “1.1” 包含 1 个 “.” 是二级标题
      • “1.1.1” 包含 2 个 “.” 是三级标题
      • ……(以此类推)
    • 请不要有多余的空行,title里也不要有空格

    这里是我整理后的 txt:

    第1章 绪论 1 
    1.1 本书的目的 1 
    1.2 信息融合的主要挑战 5 
    1.3 为什么需要随机集或FISST 5 
    1.3.1 多目标滤波的复杂性 6 
    1.3.2 超越启发式 7 
    1.3.3 单目标与多目标统计学的区别 7 
    1.3.4 常规数据与模糊数据的区别 7 
    1.3.5 形式化贝叶斯建模 8 
    1.3.6 模糊信息建模 8 
    1.3.7 多源多目标形式化建模 9 
    

    1.3. 编程实现

    import PyPDF2
    import sys
    
    class PdfDirGenerator:
    
        def __init__(self, pdf_path:str, txt_path:str, offset:int, out_path:str=None, levelmark:str='.'):
            
            self.pdf_path = pdf_path    # pdf路径
            self.txt_path = txt_path    # 包含pdf目录信息的txt
            self.offset = offset        # 目录页数偏移量
            self.out_path = out_path    # 输出路径
            self.levelmark = levelmark  # 用于判断书签级别的标志符
        
              
            self.dir_parent = [None]    
    
        def getLevelId(self, level):
            """计算书签的级数(级数的标志符号为“.”)
            一级目录: 0 个“.”,例如: 第1章、附录A等
                二级目录: 1个“.”,例如: 1.1、A.1
                    三级目录: 2个“.”,例如: 2.1.3
            """
            mark_num = 0
            for c in level:
                if c == self.levelmark:
                    mark_num += 1
            return mark_num + 1
    
        def run(self):
            
            print("--------------------------- Adding the bookmark ---------------------------")
            print(" * PDF Source: %s" % self.pdf_path)
            print(" * TXT Source: %s" % self.txt_path)
            print(" * Offset: %d" % self.offset)
            print("---------------------------------------------------------------------------")
            with open(self.txt_path, 'r', encoding='utf-8') as txt:
                
                pdf_reader = PyPDF2.PdfFileReader(self.pdf_path)
                pdf_writer = PyPDF2.PdfFileWriter()
                
                pdf_writer.cloneDocumentFromReader(pdf_reader)
                # BUG: ValueError: {’/Type’: ‘/Outlines’, ‘/Count’: 0} is not in list
                # 修改代码 ${PYTHON_PATH}/site-packages/PyPDF2/pdf.py): getOutlineRoot 函数
                # 参考:https://www.codetd.com/en/article/11823498
    
                lines = txt.readlines()
                num_all_lines = len(lines)
                for i, line in enumerate(lines):
                    # pline = line.split(' ') # 要求level title page之间只能有一个空格且不能是\t, 比较麻烦换成下面这个
                    pline = line.split(None, maxsplit=-1) # python 3.6.13, 支持删除\t\n 空格, 且不限次数
                    level = pline[0]; title = pline[1]; page = int(pline[2]) + self.offset
    
                    # 1. 计算当前的 level 的级数 id
                    # 2. 当前书签的父结点存放在 dir_parent[id-1] 上
                    # 3. 更新/插入 dir_parent[id] 
                    id = self.getLevelId(level)
                    if id >= len(self.dir_parent):
                        self.dir_parent.append(None)
                    self.dir_parent[id] = pdf_writer.addBookmark(level+' '+title, page-1, self.dir_parent[id-1])
                    
                    print(" * [%d/%d finished] level: %s(%d), title: %s, page: %d" % (i+1, num_all_lines, level, id, title, page))
                
                if self.out_path is None:
                    self.out_path = self.pdf_path[:-4] + '(书签).pdf'
                with open(self.out_path, 'wb') as out_pdf:
                    pdf_writer.write(out_pdf)
                    print("---------------------------------------------------------------------------")
                    print(" * Save: %s" % self.out_path)
                    print("---------------------------------- Done! ----------------------------------")
    
    if __name__ == '__main__':
        
        input_num = len(sys.argv)
        assert(input_num > 3)
        
        opath = None
        if input_num > 4:
            opath = sys.argv[4]
    
        mark='.'
        if input_num > 5:
            mark = sys.argv[5]
    
        pdg = PdfDirGenerator(
            pdf_path=sys.argv[1],
            txt_path=sys.argv[2],
            offset=int(sys.argv[3]), # 一般是目录结束页的页数
            out_path=opath,
            levelmark=mark
        )
    
        pdg.run()
    

    上述代码保存在 PdfDirGenerator.py中,其中有3个参数和2个可选参数:

    • 第1个参数:待插入书签的 PDF 的路径
    • 第2个参数:包含目录信息的 txt 的路径
    • 第3个参数:正文内容的偏移页数(一般填目录结束页的页数)
    • 第4个参数(可选):输出路径
    • 第5个参数(可选):级数标志,默认为“.”

    例如,在命令行中输入:

    python .\PdfDirGenerator.py .\多源多目标统计信息融合Mahler.pdf .\dir.txt 27
    

    运行效果:

    在这里插入图片描述

    1.4. 可能遇到的错误

    这里主要参考 https://www.codetd.com/en/article/11823498

    1.4.1. 问题一:ValueError: {’/Type’: ‘/Outlines’, ‘/Count’: 0} is not in list

    如果 PDF 之前被其他软件修改过,可能会有如下错误:

    Traceback (most recent call last):
      File ".\PDFbookmark.py", line 70, in <module>
        print(addBookmark(args[1], args[2], int(args[3])))
      File ".\PDFbookmark.py", line 55, in addBookmark
        new_bookmark = writer.addBookmark(title, page + page_offset, parent=parent)
      File "C:\Anaconda3\lib\site-packages\PyPDF2\pdf.py", line 732, in addBookmark
        outlineRef = self.getOutlineRoot()
      File "C:\Anaconda3\lib\site-packages\PyPDF2\pdf.py", line 607, in getOutlineRoot
        idnum = self._objects.index(outline) + 1
    ValueError: {
        
        '/Type': '/Outlines', '/Count': 0} is not in list
    

    解决方法:修改 pdf.pygetOutlineRoot() 函数(pdf.py 的路径为 ${PYTHON_PATH}/site-packages/PyPDF2/pdf.py

    def getOutlineRoot(self):
        if '/Outlines' in self._root_object:
            outline = self._root_object['/Outlines']
            try:
                idnum = self._objects.index(outline) + 1
            except ValueError:
                if not isinstance(outline, TreeObject):
                    def _walk(node):
                        node.__class__ = TreeObject
                        for child in node.children():
                            _walk(child)
                    _walk(outline)
                outlineRef = self._addObject(outline)
                self._addObject(outlineRef.getObject())
                self._root_object[NameObject('/Outlines')] = outlineRef
                idnum = self._objects.index(outline) + 1
            outlineRef = IndirectObject(idnum, 0, self)
            assert outlineRef.getObject() == outline
        else:
            outline = TreeObject()
            outline.update({ })
            outlineRef = self._addObject(outline)
            self._root_object[NameObject('/Outlines')] = outlineRef
    
        return outline
    

    1.4.2. 问题二:RuntimeError: generator raised StopIteration

    如果在你做了上面的修改后,在运行脚本时报错:untimeError: generator raised StopIteration,请检查使用 Python 版本是不是 3.7或者更高版本(从版本v3.7之后,Python终止迭代过程发生了变化,细节可以参考PEP 479)。为避免报错,请使用低于3.7版本的 python,例如 3.6 版本。

    1.5. 代码下载

    1.6. 参考

    更多相关内容
  • PDF目录制作目录提取,目录自动生成,使用于制作标书的神器
  • 下载一些pdf格式的电子书没有书签,用JAVA写了一个小工具,将特定格式的文本解析成为书签,然后保存到pdf格式中
  • 书剑PDF电子书制作专家是一款功能强大的PDF目录制作及合并转换工具,具有批量制作PDF目录、合并多个PDF并自动生成目录PDF编辑、PDF转图片、图片转PDFPDF转WORD、PDF添加水印、PDF加密、PDF拆分等功能。
  • PDF目录制作及合并加密软件(EBPdf)是一款非常实用、便捷的PDF文件目录制作工具,能批量为PDF文件添加目录,并且还具有合并多个PDF文件并自动生成目录PDF文件加密、PDF文件拆分等功能,所有的操作均非常简单,只要...
  • PDF目录制作工具

    2012-11-30 17:44:02
    PDF目录制作工具 本人自制PDF目录用的,也贡献大家使用
  • 有的PDF文件比较长,如果有一个目录来进行阅读则会方便很多,普通方式制作PDF文件目录比较麻烦,特别是已经发布好的PDF文件,再要制作目录就更麻烦。推荐一款文件汇编电子书制作利器-友益文书软件来制作PDF文件的...

    图文并茂教你怎么制作pdf文件的目录?

    友益文书

    图文并茂教你怎么制作pdf文件的目录?

    有的PDF文件比较长,如果有一个目录来进行阅读则会方便很多,普通方式制作PDF文件目录比较麻烦,特别是已经发布好的PDF文件,再要制作目录就更麻烦。推荐一款文件汇编电子书制作利器-友益文书软件来制作PDF文件的目录,非常方便。

    一、先下载友益文书软件并安装,启动软件,点批量导入按钮,点导入文档按钮,选择PDF文件导入。

     

     

    二、在目录框点右键,可视化添加目录,添加时可以勾上页码联动,这样可拉动右侧PDF文件时,页码自动联动。输入目录名及页码后点添加。

     

     

    三、目录属性中设置第30项打开电子书时目录自动展开,这要方便阅读。

     

    四、发布文件。发布前可点保存按钮,以便后面再编辑修改,发布的文件不可编缉,发布的文件集成了pDf阅读器,不需要安装外部pDf阅读器。

     

     

    学会了吗?是不是简单方便。

    展开全文
  • 利用工具,较为简单的制作电子书的目录;前提是电子书相较于指示书没有插入额外的页面。
  • 如何使用python 给PDF生成目录

    千次阅读 2021-01-20 10:17:33
    如何使用python 给PDF生成目录 主要步骤: 步骤1. 准备目录的txt,如果PDF是图片无法复制出来,可以使用qq图文识别提取目录内容。 目录txt 格式: 关于QQ图片文字提取: (1)利用qq聊天框中的屏幕识图 (2)转为...

    如何使用python 给PDF生成目录

    主要步骤:
    步骤1.
    准备目录的txt,如果PDF是图片无法复制出来,可以使用qq图文识别提取目录内容。
    目录txt 格式:
    在这里插入图片描述
    关于QQ图片文字提取:
    (1)利用qq聊天框中的屏幕识图
    (2)转为在线文档
    在这里插入图片描述
    (3)复制目录内容生成一个txt 文件
    把页面前面的点去掉
    在这里插入图片描述
    步骤2
    执行python 脚本生成目录,会生成一个原文件名-new的PDF文件

    
    
    import re
    import sys
    
    from distutils.version import LooseVersion
    from os.path import exists, splitext
    from PyPDF2 import PdfFileReader, PdfFileWriter
    
    
    is_python2 = LooseVersion(sys.version) < '3'
    
    
    def _get_parent_bookmark(current_indent, history_indent, bookmarks):
        '''The parent of A is the nearest bookmark whose indent is smaller than A's
        '''
        assert len(history_indent) == len(bookmarks)
        if current_indent == 0:
            return None
        for i in range(len(history_indent) - 1, -1, -1):
            # len(history_indent) - 1   ===>   0
            if history_indent[i] < current_indent:
                return bookmarks[i]
        return None
    
    def addBookmark(pdf_path, bookmark_txt_path, page_offset):
        if not exists(pdf_path):
            return "Error: No such file: {}".format(pdf_path)
        if not exists(bookmark_txt_path):
            return "Error: No such file: {}".format(bookmark_txt_path)
    
        # with open(bookmark_txt_path, 'r', encoding='utf-8') as f:
        with open(bookmark_txt_path, 'r', encoding='gbk') as f:
            bookmark_lines = f.readlines()
        reader = PdfFileReader(pdf_path)
        writer = PdfFileWriter()
        writer.cloneDocumentFromReader(reader)
    
        maxPages = reader.getNumPages()
        bookmarks, history_indent = [], []
        # decide the level of each bookmark according to the relative indent size in each line
        #   no indent:          level 1
        #     small indent:     level 2
        #       larger indent:  level 3
        #   ...
        for line in bookmark_lines:
            line2 = re.split(r'\s+', unicode(line.strip(), 'utf-8')) if is_python2 else re.split(r'\s+', line.strip())
            if len(line2) == 1:
                continue
    
            indent_size = len(line) - len(line.lstrip())
            parent = _get_parent_bookmark(indent_size, history_indent, bookmarks)
            history_indent.append(indent_size)
            title, page = ' '.join(line2[:-1]), int(line2[-1]) - 1
            if page + page_offset >= maxPages:
                return "Error: page index out of range: %d >= %d" % (page + page_offset, maxPages)
            new_bookmark = writer.addBookmark(title, page + page_offset, parent=parent)
            bookmarks.append(new_bookmark)
    
        out_path = splitext(pdf_path)[0] + '-new.pdf'
        with open(out_path,'wb') as f:
            writer.write(f)
    
        return "The bookmarks have been added to %s" % out_path
    
    if __name__ == "__main__":
        import sys
        args = sys.argv
        print(args)
        pdf_path='./Hive.pdf'
        bookmark_txt_path='./format.txt'
        page_offset=22
        addBookmark(pdf_path,bookmark_txt_path,page_offset)
    

    生成新的带目录的pdf 文件
    在这里插入图片描述

    参考https://www.zhihu.com/question/344805337/answer/819338479

    展开全文
  • 重要知识WORD目录制作.pdf
  • PDF批量目录生成器(ePDF)是一款非常实用、便捷的PDF文件目录制作工具,具有一键批量生成PDF文件目录、合并多个PDF文件并自动生成目录PDF文件加密、PDF文件拆分等功能。
  • 大家好啊,今天小编教大家如何在Mac系统中给PDF文档添加目录?mac系统中有一篇pdf需要编辑,该怎么办呢?今天我们就来看看那mac系统中gdf文档添加目录的教程,需要的朋友可以参考下。记得收藏哦。 Acrobat Pro DC ...

    大家好啊,今天小编教大家如何在Mac系统中给PDF文档添加目录?mac系统中有一篇pdf需要编辑,该怎么办呢?今天我们就来看看那mac系统中gdf文档添加目录的教程,需要的朋友可以参考下。记得收藏哦。

    Acrobat Pro DC 2020 for Mac(全能PDF工具)下载

    多页的pdf文件,左侧展示一列目录,点击之后,右边对应展示相应的页面。

    1、打开mac电脑上面的Acrobat软件,这是一款专业的pdf编辑软件。这款软件的功能有:给pdf添加目录,提取单页的pdf,合并多页的pdf,删除单页的pdf。

    2、打开pdf,看一下缩略图效果:点击pdf的缩略图按钮,即可显示多页面的缩略图。效果如下:

    3、pdf的目录,其实就是书签:点击pdf的书签缩略图按钮,即可显示添加书签的按钮。效果如下:


    4、先创建一个目录:点击新建书签按钮,即可添加书签。双击书签,即可对其进行重命名。效果如下:

    5、下面建立书签目录:多次点击新建书签,把书签名字改成目录名字。效果如下:

    6、下面给书签建立超链接:选择一个书签,单机鼠标右键,下拉列表中,选择设置目标

    7、***出菜单:确定将选择书签的目标设置为当前位置吗? 选择确定即可。这时候相当于点击书签,即可跳转到目标位置的页面。


    8、将所有书签目录,都设置目标到对应的页面。即可实现pdf目录的添加效果。


    以上就是本期的所有内容,希望对您有所帮助。想了解更多有关Mac软件知识请关注:mac.orsoon.com

    展开全文
  • 如何给pdf添加目录

    千次阅读 2021-12-12 10:51:50
    如何给pdf添加目录下载FreePic2pdf软件压缩包修改FreePic2Pdf.itf文件手动制作目录 下载FreePic2pdf软件压缩包 下载FreePic2pdf软件压缩包。链接: 点击这里可以获取. 提取码:(6666) 修改FreePic2Pdf.itf文件 下载...
  • 网页设计与制作-1期 目录.pdf 学习资料 复习资料 教学资源
  • 资料目录制作教学设计.pdf
  • 我们在阅读纸质书籍时前几页都有目录可以查看,而PDF格式的电子书也同样有目录可快速查看,一般是显示在PDF文档的左侧,那么这种目录要如何制作呢? 首先用极速PDF编辑器打卡PDF文档后,首先选择上方工具栏中的...
  • CorelDraw制表位制作图书目录借鉴.pdf
  • 福昕阅读器给pdf创建目录方法

    千次阅读 2021-03-01 22:34:05
    将需要定位的标题放置在页面顶部(此种目录创建方式是针对页面的 所以需要放置顶部) 创建书签名
  • 快速给PDF批量添加目录

    千次阅读 2020-03-01 16:52:35
    这次这篇博客主要是分享一些方法来快速为PDF制作目录标签。 一、工具准备 1、下载工具FreePic2Pdf (1)我们获取目录文件和添加目录都得用这个 (2)下载途径:网上百度,有很多 2、下载ABBYY finereader(很有名的一...
  • wps制作pdf文档的详细方法

    千次阅读 2020-12-19 21:32:48
    一些用户在使用wps软件的时候,wps怎样制作pdf文档?你们知道怎么操作的吗?对此感兴趣的伙伴们可以去下文看看wps制作pdf文档的详细方法。wps制作pdf文档的详细方法一、打开或生成原始文件本文选择用WPS打开《岳飞传....
  • FreePic2Pdf图片转PDF最好用(可制作目录,已附带目录模板txt,可自行修改为自己的目录导入)
  • 手把手教你制作目录的kindle电子书实用.pdf
  • 手把手教你制作目录的kindle电子书归纳.pdf
  • Calibre电子书forKindle精较目录制作教程借鉴.pdf
  • Calibre电子书forKindle精较目录制作教程参照.pdf
  • 手把手教你制作目录的kindle电子书借鉴.pdf
  • PDF电子书制作书签目录全过程

    千次阅读 2019-12-05 18:52:12
    PDF电子书制作书签目录所需软件FreePic2PdfNotepad++实现思路第一步 从PDF中取出目录第二步 匹配目录格式第三步 把书签目录存入PDF文件中功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与...
  • Calibre电子书forKindle精较目录制作教程宣贯.pdf
  • pdf目录制作和修改

    2010-11-14 17:03:18
    如果你用foxit 或其他阅读软件打开pdf时 总是遇到目录全部展开的情况的话,这个软件将是你想要的 可以快速的讲目录设置为默认不打开等等属性。 操作方便 鼠标点击 几下即可

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,860
精华内容 8,344
热门标签
关键字:

如何给pdf制作目录

友情链接: WindowsGame.rar