博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用PyPDF2库对pdf文件进行指定页面删除操作
阅读量:4501 次
发布时间:2019-06-08

本文共 8561 字,大约阅读时间需要 28 分钟。

平台: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)
View Code

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

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

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

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文件

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

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

1 def rmdir(self):2     if os.path.isdir(self.new):3         shutil.rmtree(self.new)
View Code

方法一的完整代码:

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         pass13 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判断筛选不要的页面

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

 

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

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

 

方法二的完整代码:

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         pass10 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文件时,运行速度太慢,不能实现范围性的删除。

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

转载于:https://www.cnblogs.com/NINOMIYA1360/p/11013010.html

你可能感兴趣的文章
hdu 1846 Brave Game
查看>>
数据库连接历险记
查看>>
抛弃msvcrtXX库
查看>>
血眼龙王传--秋叶青篇
查看>>
Runtime
查看>>
取消git忽略文件
查看>>
Leetcode2--->链表中对应位相加(进位)
查看>>
PXE远程自动安装操作系统
查看>>
java开发知识IO知识之输入输出流以及文件
查看>>
SurfaceViewVideoList网络获取视频播放
查看>>
Oracle 笔记(二)
查看>>
微信公众号开发--访问网络用到的工具类
查看>>
wpf中利用多重绑定实现表中数据越界自动报警
查看>>
为Linux配置常用源:epel和IUS
查看>>
天府地
查看>>
C#高级编程
查看>>
JS实现从照片中裁切自已的肖像
查看>>
使用 https://git.io 缩短 a GitHub.com URL.
查看>>
拷贝、浅拷贝、深拷贝解答
查看>>
NS3 实验脚本的编写步骤
查看>>