目录

  • PDF合并、拆分、删除页面
  • 图片转PDF
    • 举例

PDF合并、拆分、删除页面

2种合并方式:多个文件合并为一个文件,在文件中插入其他文件页面
2种分割方式:文件分割为固定页数,分割提取连续多页
2种删除方式:删除文件连续多页,删除文件非连续多页
代码如下:

from PyPDF2 import PdfFileReader, PdfFileWriter
from natsort import natsorted  # 自然排序,需要安装natsort
import os.path
from glob import glob
​
def pdf_merge_1(pdf_path):"""将文件夹下所有PDF文件按自然顺序合并为一个文件:param str pdf_path: 待合并PDF文件所在文件夹"""pdf_writer = PdfFileWriter()output_filename = pdf_path + r'\PDF合并生成文件.pdf'pdf_list = natsorted(glob(pdf_path +'\\*.pdf'))  # *前可指定前缀for pdf in pdf_list:pdf_reader = PdfFileReader(open(pdf, 'rb'))page_count = pdf_reader.getNumPages()  # 文件页数
​for page in range(page_count):pdf_writer.addPage(pdf_reader.getPage(page))
​with open(output_filename, 'wb') as out:pdf_writer.write(out)print('成功生成文件:{}'.format(output_filename))
​
def pdf_merge_2(pdf_input, page_insert, pdf_insert, page_range):"""在PDF文件某页后插入另一文件的连续数页,生成一个新的文件(从0计数,页码范围左闭右开):param str pdf_input: 原PDF文件,需要插入其他PDF文件页:param int page_insert: 在原PDF文件第几页后插入,从0计数:param str pdf_insert: 在原PDF文件中,需要插入的其他PDF文件:param list[int, int] page_range: 需要插入的其他PDF文件页码范围[m, n],左闭右开"""pdf_reader = PdfFileReader(open(pdf_input, 'rb'))  # 原PDF文件page_count = pdf_reader.getNumPages()  # 原文件页数pdf_reader_1 = PdfFileReader(open(pdf_insert, 'rb'))  # 原PDF文件page_count_1 = pdf_reader_1.getNumPages()  # 原文件页数pdf_writer = PdfFileWriter()output_filename = os.path.splitext(pdf_input)[0] + r'_插入连续页.pdf'  # 保存至同一文件夹,获取路径及文件名,不含后缀名if page_range[1] > page_count_1:print('待插入文件页码范围大于文件页数')returnelif len(page_range) > 2:print('page_range应为2个int元素的列表')return
​for page in range(page_count):if page != page_insert:pdf_writer.addPage(pdf_reader.getPage(page))  # 原文件页else:pdf_writer.addPage(pdf_reader.getPage(page))  # 原文件页for p in range(page_range[0], page_range[1]):pdf_writer.addPage(pdf_reader_1.getPage(p))  # 插入文件页,左闭右开
​with open(output_filename, 'wb') as out:pdf_writer.write(out)print('成功生成文件:{}'.format(output_filename))
​
def pdf_split_1(pdf_input, num_page=1):"""将PDF文件分割为指定页数的文件,最后多余的为一个文件:param str pdf_input: 待分割PDF文件:param int num_page: 每次分割页数"""fname = os.path.splitext(pdf_input)[0]  # 保存至同一文件夹,获取路径及文件名,不含后缀名with open(pdf_input, 'rb') as open_pdf:pdf_reader = PdfFileReader(open_pdf)page_count = pdf_reader.getNumPages()  # 文件页数# 输出文件页数,整除页数一致,非整除页数+1output_count = page_count // num_page + (1 if page_count % num_page else 0)for file in range(output_count):pdf_writer = PdfFileWriter()start = file * num_page  # 左闭  # 从0计数output_count-1end = (file+1) * num_page if file < (output_count-1) else page_count  # 右开for page in range(start, end):pdf_writer.addPage(pdf_reader.getPage(page))output_filename = fname + r'_{}-{}.pdf'.format(start,end-1)print(output_filename)with open(output_filename, 'wb') as out:pdf_writer.write(out)print('成功生成文件:{}'.format(output_filename))
​
def pdf_split_2(pdf_input, page_range):"""分割保存目标PDF文件从0计数页数[start : end):param str pdf_input: 待分割PDF文件:param list[int, int] page_range: 待分割PDF文件页码范围[m, n],左闭右开"""pdf_reader = PdfFileReader(open(pdf_input, 'rb'))pdf_writer = PdfFileWriter()page_count = pdf_reader.getNumPages()  # 文件页数fname = os.path.splitext(pdf_input)[0]  # 保存至同一文件夹,获取路径及文件名,不含后缀名output_filename = fname + r'_{}-{}.pdf'.format(page_range[0],page_range[1]-1)if page_range[1] > page_count:print('待分割页码范围大于文件页数')return
​for page in range(page_range[0], page_range[1]):pdf_writer.addPage(pdf_reader.getPage(page))
​with open(output_filename, 'wb') as out:pdf_writer.write(out)print('成功生成文件:{}'.format(output_filename))
​
def pdf_delete_1(pdf_input, page_range):"""删除保存目标PDF文件连续多页(从0计数,页码范围左闭右开):param str pdf_input: 待删除页面PDF文件:param list[int, int] page_range: 待删除PDF文件页码范围[m, n],左闭右开"""pdf_reader = PdfFileReader(open(pdf_input, 'rb'))pdf_writer = PdfFileWriter()page_count = pdf_reader.getNumPages()  # 文件页数output_filename = os.path.splitext(pdf_input)[0] + r'_删除连续页.pdf'  # 保存至同一文件夹,获取路径及文件名,不含后缀名if len(page_range) > 2:print('page_range应为2个int元素的列表')return
​for page in range(page_count):if page in range(page_range[0], page_range[1]):continue  # 忽略待删除页码范围else:pdf_writer.addPage(pdf_reader.getPage(page))
​with open(output_filename, 'wb') as out:pdf_writer.write(out)print('成功生成文件:{}'.format(output_filename))
​
def pdf_delete_2(pdf_input, page_range):"""删除保存目标PDF文件 “非连续” 多页(从0计数):param str pdf_input: 待删除页面PDF文件:param list[int, int] page_range: 待删除PDF文件页码列表[m, n]"""pdf_reader = PdfFileReader(open(pdf_input, 'rb'))pdf_writer = PdfFileWriter()page_count = pdf_reader.getNumPages()  # 文件页数output_filename = os.path.splitext(pdf_input)[0] + r'_删除非连续页.pdf'  # 保存至同一文件夹,获取路径及文件名,不含后缀名for page in range(page_count):if page in page_range:continue  # 忽略待删除页码范围else:pdf_writer.addPage(pdf_reader.getPage(page))
​with open(output_filename, 'wb') as out:pdf_writer.write(out)print('成功生成文件:{}'.format(output_filename))
​
if __name__ == '__main__':pdf_path = r'E:\测试'pdf_input = r'E:\测试\合并文件1.pdf'pdf_insert = r'E:\测试\合并文件2.pdf'file_name = r'E:\测试\拆分文件.pdf'pdf_del = r'E:\测试\删除文件.pdf'#pdf_merge_1(pdf_path)#pdf_merge_2(pdf_input, 2, pdf_insert, [2, 4])#pdf_split_1(file_name, 2)#pdf_split_2(file_name, [1, 4])#pdf_delete_1(pdf_del, [3, 5])#pdf_delete_2(pdf_del, [1, 3, 5])

