DW-办公自动化04(PDF)

1 相关介绍

  • 相关库:Python操作PDF会用到两个库
    • PyPDF2:可以更好的读取、写入、分割、合并PDF文件
    • pdfplumber:可以更好的读取 PDF 文件中内容和提取 PDF 中的表格
    • 两个都需要单独安装
    pip install PyPDF2
    pip install pdfplumber
    

    注:PyPDF2无法从PDF文档中提取图像、图表或其他媒体,但它可以提取文本,并将文本返回为Python字符串

2 批量拆分

  • 拆分思路:涉及到 PDF 整体的操作,需要用到 PyPDF2 这个库
    • 读取 PDF 的整体信息、总页数等
    • 遍历每一页内容,以每个 step 为间隔将 PDF 存成每一个小的文件块
    • 将小的文件块重新保存为新的 PDF 文件
    import os
    def split_pdf(filename, filepath, save_dirpath, step=5):
        """
        拆分PDF为多个小的PDF文件,
        @param filename:文件名
        @param filepath:文件路径
        @param save_dirpath:保存小的PDF的文件路径
        @param step: 每step间隔的页面生成一个文件,例如step=5,表示0-4页、5-9页...为一个文件
        @return:
        """
        if not os.path.exists(save_dirpath):
            os.mkdir(save_dirpath)
        pdf_reader = PdfFileReader(filepath)
        # 读取每一页的数据
        pages = pdf_reader.getNumPages()
        # page取值:list [0, 5, 10...pages)
        for page in range(0, pages, step):
            pdf_writer = PdfFileWriter()
            # 拆分pdf,每 step 页的拆分为一个文件
            # index取值, 区间: [0, 5),[5, 10)
            for index in range(page, page+step):
            	# 防止全部页数不能整除
                if index < pages:
                	# 逐页添加
                    pdf_writer.addPage(pdf_reader.getPage(index))
            # 保存拆分后的小文件
            save_path = os.path.join(save_dirpath, filename+str(int(page/step)+1)+'.pdf')
            print(save_path)
            with open(save_path, "wb") as out:
                pdf_writer.write(out)
    
        print("文件已成功拆分,保存路径为:"+save_dirpath)
    
    # 导入拆分函数中需要的模块
    from PyPDF2 import PdfFileReader 
    from PyPDF2 import PdfFileWriter
    
    # 分隔PDF
    path = '易方达中小板指数证券投资基金(LOF)2020年中期报告' # 当前路径下
    split_pdf(path, path + '.pdf', 'test_pdf')
    

    注:第一次运行会出现下面的报错

    UnicodeEncodeError: 'latin-1' codec can't encode characters in position 8-9:
    
    在这里插入图片描述
    • 解决方法:
      • 在Pycharm下,直接通过报错信息,点击utils.py文件,定位到238行原文
        原文是这样的:
       r = s.encode('latin-1')
       if len(s) < 2:
         		bc[s] = r
       return r
      
      修改为:
      try:
          r = s.encode('latin-1')
          if len(s) < 2:
              bc[s] = r
          return r
      except Exception as e
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值