python处理PDF合并、拆分、删除、转换

您所在的位置:网站首页 pdf直接删除页 python处理PDF合并、拆分、删除、转换

python处理PDF合并、拆分、删除、转换

2023-08-16 02:59| 来源: 网络整理| 查看: 265

目录 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('待插入文件页码范围大于文件页数') return elif 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() # 文件页数 # 输出文件页数,整除页数一致,非整除页数+1 output_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-1 end = (file+1) * num_page if file 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 glob def 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() # 使用图片创建单页的 PDF imgpdf = 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) 举例

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3