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 相关文章推荐
pygame学习笔记(4):声音控制
Apr 15 Python
Python 自动化表单提交实例代码
Jun 08 Python
python计算两个数的百分比方法
Jun 29 Python
flask-restful使用总结
Dec 04 Python
python 自动重连wifi windows的方法
Dec 18 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
python 实现PIL模块在图片画线写字
May 16 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 Python
python os.listdir()乱码解决方案
Jan 31 Python
Jupyter Notebook 如何修改字体和大小以及更改字体样式
Jun 03 Python
python绘制云雨图raincloud plot
Aug 05 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
php函数之子字符串替换 str_replace
2011/03/23 PHP
初品cakephp 入门基础
2012/02/16 PHP
再谈PHP中单双引号的区别详解
2016/06/12 PHP
PHP实现统计在线人数功能示例
2016/10/15 PHP
无语,javascript居然支持中文(unicode)编程!
2007/04/12 Javascript
Javascript this关键字使用分析
2008/10/21 Javascript
Javascript String.replace的妙用
2009/09/08 Javascript
Date对象格式化函数代码
2010/07/17 Javascript
brook javascript框架介绍
2011/10/10 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
js带缩略图的图片轮播效果代码分享
2015/09/14 Javascript
简单讲解jQuery中的子元素过滤选择器
2016/04/18 Javascript
Bootstrap Multiselect 常用组件实现代码
2017/07/09 Javascript
JS数组交集、并集、差集的示例代码
2017/08/23 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
js自定义input文件上传样式
2018/10/26 Javascript
JS实现简单的点赞与踩功能示例
2018/12/05 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
nestjs返回给前端数据格式的封装实现
2021/02/22 Javascript
[01:25]DOTA2超级联赛专访iG 将调整状态找回自己
2013/06/05 DOTA
python实用代码片段收集贴
2015/06/03 Python
Python连接SQLServer2000的方法详解
2017/04/19 Python
python 读取文件并替换字段的实例
2018/07/12 Python
Python阶乘求和的代码详解
2020/02/14 Python
Python3.8.2安装包及安装教程图文详解(附安装包)
2020/11/28 Python
HTML5未来发展趋势
2016/02/01 HTML / CSS
英国潮流网站:END.(全球免邮)
2017/01/16 全球购物
塑料制成的可水洗的编织平底鞋和鞋子:Rothy’s
2018/09/16 全球购物
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
事务机电主管工作职责
2014/02/25 职场文书
面试感谢信范文
2015/01/22 职场文书
避暑山庄导游词
2015/02/04 职场文书
爱晚亭导游词
2015/02/09 职场文书
跑出一片天观后感
2015/06/08 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB