平台:win10家庭版,python 3.7,PyPDF2
思维过程:
方法一:将pdf文件通过拆分为单页,放入一个文件夹,再删除其中不要的文件,最后再把剩余的文件进行合并为一个pdf文件
第一步:使用原文件路径创建新文件夹,用于存放拆分后的单页文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)
View Code
第二步:生成单页文件,并存放到新建的文件夹
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()
View Code
第三步:删除文件夹中不要的文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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)
View Code
第四步:把剩余文件合并为一个pdf文件
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()
View Code
第五步:删除其中的缓存文件夹
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 def rmdir(self):
2 if os.path.isdir(self.new):
3 shutil.rmtree(self.new)
View Code
方法一的完整代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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])
View Code
方法二:在写入新文件时使用if判断进行筛选出不要的页面
想法一、将读取与写入同时处理。使用if判断筛选不要的页面
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()
View Code
想法二、将数据先全部放入内存,最后在写入,来提高速度:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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()
View Code
方法二的完整代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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])
View Code
两种方法的比较:
方法一
方法二中的第一种想法
方法二中的第二种想法
运行速度
慢
较慢
快
代码量
65行
34行
34行
缺点:
方法一在处理扫描的pdf文件时,运行速度太慢,不能实现范围性的删除。
方法二不能实现范围性的删除
|