平台:win10家庭版,python 3.7,PyPDF2
思維過程:
方法一:將pdf文件通過拆分為單頁,放入一個文件夾,再刪除其中不要的文件,最后再把剩余的文件進行合並為一個pdf文件
第一步:使用原文件路徑創建新文件夾,用於存放拆分后的單頁文件

def newdir(self,path): self.new = os.path.splitext(path)[0] if not os.path.isdir(self.new): #使用os.path.isdir判斷文件夾是否存在, os.mkdir(self.new)
第二步:生成單頁文件,並存放到新建的文件夾

1 def pdfsplt(self,path): 2 if os.path.isfile(path): 3 file_1 = open(path,"rb") 4 file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict關閉錯誤提示 5 #使用for循環讀取每一頁並將其寫入新pdf文件,文件以頁碼命名 6 for page in range(0,file_reader.getNumPages()): 7 file_write = PyPDF2.PdfFileWriter() 8 pageobj = file_reader.getPage(page) 9 file_write.addPage(pageobj) 10 output = str(self.new) + "\\" + str(int(page+1)) + ".pdf" 11 with open(output,"wb") as output_pdf: 12 file_write.write(output_pdf) 13 file_1.close() 14 else: 15 print("文件不存在!") 16 time.sleep(3) 17 exit()
第三步:刪除文件夾中不要的文件

1 def pdfremove(self,number): 2 for pag in number: 3 filename = str(self.new) + "\\" + str(pag) + ".pdf" 4 if os.path.isfile(filename): 5 os.unlink(filename) 6 else: 7 print("請確認要刪除的頁碼%s是否正確!!"%pag)
第四步:把剩余文件合並為一個pdf文件

1 def pdfmerge(self): 2 file_list = [int(os.path.splitext(x)[0]) for x in os.listdir(self.new)] #讀取新建文件夾下的所有文件並提取文件名轉為數字 3 file_write = PyPDF2.PdfFileWriter() #先創建一個新的pdf對象 4 for page in sorted(file_list): 5 pathstr = str(self.new) + "\\" + str(page) + ".pdf" 6 file_1 = open(pathstr,"rb") 7 file_reader = PyPDF2.PdfFileReader(file_1, strict=False) # 使用strict關閉錯誤提示 8 pageobj = file_reader.getPage(0) 9 file_write.addPage(pageobj) 10 output = str(self.new) + "_new.pdf" 11 with open(output, "wb") as output_pdf: 12 file_write.write(output_pdf) 13 print("第%s頁完成"%page) 14 file_1.close()
第五步:刪除其中的緩存文件夾

1 def rmdir(self): 2 if os.path.isdir(self.new): 3 shutil.rmtree(self.new)
方法一的完整代碼:

1 import PyPDF2 2 import os,time,shutil,sys 3 import threading 4 5 class mypdf(object): 6 def __init__(self,path,number): 7 self.newdir(path) 8 self.pdfsplt(path) 9 self.pdfremove(number) 10 self.pdfmerge() 11 self.rmdir() 12 pass 13 14 #用於創建一個獨立的文件夾,存放緩存數據 15 def newdir(self,path): 16 self.new = os.path.splitext(path)[0] 17 if not os.path.isdir(self.new): #使用os.path.isdir判斷文件夾是否存在, 18 os.mkdir(self.new) 19 20 #將每一頁生成獨立文件,存放到緩存文件夾 21 def pdfsplt(self,path): 22 if os.path.isfile(path): 23 file_1 = open(path,"rb") 24 file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict關閉錯誤提示 25 #使用for循環讀取每一頁並將其寫入新pdf文件,文件以頁碼命名 26 for page in range(0,file_reader.getNumPages()): 27 file_write = PyPDF2.PdfFileWriter() 28 pageobj = file_reader.getPage(page) 29 file_write.addPage(pageobj) 30 output = str(self.new) + "\\" + str(int(page+1)) + ".pdf" 31 with open(output,"wb") as output_pdf: 32 file_write.write(output_pdf) 33 file_1.close() 34 else: 35 print("文件不存在!") 36 time.sleep(3) 37 exit() 38 39 #刪除緩存文件夾中的不要的頁 40 def pdfremove(self,number): 41 for pag in number: 42 filename = str(self.new) + "\\" + str(pag) + ".pdf" 43 if os.path.isfile(filename): 44 os.unlink(filename) 45 else: 46 print("請確認要刪除的頁碼%s是否正確!!"%pag) 47 48 #將緩存文件夾中的剩余文件合進行合並 49 def pdfmerge(self): 50 file_list = [int(os.path.splitext(x)[0]) for x in os.listdir(self.new)] #讀取新建文件夾下的所有文件並提取文件名轉為數字 51 file_write = PyPDF2.PdfFileWriter() #先創建一個新的pdf對象 52 for page in sorted(file_list): 53 pathstr = str(self.new) + "\\" + str(page) + ".pdf" 54 file_1 = open(pathstr,"rb") 55 file_reader = PyPDF2.PdfFileReader(file_1, strict=False) # 使用strict關閉錯誤提示 56 pageobj = file_reader.getPage(0) 57 file_write.addPage(pageobj) 58 output = str(self.new) + "_new.pdf" 59 with open(output, "wb") as output_pdf: 60 file_write.write(output_pdf) 61 print("第%s頁完成"%page) 62 file_1.close() 63 64 def rmdir(self): 65 if os.path.isdir(self.new): 66 shutil.rmtree(self.new) 67 68 if __name__ == "__main__": 69 #通過第一個參數獲取待處理的文件,第二個參數到以后為刪除的頁碼 70 path = sys.argv[1] 71 number = sys.argv[2:] 72 mypdf = mypdf(path,number) 73 def f(path,number): 74 mypdf(path,number) 75 threading.Thread(target=f,args=[path,number])
方法二:在寫入新文件時使用if判斷進行篩選出不要的頁面
想法一、將讀取與寫入同時處理。使用if判斷篩選不要的頁面

