ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【python办公自动化】task 04 python与pdf

2021-06-26 22:57:29  阅读:223  来源: 互联网

标签:文件 04 filepath python filename dirpath pdf save


目录

1. 预备知识

Python操作pdf会用到两个库:

  • PyPDF2 可以更好的读取、写入、分割、合并PDF文件
  • pdfplumber 可以更好的读取 PDF 文件中内容和提取 PDF 中的表格

在使用前需要先对其进行安装

pip install PyPDF2

pip install pdfplumber

2. 批量拆分

将一个pdf拆分为几个小的pdf,主要用到PyPDF2这个库
拆分思路如下:

  • 读取pdf的整体信息,总页数等
  • 遍历每一页内容,以每个step为间隔将pdf保存为每一个小的文件块
  • 将小的文件重新保存为新的pdf文件
import os 
import PyPDF2
from PyPDF2 import PdfFileReader
from PyPDF2 import PdfFileWriter

def split_pdf(filename, filepath, save_dirpath, step=5):
    """
    拆分PDF为多个小的PDF文件,
    @param filename:文件名
    @param filepath:文件路径,包含pdf的名字
    @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()
    for page in range(0, pages, step):
        pdf_writer = PdfFileWriter()
        # 拆分pdf,每 step 页的拆分为一个文件
        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)

filename='易方达中小盘混合型证券投资基金2020年中期报告'
filepath=r'E:\数据分析\python办公\易方达中小盘混合型证券投资基金2020年中期报告.pdf'
save_dirpath='E:\数据分析\python办公\pdf拆分'

split_pdf(filename,filepath,save_dirpath,step=5)

在这里插入图片描述
注意:第一次用的时候会报错
在这里插入图片描述
解决方法是从python安装包下找到PyPDF2\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:
r = s.encode('utf-8')
if len(s) < 2:
bc[s] = r
return r

改完后一定要重启python,否则不成功


3. 批量合并

思路:

  • 确定要合并的文件顺序
  • 循环追加到一个文件块中
  • 保存成为一个新的文件
def concat_pdf(filename, read_dirpath, save_filepath):
    """
    合并多个PDF文件
    @param filename:文件名前缀
    @param read_dirpath:要合并的PDF目录
    @param save_filepath:合并后的PDF文件路径,包含新pdf的名字
    @return:
    """
    pdf_writer = PdfFileWriter()
    # 对文件名进行排序
    list_filename = os.listdir(read_dirpath) 
    list_filename.sort(key=lambda x: int(x[:-4].replace(filename, "")))
    for filename in list_filename:
        print(filename)
        filepath = os.path.join(read_dirpath, filename)
        # 读取文件并获取文件的页数
        pdf_reader = PdfFileReader(filepath)
        pages = pdf_reader.getNumPages()
        # 逐页添加
        for page in range(pages):
            pdf_writer.addPage(pdf_reader.getPage(page))
    # 保存合并后的文件
    with open(save_filepath, "wb") as out:
        pdf_writer.write(out)
    print("文件已成功合并,保存路径为:"+save_filepath)

filename='易方达中小盘混合型证券投资基金2020年中期报告'
read_dirpath='E:\数据分析\python办公\pdf拆分'
save_filepath='E:\数据分析\python办公\pdf合并\易方达中小盘混合型证券投资基金2020年中期报告.pdf'

concat_pdf(filename,read_dirpath,save_filepath)

在这里插入图片描述

标签:文件,04,filepath,python,filename,dirpath,pdf,save
来源: https://blog.csdn.net/a8689756/article/details/118211904

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有