图片转PDF

3种转换方式:文件夹所有图片转为1个PDF;文件夹指定图片转为1个PDF;文件夹所有图片分别转为PDF

import fitz  # 需安装pymupdf库
from natsort import natsorted  # 自然排序,需要安装natsort
import os.path
from glob import globdef img2pdf_1(img_path, pdf_path, pdf_name):"""将文件夹中所有格式图片全部转换为一个指定名称的pdf文件,并保存至指定文件夹"""doc = fitz.open()filepath = []for x in ['*.jpg','*.png']:  # 获取所有格式的图片filepath.extend(glob(img_path +'\\' + x))  # 将列表元素追加到列表中for img in natsorted(filepath):  # 读取图片,确保按文件名按自然排序imgdoc = fitz.open(img)                 # 打开图片pdfbytes = imgdoc.convert_to_pdf()      # 使用图片创建单页的 PDFimgpdf = fitz.open("pdf", pdfbytes)doc.insert_pdf(imgpdf)                  # 将当前页插入文档doc.save(pdf_path + '\\' + pdf_name)        # 保存pdf文件doc.close()print("转换完成")def img2pdf_2(img_path, pdf_path, img_list, pdf_name):"""将文件夹中指定1个或多个图片转换为1个指定名称的pdf文件,并保存至指定文件夹"""doc = fitz.open()pic_list = [img_path+'\\'+i for i in img_list]for img in natsorted(pic_list):  # 读取图片列表,确保按文件名排序imgdoc = fitz.open(img)pdfbytes = imgdoc.convert_to_pdf()imgpdf = fitz.open("pdf", pdfbytes)doc.insert_pdf(imgpdf)doc.save(pdf_path + '\\' + pdf_name)doc.close()print("转换完成")def img2pdf_3(img_path, pdf_path):"""将文件夹中所有jpg图片分别转换为同一名称的pdf文件,并保存至指定文件夹"""filepath = []for x in ['*.jpg','*.png']:  # 获取所有格式的图片filepath.extend(glob(img_path +'\\' + x))  # 将列表元素追加到列表中for img in filepath:  # 读取图片img_type = os.path.splitext(img)[1]  # 获取图片格式,splitext分割文件路径名和扩展名file_name = os.path.basename(img).replace(img_type, '.pdf')  # 获取不含路径文件名,替换为pdf后缀名doc = fitz.open()imgdoc = fitz.open(img)pdfbytes = imgdoc.convert_to_pdf()imgpdf = fitz.open("pdf", pdfbytes)doc.insert_pdf(imgpdf)doc.save(pdf_path + '\\' + file_name)doc.close()print("转换完成")if __name__ == '__main__':img_path = r'E:\测试\jpg'pdf_path = r'E:\测试\jpg'img_list1, pdf_name1 = ['001.jpg', '002.jpg'], '2.pdf'img2pdf_1(img_path, pdf_path, '1.pdf')img2pdf_2(img_path, pdf_path, img_list1, pdf_name1)img2pdf_3(img_path, img_path)