1 def pdfsplt(self,path,number): 2 print(number,type(number)) 3 if os.path.isfile(path): 4 file_1 = open(path,"rb") 5 file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict關閉錯誤提示 6 file_write = PyPDF2.PdfFileWriter() 7 #使用for循環讀取每一頁並將其寫入新pdf文件,文件以頁碼命名 8 for page in range(0,file_reader.getNumPages()): 9 if page not in number: 10 pageobj = file_reader.getPage(page) 11 file_write.addPage(pageobj) 12 output = str(self.new) + "_new.pdf" 13 with open(output,"wb") as output_pdf: 14 file_write.write(output_pdf) 15 file_1.close() 16 else: 17 print("文件不存在!") 18 time.sleep(3) 19 exit()
想法二、將數據先全部放入內存,最后在寫入,來提高速度:

1 def pdfsplt(self,path,number): 2 print(number,type(number)) 3 if os.path.isfile(path): 4 file_1 = open(path,"rb") 5 file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict關閉錯誤提示 6 file_write = PyPDF2.PdfFileWriter() 7 #使用for循環讀取每一頁並將其寫入新pdf文件,文件以頁碼命名 8 for page in range(0,file_reader.getNumPages()): 9 if page not in number: 10 pageobj = file_reader.getPage(page) 11 file_write.addPage(pageobj) 12 output = str(self.new) + "_new.pdf" 13 with open(output,"wb") as output_pdf: #將內容全部放入內存,最后寫入,提高處理速度 14 file_write.write(output_pdf) 15 file_1.close() 16 else: 17 print("文件不存在!") 18 time.sleep(3) 19 exit()
方法二的完整代碼:

1 import PyPDF2 2 import os,time,shutil,sys 3 import threading 4 5 class mypdf(object): 6 def __init__(self,path,number): 7 self.new = os.path.splitext(path)[0] #獲取文件的路徑 8 self.pdfsplt(path,number) 9 pass 10 11 #循環每一頁讀入內存,最后寫入文件 12 def pdfsplt(self,path,number): 13 print(number,type(number)) 14 if os.path.isfile(path): 15 file_1 = open(path,"rb") 16 file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict關閉錯誤提示 17 file_write = PyPDF2.PdfFileWriter() 18 #使用for循環讀取每一頁並將其寫入新pdf文件,文件以頁碼命名 19 for page in range(0,file_reader.getNumPages()): 20 if page not in number: 21 pageobj = file_reader.getPage(page) 22 file_write.addPage(pageobj) 23 output = str(self.new) + "_new.pdf" 24 with open(output,"wb") as output_pdf: #將內容全部放入內存,最后寫入,提高處理速度 25 file_write.write(output_pdf) 26 file_1.close() 27 else: 28 print("文件不存在!") 29 time.sleep(3) 30 exit() 31 32 if __name__ == "__main__": 33 #通過第一個參數獲取待處理的文件,第二個參數到以后為刪除的頁碼 34 path = sys.argv[1] 35 number = sys.argv[2:] 36 number = list(map(int, number)) 37 mypdf = mypdf(path,number) 38 def f(path,number): 39 mypdf(path,number) 40 threading.Thread(target=f,args=[path,number])
兩種方法的比較:
方法一 |
方法二中的第一種想法 |
方法二中的第二種想法 |
|
運行速度 |
慢 |
較慢 |
快 |
代碼量 |
65行 |
34行 |
34行 |
缺點:
方法一在處理掃描的pdf文件時,運行速度太慢,不能實現范圍性的刪除。
方法二不能實現范圍性的刪除