• 使用Python批量合并PDF文件(带书签功能)


    网上找了几个合并pdf的软件,发现不是很好用,一般都没有添加书签的功能。

    又去找了下python合并pdf的脚本,发现也没有添加书签的功能的。

    于是自己动手编写了一个小工具,使用了PyPDF2。

    下面是使用的截图:

    代码如下: 

     1 #!/usr/bin/env python3
     2 # -*- coding: utf-8 -*-
     3 '''
     4    #文件名:pdfmerge.py
     5    本脚本用来合并pdf文件,输出的pdf文件按输入的pdf文件名生成书签
     6    使用示例如下:
     7    python pdfmerge.py -p "D:pdf-files" -o "merged-out.pdf" -b True'
     8 
     9    示例说明:
    10    要合并的pdf文件所在的路径: D:pdf-files
    11    合并后的pdf文件的输出文件名:merged-out.pdf
    12    是否从pdf文件中导入书签的值:True
    13 '''
    14 import os, sys, codecs
    15 from argparse import ArgumentParser, RawTextHelpFormatter
    16 from PyPDF2 import PdfFileReader, PdfFileWriter, PdfFileMerger
    17 
    18 def getfilenames(filepath='',filelist_out=[],file_ext='all'):
    19     # 遍历filepath下的所有文件,包括子目录下的文件
    20     for fpath, dirs, fs in os.walk(filepath):
    21         for f in fs:
    22             fi_d = os.path.join(fpath, f)
    23             if  file_ext == 'all':
    24                 filelist_out.append(fi_d)
    25             elif os.path.splitext(fi_d)[1] == file_ext:
    26                 filelist_out.append(fi_d)
    27             else:
    28                 pass
    29     return filelist_out
    30 
    31 def mergefiles(path, output_filename, import_bookmarks=False):
    32     # 遍历目录下的所有pdf将其合并输出到一个pdf文件中,输出的pdf文件默认带书签,书签名为之前的文件名
    33     # 默认情况下原始文件的书签不会导入,使用import_bookmarks=True可以将原文件所带的书签也导入到输出的pdf文件中
    34     merger = PdfFileMerger()
    35     filelist = getfilenames(filepath=path, file_ext='.pdf')
    36     if len(filelist) == 0:
    37         print("当前目录及子目录下不存在pdf文件")
    38         sys.exit()
    39     for filename in filelist:
    40         f = codecs.open(filename, 'rb')
    41         file_rd = PdfFileReader(f)
    42         short_filename = os.path.basename(os.path.splitext(filename)[0])
    43         if file_rd.isEncrypted == True:
    44             print('不支持的加密文件:%s'%(filename))
    45             continue
    46         merger.append(file_rd, bookmark=short_filename, import_bookmarks=import_bookmarks)
    47         print('合并文件:%s'%(filename))
    48         f.close()
    49     out_filename=os.path.join(os.path.abspath(path), output_filename)
    50     merger.write(out_filename)
    51     print('合并后的输出文件:%s'%(out_filename))
    52     merger.close()
    53 
    54 if __name__ == "__main__":
    55     description="
    本脚本用来合并pdf文件,输出的pdf文件按输入的pdf文件名生成书签
    使用示例如下:"
    56     description=description+'
    python pdfmerge.py -p "D:pdf-files" -o "merged-out.pdf" -b True'
    57     description=description+'
    
    '+"示例说明:"
    58     description=description+'
    '+"要合并的pdf文件所在的路径: D:pdf-files"
    59     description=description+'
    '+"合并后的pdf文件的输出文件名:merged-out.pdf"
    60     description=description+'
    '+"是否从pdf文件中导入书签的值:True"
    61 
    62     # 添加程序帮助,程序帮助支持换行符号
    63     parser = ArgumentParser(description=description, formatter_class=RawTextHelpFormatter)
    64 
    65     # 添加命令行选项
    66 
    67     parser.add_argument("-p", "--path",
    68                         dest="path",
    69                         default=".",
    70                         help="PDF文件所在目录")
    71     parser.add_argument("-o", "--output",
    72                         dest="output_filename",
    73                         default="merged.pdf",
    74                         help="合并PDF的输出文件名",
    75                         metavar="FILE")
    76     parser.add_argument("-b", "--bookmark",
    77                     dest="import_bookmarks",
    78                     default="False",
    79                     help="是否从pdf文件中导入书签,值可以是'True'或者'False'")
    80 
    81     args = parser.parse_args()
    82     #try:
    83     mergefiles(args.path, args.output_filename, args.import_bookmarks)
    84     #except:
    85     #    print('Error to merge pdf file:')
    86     #    print(sys.exc_info()[0],sys.exc_info()[1])
    87         

    说明:在实际使用过程中,发现因为字符编码问题,部分pdf文件会报错,导致代码无法正常执行。

  • 相关阅读:
    GitHub统计
    不错的第三方控件
    仿射变换(CGAffineTransform)使用小结
    AffineTransform(仿射变换)
    使用CAShapeLayer实现复杂的View的遮罩效果
    使用CAShapeLayer实现一个音量大小动态改变的控件
    window10 Docker仓库访问
    postgresql从timestamp(6)复制到timestamp(0),时间会变
    在编译Dll文件的时候遇到dll 链接不一致的问题
    qtquery 取列的值
  • 原文地址:https://www.cnblogs.com/weiqi/p/8207236.html
Copyright © 2020-2023  润新知