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 18 Python
python求pi的方法
Oct 08 Python
python实现二叉树的遍历
Dec 11 Python
Python之时间和日期使用小结
Feb 14 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
对django 模型 unique together的示例讲解
Aug 06 Python
Python搭建代理IP池实现接口设置与整体调度
Oct 27 Python
浅谈Python3实现两个矩形的交并比(IoU)
Jan 18 Python
python实现音乐播放和下载小程序功能
Apr 26 Python
python小程序之4名牌手洗牌发牌问题解析
May 15 Python
pytorch中的numel函数用法说明
May 13 Python
教你用Python+selenium搭建自动化测试环境
Jun 18 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的ASP防火墙
2006/10/09 PHP
php curl post 时出现的问题解决
2014/01/30 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
关于php几种字符串连接的效率比较(详解)
2017/02/22 PHP
php创建多级目录与级联删除文件的方法示例
2019/09/12 PHP
基于thinkphp5框架实现微信小程序支付 退款 订单查询 退款查询操作
2020/08/17 PHP
jQuery学习7 操作JavaScript对象和集合的函数
2010/02/07 Javascript
javascript实现div的显示和隐藏的小例子
2013/06/25 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
document.forms用法示例介绍
2014/06/26 Javascript
JavaScript实现图片DIV竖向滑动的方法
2015/04/25 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
JS实现的文字与图片定时切换效果代码
2015/10/06 Javascript
实用jquery操作表单元素的简单代码
2016/07/04 Javascript
js创建数组的简单方法
2016/07/27 Javascript
全面解析jQuery中的$(window)与$(document)的用法区别
2017/08/15 jQuery
实例解析Vue.js下载方式及基本概念
2018/05/11 Javascript
Vue不能检测到Object/Array更新的情况的解决
2018/06/26 Javascript
axios 实现post请求时把对象obj数据转为formdata
2019/10/31 Javascript
node.js如何根据URL返回指定的图片详解
2020/10/21 Javascript
python实现字符串连接的三种方法及其效率、适用场景详解
2017/01/13 Python
Python网络编程 Python套接字编程
2017/09/13 Python
利用ImageAI库只需几行python代码实现目标检测
2019/08/09 Python
CSS3字体效果的设置方法小结
2016/06/13 HTML / CSS
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
LODI女鞋在线商店:阿利坎特的鞋类品牌
2019/02/15 全球购物
企业面试题试卷附带答案
2015/12/20 面试题
工商管理专业职业生涯规划
2014/01/01 职场文书
校长竞聘演讲稿
2014/05/16 职场文书
中学教师师德承诺书
2014/05/23 职场文书
2014班子成员自我剖析材料思想汇报
2014/10/01 职场文书
终止或解除劳动合同及劳动关系的证明书
2014/10/06 职场文书
同学聚会感言一句话
2015/07/30 职场文书
小学数学教学随笔
2015/08/14 职场文书
纯CSS实现hover图片pop-out弹出效果的实例代码
2021/04/16 HTML / CSS