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 相关文章推荐
Python实现的石头剪子布代码分享
Aug 22 Python
python基于Tkinter库实现简单文本编辑器实例
May 05 Python
python 环境变量和import模块导入方法(详解)
Jul 11 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
Python字符串通过'+'和join函数拼接新字符串的性能测试比较
Mar 05 Python
如何使用python爬虫爬取要登陆的网站
Jul 12 Python
Django xadmin开启搜索功能的实现
Nov 15 Python
使用opencv中匹配点对的坐标提取方式
Jun 04 Python
Pytorch 高效使用GPU的操作
Jun 27 Python
解决pip安装的第三方包在PyCharm无法导入的问题
Oct 15 Python
Python FuzzyWuzzy实现模糊匹配
Apr 28 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创建PDF中文文档
2006/10/09 PHP
jQuery+PHP实现的掷色子抽奖游戏实例
2015/01/04 PHP
几个优化WordPress中JavaScript加载体验的插件介绍
2015/12/17 PHP
PHP查询分页的实现代码
2017/06/09 PHP
PHP+RabbitMQ实现消息队列的完整代码
2019/03/20 PHP
Mozilla中显示textarea中选择的文字
2006/09/07 Javascript
juqery 学习之三 选择器 层级 基本
2010/11/25 Javascript
jQuery EasyUI API 中文文档 - ComboTree组合树
2011/10/11 Javascript
jquery创建并行对象或者合并对象的实现代码
2012/10/10 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
jquery实现每个数字上都带进度条的幻灯片
2013/02/20 Javascript
Javscript调用iframe框架页面中函数的方法
2014/11/01 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
如何使用Bootstrap的modal组件自定义alert,confirm和modal对话框
2016/03/01 Javascript
微信小程序开发之Tabbar实例详解
2017/01/09 Javascript
vue-resource 拦截器使用详解
2017/02/21 Javascript
微信小程序实现人脸检测功能
2018/05/25 Javascript
python实现封装得到virustotal扫描结果
2014/10/05 Python
python实现模拟按键,自动翻页看u17漫画
2015/03/17 Python
python字符类型的一些方法小结
2016/05/16 Python
Python3中关于cookie的创建与保存
2018/10/21 Python
Django密码系统实现过程详解
2019/07/19 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
2020/09/30 Python
appium+python自动化配置(adk、jdk、node.js)
2020/11/17 Python
pycharm远程连接服务器并配置python interpreter的方法
2020/12/23 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
HTML5 Canvas中绘制矩形实例
2015/01/01 HTML / CSS
大课间活动制度
2014/01/18 职场文书
人力资源经理的岗位职责范本
2014/02/28 职场文书
旅行社各个岗位职责
2014/03/15 职场文书
央视元宵晚会主持串词
2014/03/25 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
师德师风整改措施
2014/10/24 职场文书
教学督导岗位职责
2015/04/10 职场文书
Python上下文管理器Content Manager
2021/06/26 Python
使用@Value值注入及配置文件组件扫描
2021/07/09 Java/Android