PyPDF2读取PDF文件内容保存到本地TXT实例


Posted in Python onMay 12, 2020

我就废话不多说了,大家还是直接看代码吧!

from PyPDF2.pdf import PdfFileReader
import pandas as pd

def Pdf_to_txt(pdf):

  for i in range(0, pdf.getNumPages()):
    title = []
    lin1, lin2, lin3, lin4, lin5, lin6, lin7, lin8 = [], [], [], [], [], [], [], []
    extractedText = pdf.getPage(i).extractText()
    text = extractedText.split('\n')
    num = 0
    for lin in text:
      if num == 0:
        title.append(lin)
      elif num == 1:
        lin1.append(lin)
      elif num == 2:
        lin2.append(lin)
      elif num == 3:
        lin3.append(lin)
      elif num == 4:
        lin4.append(lin)
      elif num == 5:
        lin5.append(lin)
      elif num == 6:
        lin6.append(lin)
      elif num == 7:
        lin7.append(lin)
      elif num == 8:
        lin8.append(lin)
        num = 0
      num += 1
    Lin_num = len(lin8)
    data = {'Lin1': lin1[:Lin_num], 'Lin2': lin2[:Lin_num], 'Lin3': lin3[:Lin_num], 'Lin4': lin4[:Lin_num], 'Lin5': lin5[:Lin_num], 'Lin6': lin6[:Lin_num], 'Lin7': lin7[:Lin_num], 'Lin8': lin8[:Lin_num]}
    df = pd.DataFrame(data, columns=['Lin1', 'Lin2', 'Lin3', 'Lin4', 'Lin5', 'Lin6', 'Lin7', 'Lin8'])
    file_name = title[0] + '_page' + str((i + 1))
    df.to_csv('tool/pdf解析/%s.txt' % file_name, index=False, sep='\t')


if __name__ == '__main__':
  filename = 'E:/SVN/采集框架V2/analyse_code/政策/pdf/con026465.pdf'
  pdf = PdfFileReader(open(filename, "rb"))
  Pdf_to_txt(pdf)

补充知识:使用PyPDF2库对pdf文件进行指定页面删除操作

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

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

def pdfsplt(self,path):
          if os.path.isfile(path):
              file_1 = open(path,"rb")
              file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict关闭错误提示
              #使用for循环读取每一页并将其写入新pdf文件,文件以页码命名
              for page in range(0,file_reader.getNumPages()):
                file_write = PyPDF2.PdfFileWriter()
                pageobj = file_reader.getPage(page)
                file_write.addPage(pageobj)
                output = str(self.new) + "\\" + str(int(page+1)) + ".pdf"
                with open(output,"wb") as output_pdf:
                    file_write.write(output_pdf)
              file_1.close()
          else:
              print("文件不存在!")
             time.sleep(3)
              exit()

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

def pdfremove(self,number):
  for pag in number:
    filename = str(self.new) + "\\" + str(pag) + ".pdf"
    if os.path.isfile(filename):
      os.unlink(filename)
    else:
      print("请确认要删除的页码%s是否正确!!"%pag)

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

def pdfmerge(self):
  file_list = [int(os.path.splitext(x)[0]) for x in os.listdir(self.new)] #读取新建文件夹下的所有文件并提取文件名转为数字
  file_write = PyPDF2.PdfFileWriter() #先创建一个新的pdf对象
  for page in sorted(file_list):
    pathstr = str(self.new) + "\\" + str(page) + ".pdf"
    file_1 = open(pathstr,"rb")
    file_reader = PyPDF2.PdfFileReader(file_1, strict=False) # 使用strict关闭错误提示
    pageobj = file_reader.getPage(0)
    file_write.addPage(pageobj)
    output = str(self.new) + "_new.pdf"
    with open(output, "wb") as output_pdf:
      file_write.write(output_pdf)
      print("第%s页完成"%page)
    file_1.close()

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

def rmdir(self):
  if os.path.isdir(self.new):
    shutil.rmtree(self.new)

方法一的完整代码:

import PyPDF2
import os,time,shutil,sys
import threading