举例

python处理PDF合并、拆分、删除、转换相关推荐

  1. python 1 2 3怎么拼接所有可能的数_6000字长文,带你用Python完成 “Excel合并(拆分)” 的各种操作!...

    原标题:6000字长文,带你用Python完成 "Excel合并(拆分)" 的各种操作! 一.概述 其实Excel合并这个需求,应该是一个极为普遍的需求了.今天我们就利用Pytho ...

  2. 用Python完成 “Excel合并(拆分)” 的各种自动化操作!

    一.概述 其实Excel合并这个需求,应该是一个极为普遍的需求了.今天我们就利用Python完成"Excel合并(拆分)" 操作,具体如下: ① 将多个Excel表,合并到一个Ex ...

  3. 6000字长文,带你用Python完成 “Excel合并(拆分)” 的各种操作!

    作者丨黄伟呢 来源丨数据分析与统计学之美 一.概述 ‍‍‍‍‍‍‍‍‍ 其实Excel合并这个需求,应该是一个极为普遍的需求了.今天我们就利用Python完成"Excel合并(拆分)&quo ...

  4. pdf怎么分成多个文件?这个方法轻松搞定合并拆分PDF!

    PDF文档是我们日常工作.学习中常用的文件格式之一.有时候我们需要对大型PDF文档进行拆分,以便更快地找到自己需要的部分或在传输等方面节省时间.下面介绍两种常见的拆分PDF文档的方法. 方法一:在PD ...

  5. 合并工具_你值得拥有这个PDF合并工具 免费获取转换方法

    合并PDF文件?很多人在日常生活中经常会需要使用到合并文档的要求,但是不是所有的人都能够很熟练的去合并我们生活中常用的文件,例如PDF,例如Word和Excel等等,其实只要我们学会了PDF合并的方法 ...

  6. 怎么将PDF文件拆分成多个文件?2个方法帮你搞定

    PDF格式在日常办公学习中经常被使用,因为它不仅易于阅读和浏览,而且文件大小相对较小,兼容性也很强.然而,有时候当PDF文件内容较多时,找到文件中重要内容可能会变得困难.为了解决这个问题,我们可以尝试 ...

  7. 如何将两个PDF合并成一个PDF,几个方法教会你简单操作!

    在日常工作或者学习过程中,我们经常会收到许多的文件,而我们收到的文件有可能是各种格式的文档,为了统一格式,或者便于保存,我们会将它们统一转换成PDF格式的文件,因为PDF文件不易出现问题.而转换后的文 ...

  8. python处理pdf文件的程序_Python处理PDF文档-拆分合并

    使用Python处理PDF文档.将需要处理的PDF文档与处理程序放到一个新建的文件夹中.运行程序. S模式,将单个PDF文档拆分到单页,并以数字命名. image.png C模式,合并文档,需要提前将 ...

  9. PDF合并,PDF拆分,PDF转换

    PDF合并,PDF拆分,PDF转换 由于工作需要处理PDF文件,在网上找了一些工具.但还是不太方便.有的甚至需要充钱才能处理.于是多方整理终于可以自己解决了. python首先导入需要的库如下: im ...

