用Python合并多个PDF文件,并且用原来每个PDF的文件名作为书签,且书签显示页码范围(全网首发)

 

import os
import os.path
from PyPDF2 import PdfFileReader, PdfFileWriter
import time

##########################找到 filepath 下的所有pdf,将地址返回########################
def getFileName(filepath):
    list1=[]
    for root, dirs, files in os.walk(filepath, topdown=False):
        for name in files:
            if name.endswith(".pdf"):
                list1.append(os.path.join(root, name))
    return list1

##########################合并同一个文件夹下所有PDF文件########################
def MergePDF(filepath, outfile):
    output = PdfFileWriter()
    outputPages = 0
    pdf_fileName = getFileName(filepath)
    for each_file in pdf_fileName:
        print("adding %s" % each_file)
        # 读取源pdf文件
        input = PdfFileReader(open(each_file, "rb"))

        # 如果pdf文件已经加密,必须首先解密才能使用pyPdf
        if input.isEncrypted == True:
            input.decrypt("map")

        # 获得源pdf文件中页面总数
        pageCount = input.getNumPages()
        outputPages += pageCount
        print("%s has %d pages" % (each_file, pageCount))

        # 分别将page添加到输出output中
        for iPage in range(pageCount):
            output.addPage(input.getPage(iPage))

        # 添加书签,以pdf名字命名书签,并且有书签名中带页码范围
        x=outputPages-pageCount
        output.addBookmark(
            title=each_file.split("\\")[-1]+str(x+1)+'-'+str(x+pageCount),pagenum=x)

    print("All Pages Number: " + str(outputPages))
    # 最后写pdf文件
    outputStream = open(os.path.join(filepath, outfile), "wb")
    output.write(outputStream)
    outputStream.close()
    print("finished")


if __name__ == '__main__':
    time1 = time.time()
    # 这里保存pdf文件的目录    
    file_dir =r'C:\Yodao\pdfs' 
    # 这里保存生成文件的名字
    out = u"合并结果.pdf"  #会输出到同个文件夹下
    #这个函数会遍历要求目录下的所有文件,将以  .pdf 结尾的所有pdf合并成一个新的pdf,并保存在 file_dir 目录下
    MergePDF(file_dir, out)
    time2 = time.time()
    print(u'总共耗时: %.4f s' % (time2 - time1))

  

 

合并后的PDF书签,如下:

 

posted @ 2022-08-03 10:00  uuxyz  阅读(338)  评论(0)    收藏  举报
联系我