class mypdf(object):
  def __init__(self,path,number):
    self.newdir(path)
    self.pdfsplt(path)
    self.pdfremove(number)
    self.pdfmerge()
    self.rmdir()
    pass

  #用于创建一个独立的文件夹,存放缓存数据
  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)

  #将每一页生成独立文件,存放到缓存文件夹
  def pdfsplt(self,path):
    if os.path.isfile(path):
      file_1 = open(path,"rb")
      file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict关闭错误提示
      #使用for循环读取每一页并将其写入新pdf文件,文件以页码命名
      for page in range(0,file_reader.getNumPages()):
        file_write = PyPDF2.PdfFileWriter()
        pageobj = file_reader.getPage(page)
        file_write.addPage(pageobj)
        output = str(self.new) + "\\" + str(int(page+1)) + ".pdf"
        with open(output,"wb") as output_pdf:
          file_write.write(output_pdf)
      file_1.close()
    else:
      print("文件不存在!")
      time.sleep(3)
      exit()

  #删除缓存文件夹中的不要的页
  def pdfremove(self,number):
    for pag in number:
      filename = str(self.new) + "\\" + str(pag) + ".pdf"
      if os.path.isfile(filename):
        os.unlink(filename)
      else:
        print("请确认要删除的页码%s是否正确!!"%pag)

  #将缓存文件夹中的剩余文件合进行合并
  def pdfmerge(self):
    file_list = [int(os.path.splitext(x)[0]) for x in os.listdir(self.new)] #读取新建文件夹下的所有文件并提取文件名转为数字
    file_write = PyPDF2.PdfFileWriter() #先创建一个新的pdf对象
    for page in sorted(file_list):
      pathstr = str(self.new) + "\\" + str(page) + ".pdf"
      file_1 = open(pathstr,"rb")
      file_reader = PyPDF2.PdfFileReader(file_1, strict=False) # 使用strict关闭错误提示
      pageobj = file_reader.getPage(0)
      file_write.addPage(pageobj)
      output = str(self.new) + "_new.pdf"
      with open(output, "wb") as output_pdf:
        file_write.write(output_pdf)
        print("第%s页完成"%page)
      file_1.close()

  def rmdir(self):
    if os.path.isdir(self.new):
      shutil.rmtree(self.new)

if __name__ == "__main__":
  #通过第一个参数获取待处理的文件,第二个参数到以后为删除的页码
  path = sys.argv[1]
  number = sys.argv[2:]
  mypdf = mypdf(path,number)
  def f(path,number):
    mypdf(path,number)
  threading.Thread(target=f,args=[path,number])

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

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

def pdfsplt(self,path,number):
    print(number,type(number))
    if os.path.isfile(path):
      file_1 = open(path,"rb")
      file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict关闭错误提示
      file_write = PyPDF2.PdfFileWriter()
      #使用for循环读取每一页并将其写入新pdf文件,文件以页码命名
      for page in range(0,file_reader.getNumPages()):
        if page not in number:
          pageobj = file_reader.getPage(page)
          file_write.addPage(pageobj)
          output = str(self.new) + "_new.pdf"
          with open(output,"wb") as output_pdf: 
            file_write.write(output_pdf)
      file_1.close()
    else:
      print("文件不存在!")
      time.sleep(3)
      exit()

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

def pdfsplt(self,path,number):
    print(number,type(number))
    if os.path.isfile(path):
      file_1 = open(path,"rb")
      file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict关闭错误提示
      file_write = PyPDF2.PdfFileWriter()
      #使用for循环读取每一页并将其写入新pdf文件,文件以页码命名
      for page in range(0,file_reader.getNumPages()):
        if page not in number:
          pageobj = file_reader.getPage(page)
          file_write.addPage(pageobj)
      output = str(self.new) + "_new.pdf"
      with open(output,"wb") as output_pdf: #将内容全部放入内存,最后写入,提高处理速度
        file_write.write(output_pdf)
      file_1.close()
    else:
      print("文件不存在!")
      time.sleep(3)
      exit()

方法二的完整代码:

import PyPDF2
import os,time,shutil,sys
import threading

class mypdf(object):
  def __init__(self,path,number):
    self.new = os.path.splitext(path)[0] #获取文件的路径
    self.pdfsplt(path,number)
    pass