最新文章

  1. iOS 性能优化总结
  2. 【iOS-Cocos2d游戏开发之五】【1】多触点与触屏事件详解(单一监听、事件分发)...
  3. 如何获得Oracle系统性能统计? Oracle大型数据库系统在AIXUNIX上的实战详解 集中讨...
  4. 如何找出电脑里的流氓软件_啥拦截软件都挡不住?教你一键揪出乱弹窗的流氓软件...
  5. fguillot json rpc_Hyperf 框架创建 JSON-rpc 服务
  6. jmeter生成html报告修改,jmeter:测试后生成html报告
  7. c语言将字符串按空格分割_字符串单词输入反向输出怎么搞?C语言又带着二维数组来了!...
  8. Gamma函数(伽玛函数)的一阶导数、二阶导数公式推导及java程序
  9. c语言操作目录,c语言中目录及文件操作.doc
  10. datatable 动态显示/隐藏列
  11. [07] 使用注解完成IOC配置
  12. VGG16迁移学习,实现医学图像识别分类工程项目
  13. Swaps and Inversions hdu多校训练第二场 树状数组求逆序数+离散化
  14. 远程工作两个月的体会(转)
  15. 在Ubuntu 20.04(含Xubuntu、Linux Mint Cinnamon等衍生版)上安装Wine QQ,获得更佳的使用体验
  16. 如鹏网.NET软件工程师提高班 杨中科.net高级视频
  17. 【图解数据结构】队列全面总结
  18. 服务器怎么关闭防火墙
  19. c++ vector基本函数、排序、查找用法
  20. CCF CSP 公共钥匙盒

热门文章

  1. 你家路由器还在闲置吗?快拿过来刷不同固件系统,做wifi放大器不香么?让家里处处有网。
  2. 怎么调python界面颜色_手把手教你配置最漂亮的PyCharm界面,Python程序员必备!...
  3. 查看java版本和安装路径
  4. 超全面试总结——数据仓库 超详细!!!带答案!!!持续更新中~
  5. 虚拟机网络配置(ubuntu16.04)
  6. 用友T6的销售管理在填制发货单后并审核,然后鼠标右键【联查对应的发票】,却能查询出与它毫无关联的发票,(该发货单未开发票).
  7. 对Rollup的学习使用
  8. SQL2000数据库附加失败提示:crosoft SQL-DMO(ODBC SQLState:HY000) 错误 3456:未能恢复日志记录(428653:5176:89) 解决方法教程
  9. win7打开计算机没盘符,计算机U盘盘符不显示怎么办?Win7系统U盘不显解决办法...
  10. U-BOOT小全(五):BootLoader源码(SPL-UBoot 2)