使用python合并pdf文件带书签

1、需求:

将几本纸质书进行了扫描,可是扫描的每页生成一个pdf文件。需要怎么才能把这些pdf文件合成一个呢?adoba acrobat工具支持,可是收费。我们平时用的都是adoba reader,只有读pdf的功能没有合并等高级功能。网上的一些免费工具又担心有病毒或绑定程序。

所以考虑看看pyton实现。网上找了下python合并pdf的脚本,发现也没有添加书签的功能的,有添加书签的也不是很灵活。

所有对网上找的一个python程序进行了升级,可以实现合并pdf并每个章节加入书签。

文件准备:

先将扫描的pdf文件,每一章放到一个文件夹中,文件夹名字用章节名命名。这样最终程序就能将章节名作为书签了,而不是默认将每页都生成书签。

2、程序代码

代码运行环境:python3

需要安装PyPDF2包:pip install PyPDF2

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

'''
   本脚本用来合并pdf文件,支持带一级子目录的
   每章内容分别放在不同的目录下,目录名为章节名
   最终生成的pdf,按章节名生成书签
'''



import os, sys, codecs
from PyPDF2 import PdfFileReader, PdfFileWriter, PdfFileMerger
import glob


def getFileName(filepath):
   
'''
       
获取当前目录下的所有pdf文件
    '''
   
file_list = glob.glob(filepath+"/*.pdf")
   
# 默认安装字典序排序,也可以安装自定义的方式排序
    # file_list.sort()
   
return file_list


def get_dirs(filepath='', dirlist_out=[], dirpathlist_out=[]):
   
# 遍历filepath下的所有目录
   
for dir in os.listdir(filepath):
        dirpathlist_out.append(filepath +
'\\' + dir)

   
return dirpathlist_out


def merge_childdir_files(path):
   
'''
       
每个子目录下合并生成一个pdf
    '''
   
dirpathlist = get_dirs(path)
   
if len(dirpathlist) == 0:
       
print("当前目录不存在子目录")
        sys.exit()
   
for dir in dirpathlist:
        mergefiles(dir
, dir)


def mergefiles(path, output_filename, import_bookmarks=False):
   
# 遍历目录下的所有pdf将其合并输出到一个pdf文件中,输出的pdf文件默认带书签,书签名为之前的文件名
    # 默认情况下原始文件的书签不会导入,使用import_bookmarks=True可以将原文件所带的书签也导入到输出的pdf文件中
   
merger = PdfFileMerger()
    filelist = getFileName(path)
   
if len(filelist) == 0:
       
print("当前目录及子目录下不存在pdf文件")
        sys.exit()
   
for filename in filelist:
        f = codecs.open(filename
, 'rb')
        file_rd = PdfFileReader(f)
        short_filename = os.path.basename(os.path.splitext(filename)[
0])
       
if file_rd.isEncrypted == True:
           
print('不支持的加密文件:%s'%(filename))
           
continue
       
merger.append(file_rd, bookmark=short_filename, import_bookmarks=import_bookmarks)
       
print('合并文件:%s'%(filename))
        f.close()
   
# out_filename = os.path.join(os.path.abspath(path), output_filename)
   
merger.write(output_filename + ".pdf")
   
print('合并后的输出文件:%s'%(output_filename))
    merger.close()



if __name__ == "__main__":
   
# 每个章节一个子目录,先分别合并每个子目录文件为一个pdf,然后再将这些pdf合并为一个大的pdf,这样做目的是想生成每个章节的书签

    # 1.指定目录
    # 原始pdf所在目录
   
path = "D:\spdf"
   
# 输出pdf路径和文件名
   
output_filename = "D:\spdf\战略规划 公司实现持续成功的方法、工具和实践  罗熙昶 2018-09"

   
# 2.生成子目录的pdf
    # merge_childdir_files(path)

    # 3.子目录pdf合并为总的pdf
   
mergefiles(path, output_filename)

 

 

3、程序使用

将要生成的pdf文件目录导入到程序指定目录下,例如我程序中的path是“D:\spdf”,然后指定最终输出的文件路径及文件名,我上面的output_filename是"D:\spdf\战略规划 公司实现持续成功的方法、工具和实践  罗熙昶 2018-09"

数据结果如下:

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值