上篇文章《批量保存SolvNet文章》中使用Python模擬滑鼠鍵盤,批量下載了1300多篇solvnet的文章,並分別保存為pdf格式。這些零散的pdf文件不方便搜索。因此想到了使用軟體將這些pdf合併為一個大的PDF文件。
因為之前見過有軟體可以將多個PDF文件合併,所以有了上面的想法後,就baidu/google/360上搜軟體。下載試用了多個PDF合併軟體,最後發現都需要辦理VIP才能使用完整的PDF合併功能。另外,一些在線的PDF合併網站也可以免費完成這項工作,但考慮到這些文件的安全問題,並沒有使用。最後,發現一個臺灣網站可以在線合併PDF,也可以使用他們的軟體合併PDF。軟體的名字叫cleaverPDF。軟體使用很方便,但也不是完全沒有限制。它會限制每個PDF文件的頁面數,頁面數大於10頁的PDF是不會幫合併的。如下圖:
合併完所有的PDF後,發現也就大概有10篇文章超過了10頁以上,所以整體上影響並不大。
今天,突然想起來:Python是不是也可以做這個工作? 百度發現有多篇文章就是專門解決這個問題的,其中有一篇文章還把每個PDF文件的名字設置為書籤。文章網址如下:
http://www.cnblogs.com/weiqi/p/8207236.html
原文中還附帶有腳本,完整腳本如下:
1
2
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'''
14import os, sys, codecs
15from argparse import ArgumentParser, RawTextHelpFormatter
16from PyPDF2 import PdfFileReader, PdfFileWriter, PdfFileMerger
17
18def getfilenames(filepath='',filelist_out=[],file_ext='all'):
19
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
31def mergefiles(path, output_filename, import_bookmarks=False):
32
33
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
54if __name__ == "__main__":
55 description="\n本腳本用來合併pdf文件,輸出的pdf文件按輸入的pdf文件名生成書籤\n使用示例如下:"
56 description=description+'\npython pdfmerge.py -p "D:\pdf-files" -o "merged-out.pdf" -b True'
57 description=description+'\n\n'+"示例說明:"
58 description=description+'\n'+"要合併的pdf文件所在的路徑: D:\pdf-files"
59 description=description+'\n'+"合併後的pdf文件的輸出文件名:merged-out.pdf"
60 description=description+'\n'+"是否從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
83 mergefiles(args.path, args.output_filename, args.import_bookmarks)
84
85
86
還是我Python大法好!!!