600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > python 删除pdf页面_使用PyPDF2库对pdf文件进行指定页面删除操作

python 删除pdf页面_使用PyPDF2库对pdf文件进行指定页面删除操作

时间:2021-09-21 10:32:22

相关推荐

python 删除pdf页面_使用PyPDF2库对pdf文件进行指定页面删除操作

平台:win10家庭版,python 3.7,PyPDF2

思维过程:

方法一:将pdf文件通过拆分为单页,放入一个文件夹,再删除其中不要的文件,最后再把剩余的文件进行合并为一个pdf文件

第一步:使用原文件路径创建新文件夹,用于存放拆分后的单页文件

defnewdir(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

第二步:生成单页文件,并存放到新建的文件夹

1 defpdfsplt(self,path):2 ifos.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 inrange(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

第三步:删除文件夹中不要的文件

1 defpdfremove(self,number):2 for pag innumber:3 filename = str(self.new) + "\\" + str(pag) + ".pdf"

4 ifos.path.isfile(filename):5 os.unlink(filename)6 else:7 print("请确认要删除的页码%s是否正确!!"%pag)

View Code

第四步:把剩余文件合并为一个pdf文件

1 defpdfmerge(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 insorted(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

第五步:删除其中的缓存文件夹

1 defrmdir(self):2 ifos.path.isdir(self.new):3 shutil.rmtree(self.new)

View Code

方法一的完整代码:

1 importPyPDF22 importos,time,shutil,sys3 importthreading4

5 classmypdf(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 defnewdir(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 defpdfsplt(self,path):22 ifos.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 inrange(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 defpdfremove(self,number):41 for pag innumber:42 filename = str(self.new) + "\\" + str(pag) + ".pdf"

43 ifos.path.isfile(filename):44 os.unlink(filename)45 else:46 print("请确认要删除的页码%s是否正确!!"%pag)47

48 #将缓存文件夹中的剩余文件合进行合并

49 defpdfmerge(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 insorted(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 defrmdir(self):65 ifos.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 deff(path,number):74 mypdf(path,number)75 threading.Thread(target=f,args=[path,number])

View Code

方法二:在写入新文件时使用if判断进行筛选出不要的页面

想法一、将读取与写入同时处理。使用if判断筛选不要的页面

1 defpdfsplt(self,path,number):2 print(number,type(number))3 ifos.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 inrange(0,file_reader.getNumPages()):9 if page not innumber: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

想法二、将数据先全部放入内存,最后在写入,来提高速度:

1 defpdfsplt(self,path,number):2 print(number,type(number))3 ifos.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 inrange(0,file_reader.getNumPages()):9 if page not innumber: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

方法二的完整代码:

1 importPyPDF22 importos,time,shutil,sys3 importthreading4

5 classmypdf(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 defpdfsplt(self,path,number):13 print(number,type(number))14 ifos.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 inrange(0,file_reader.getNumPages()):20 if page not innumber: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 deff(path,number):39 mypdf(path,number)40 threading.Thread(target=f,args=[path,number])

View Code

两种方法的比较:

方法一

方法二中的第一种想法

方法二中的第二种想法

运行速度

较慢

代码量

65行

34行

34行

缺点:

方法一在处理扫描的pdf文件时,运行速度太慢,不能实现范围性的删除。

方法二不能实现范围性的删除

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。