热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

python使用PyPDF2库进行PDF基本操作

#-*-codingutf-8-*-#@Time:202112610:09#@Author:Mr#@File:pdftest.py#@Software:PyCharmfromPyP



# -*- coding =utf-8 -*-
# @Time : 2021/1/26 10:09
# @Author :Mr
# @File :pdftest.py
# @Software :PyCharm
from PyPDF2 import PdfFileReader, PdfFileWriter
import os
# 创建输出文件目录
def mkdir(read_file_path, out_path=None):
if out_path is None:
out_path = (os.path.join(os.path.dirname(read_file_path),
os.path.basename(read_file_path)[:-4].replace(" ", "")))
if not os.path.exists(out_path): # 判断是否存在文件夹如果不存在则创建为文件夹
# print("--- 创建新的文件夹... ---")
os.makedirs(out_path) # makedirs 创建文件时如果路径不存在会创建这个路径
# print("--- OK ---")
else:
# print("--- 文件夹已存在! ---")
pass
return out_path
# 切分每一页
def split_pdf(read_file_path, out_path=None):
out_path = mkdir(read_file_path, out_path)
pdfReader = PdfFileReader(read_file_path)
for page in range(pdfReader.getNumPages()):
pdf_writer = PdfFileWriter()
pdf_writer.addPage(pdfReader.getPage(page))
pdf_name = f'{page}.pdf'
pdf_file = os.path.join(out_path, pdf_name)
with open(pdf_file, 'wb') as output_pdf:
pdf_writer.write(output_pdf)
return
# PDF文件按条件分割
def split_by_pages(read_file_path, out_detail, out_path=None):
out_path = mkdir(read_file_path, out_path)
try:
fp_read_file = open(read_file_path, 'rb')
pdfReader = PdfFileReader(fp_read_file) # 将要分割的PDF内容格式话
page_count = pdfReader.getNumPages() # 获取PDF页数
print(page_count) # 打印页数
with open(out_detail, 'r', True, 'utf-8')as fp:
# print(fp)
txt = fp.readlines()
# print(txt)
for detail in txt: # 打开分割标准文件
# print(type(detail))
pages, write_file = detail.split() # 空格分组
print(pages, write_file)
# write_file, write_ext = os.path.splitext(write_file) # 用于返回文件名和扩展名元组
pdf_file = f'{pages}页.pdf'
pdf_files = os.path.join(out_path, pdf_file)
print(pdf_files)
# liststr=list(map(int, pages.split('-')))
# print(type(liststr))
start_page, end_page = list(map(int, pages.split('-'))) # 将字符串数组转换成整形数组
start_page -= 1
try:
print(f'开始分割{start_page}页-{end_page}页,保存为{pdf_file}......')
pdf_output = PdfFileWriter() # 实例一个 PDF文件编写器
for i in range(start_page, end_page):
pdf_output.addPage(pdfReader.getPage(i))
with open(pdf_files, 'wb') as sub_fp:
pdf_output.write(sub_fp)
print(f'完成分割{start_page}页-{end_page}页,保存为{pdf_file}!')
except IndexError:
print(f'分割页数超过了PDF的页数')
# fp.close()
except Exception as e:
print(e)
finally:
fp_read_file.close()
return
# 合并pdf
def merge_pdfs(out_path=None, out_file='new', *read_file_paths):
# print(type(read_file_path))
if not read_file_paths:
print('请重新选择文件')
else:
read_file_path = read_file_paths[0]
out_path = mkdir(read_file_path, out_path)
pdf_name = f'{out_file}.pdf'
output = os.path.join(out_path, pdf_name)
pdf_writer = PdfFileWriter()
for File in read_file_paths:
# 依次循环打开要合并文件
pdfReader = PdfFileReader(open(File, 'rb'))
numPages = pdfReader.getNumPages()
for index in range(0, numPages):
pageObj = pdfReader.getPage(index)
pdf_writer.addPage(pageObj)
# 把这个已合并了的PDF文档存储起来
with open(output, 'wb') as out:
pdf_writer.write(out)
return
# 删除PDF页
def delete_pdf(read_file_path, index, out_path=None):
out_path = mkdir(read_file_path, out_path)
pdfReader = PdfFileReader(open(read_file_path, "rb"))
pages = pdfReader.getNumPages()
pdf_writer = PdfFileWriter()
pdf_file = os.path.join(out_path, f'{os.path.basename(read_file_path)[:-4].replace(" ", "")}new.pdf')
print(pdf_file)
for page in range(pages):
if page + 1 in index:
continue
pdf_writer.addPage(pdfReader.getPage(page))
with open(pdf_file, 'wb') as out:
pdf_writer.write(out)
return


推荐阅读
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • 本文介绍了一个Python函数same_set,用于判断两个相等长度的数组是否包含相同的元素。函数会忽略元素的顺序和重复次数,如果两个数组包含相同的元素,则返回1,否则返回0。文章还提供了函数的具体实现代码和样例输入输出。 ... [详细]
  • 从相邻元素对还原数组的解题思路和代码
    本文介绍了从相邻元素对还原数组的解题思路和代码。思路是使用HashMap存放邻接关系,并找出起始点,然后依次取。代码使用了HashMap来存放起始点所在的adjacentPairs中的位置,并对重复的起始点进行处理。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
author-avatar
三号天宫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有