目录
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)
举例
![在这里插入图片描述](https://img-blog.csdnimg.cn/bf53a0a3aace4e2991a5a9d3b52536b6.png#pic_center)
|