#循环每一页读入内存,最后写入文件
  def pdfsplt(self,path,number):
    print(number,type(number))
    if os.path.isfile(path):
      file_1 = open(path,"rb")
      file_reader = PyPDF2.PdfFileReader(file_1, strict=False) #使用strict关闭错误提示
      file_write = PyPDF2.PdfFileWriter()
      #使用for循环读取每一页并将其写入新pdf文件,文件以页码命名
      for page in range(0,file_reader.getNumPages()):
        if page not in number:
          pageobj = file_reader.getPage(page)
          file_write.addPage(pageobj)
      output = str(self.new) + "_new.pdf"
      with open(output,"wb") as output_pdf: #将内容全部放入内存,最后写入,提高处理速度
        file_write.write(output_pdf)
      file_1.close()
    else:
      print("文件不存在!")
      time.sleep(3)
      exit()

if __name__ == "__main__":
  #通过第一个参数获取待处理的文件,第二个参数到以后为删除的页码
  path = sys.argv[1]
  number = sys.argv[2:]
  number = list(map(int, number))
  mypdf = mypdf(path,number)
  def f(path,number):
    mypdf(path,number)
  threading.Thread(target=f,args=[path,number])

两种方法的比较:

  方法一 方法二中的第一种想法 方法二中的第二种想法
运行速度 较慢
代码量 65行 34行 34行

缺点:

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

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

以上这篇PyPDF2读取PDF文件内容保存到本地TXT实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
利用打码兔和超人打码自封装的打码类分享
Mar 16 Python
Python 列表排序方法reverse、sort、sorted详解
Jan 22 Python
python高阶爬虫实战分析
Jul 29 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
python multiprocessing模块用法及原理介绍
Aug 20 Python
python定位xpath 节点位置的方法
Aug 27 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
Python HTTP下载文件并显示下载进度条功能的实现
Apr 02 Python
Python求凸包及多边形面积教程
Apr 12 Python
浅析python 定时拆分备份 nginx 日志的方法
Apr 27 Python
Pytorch 高效使用GPU的操作
Jun 27 Python
Python3.7下安装pyqt5的方法步骤(图文)
May 12 #Python
小 200 行 Python 代码制作一个换脸程序
May 12 #Python
python3用PyPDF2解析pdf文件,用正则匹配数据方式
May 12 #Python
Python如何根据时间序列数据作图
May 12 #Python
python logging.info在终端没输出的解决
May 12 #Python
你应该知道的Python3.6、3.7、3.8新特性小结
May 12 #Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 #Python
You might like
实用函数5
2007/11/08 PHP
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
PHP函数学习之PHP函数点评
2012/07/05 PHP
php的declare控制符和ticks教程(附示例)
2014/03/21 PHP
两千行代码的PHP学习笔记汇总
2014/10/05 PHP
基于Laravel5.4实现多字段登录功能方法示例
2017/08/11 PHP
对laravel in 查询的使用方法详解
2019/10/09 PHP
繁简字转换功能
2006/07/19 Javascript
jQuery 学习入门篇附实例代码
2010/03/16 Javascript
js 函数调用模式小结
2011/12/26 Javascript
javascript中负数算术右移、逻辑右移的奥秘探索
2013/10/17 Javascript
jQuery新的事件绑定机制on()示例应用
2014/07/18 Javascript
jQuery+PHP实现可编辑表格字段内容并实时保存
2015/10/09 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
jquery实现tab选项卡切换效果(悬停、下方横线动画位移)
2017/05/05 jQuery
Node.js中package.json中库的版本号(~和^)
2019/04/02 Javascript
JS使用正则表达式实现常用的表单验证功能分析
2020/04/30 Javascript
在vue中使用Base64转码的案例
2020/08/07 Javascript
Vue中nprogress页面加载进度条的方法实现
2020/11/13 Javascript
[01:42]辉夜杯战队访谈宣传片—FANTUAN
2015/12/25 DOTA
python自然语言编码转换模块codecs介绍
2015/04/08 Python
python画图--输出指定像素点的颜色值方法
2019/07/03 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
python面向对象之类属性和类方法案例分析
2019/12/30 Python
Python实现桌面翻译工具【新手必学】
2020/02/12 Python
python文件排序的方法总结
2020/09/13 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
flask框架中的cookie和session使用
2021/01/31 Python
HomeAway的巴西品牌:Alugue Temporada
2018/04/10 全球购物
农村产权制度改革实施方案
2014/03/21 职场文书
助残日活动总结
2014/08/27 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
杨善洲观后感
2015/06/04 职场文书
MySQL系列之十二 备份与恢复
2021/07/02 MySQL
一文搞懂Redis中String数据类型
2022/04/03 Redis
解决Mysql中的innoDB幻读问题
2022/04/29 MySQL