Python實(shí)現(xiàn)合并與拆分多個PDF文檔中的指定頁
安裝所需要的庫
pip install PyPDF2 -i https://pypi.tuna.tsinghua.edu.cn/simple
將多個PDF文檔中的指定頁,合并生成新的PDF
代碼如下:
from PyPDF2 import PdfReader, PdfWriter
# pip install PyPDF2 -i https://pypi.tuna.tsinghua.edu.cn/simple
# 定義要處理的PDF文件及其完整路徑
pdf_files = {
'數(shù)模.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\數(shù)學(xué)一模每日一練5(3.18).pdf', # 替換為A.pdf的實(shí)際路徑
'數(shù)招.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\自招考試—數(shù)學(xué)每日一練5(3.18).pdf', # 替換為B.pdf的實(shí)際路徑
'物模.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\物理一模每日一練5(3.18).pdf', # 替換為C.pdf的實(shí)際路徑
'物招.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\自招考試—物理每日一練5(3.18).pdf', # 替換為C.pdf的實(shí)際路徑
'化模.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\化學(xué)一模每日一練5(3.18).pdf', # 替換為C.pdf的實(shí)際路徑
'化招.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\自招版—化學(xué)每日一練5(3.18).pdf' # 替換為C.pdf的實(shí)際路徑
}
# 定義要提取的頁碼(注意:頁碼從0開始)
pages_to_extract = {
'數(shù)模.pdf': [0], # 提取A.pdf的第1頁和第3頁
'數(shù)招.pdf': [0], # 提取B.pdf的第2頁
'物模.pdf': [0], # 提取C.pdf的第1頁和第2頁
'物招.pdf': [0], # 提取A.pdf的第1頁和第3頁
'化模.pdf': [0], # 提取B.pdf的第2頁
'化招.pdf': [0] # 提取C.pdf的第1頁和第2頁
}
# 創(chuàng)建一個PdfWriter對象來保存合并后的PDF
output_pdf = PdfWriter()
# 遍歷每個PDF文件
for pdf_name, pdf_path in pdf_files.items():
# 讀取PDF文件
reader = PdfReader(pdf_path)
# 獲取要提取的頁碼
pages = pages_to_extract.get(pdf_name, [])
# 遍歷要提取的頁碼
for page_num in pages:
# 獲取指定頁
page = reader.pages[page_num]
# 將頁添加到輸出PDF中
output_pdf.add_page(page)
# 將合并后的PDF寫入到輸出文件
output_path = r'D:\Users\Desktop\0319.pdf' # 替換為輸出文件的實(shí)際路徑
with open(output_path, 'wb') as output_file:
output_pdf.write(output_file)
print(f"PDF合并完成,已保存為 {output_path}")
代碼說明:
- PdfReader:用于讀取 PDF 文件。
- PdfWriter:用于創(chuàng)建和寫入新的 PDF 文件。
- pages_to_extract:一個字典,指定每個 PDF 文件中要提取的頁碼。注意,頁碼從 0 開始。
- output_pdf.add_page(page):將指定的頁面添加到輸出 PDF 中。
- output_pdf.write(output_file):將合并后的 PDF 寫入到輸出文件。
拆分PDF
代碼如下:
from PyPDF2 import PdfReader, PdfWriter
import os
# 定義要處理的PDF文件及其完整路徑
pdf_files = {
'a.pdf': '/path/to/a.pdf', # 替換為a.pdf的實(shí)際路徑
'b.pdf': '/path/to/b.pdf', # 替換為b.pdf的實(shí)際路徑
'c.pdf': '/path/to/c.pdf' # 替換為c.pdf的實(shí)際路徑
}
# 定義輸出目錄
output_dir = '/path/to/output' # 替換為輸出目錄的實(shí)際路徑
# 如果輸出目錄不存在,則創(chuàng)建它
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# 遍歷每個PDF文件
for pdf_name, pdf_path in pdf_files.items():
# 讀取PDF文件
reader = PdfReader(pdf_path)
# 遍歷PDF的每一頁
for page_num, page in enumerate(reader.pages):
# 創(chuàng)建一個PdfWriter對象
writer = PdfWriter()
# 將當(dāng)前頁添加到PdfWriter中
writer.add_page(page)
# 生成輸出文件名
output_filename = os.path.join(output_dir, f'{pdf_name}_page_{page_num + 1}.pdf')
# 將當(dāng)前頁保存為一個單獨(dú)的PDF文件
with open(output_filename, 'wb') as output_file:
writer.write(output_file)
print(f"已保存: {output_filename}")
print("所有頁面已拆分為單獨(dú)的PDF文件!")
代碼說明:
PdfReader:- 用于讀取 PDF 文件。
PdfWriter:- 用于創(chuàng)建新的 PDF 文件。
os.makedirs(output_dir):- 如果輸出目錄不存在,則創(chuàng)建它。
enumerate(reader.pages):- 遍歷 PDF 的每一頁,
page_num是頁碼(從 0 開始),page是當(dāng)前頁內(nèi)容。
- 遍歷 PDF 的每一頁,
output_filename:- 生成輸出文件的路徑和名稱,格式為
{pdf_name}_page_{page_num + 1}.pdf(例如a.pdf_page_1.pdf)。
- 生成輸出文件的路徑和名稱,格式為
writer.write(output_file):- 將當(dāng)前頁保存為一個單獨(dú)的 PDF 文件。
方法擴(kuò)展
下面小編為大家整理了一些Python關(guān)于PDF文檔的其他應(yīng)用,希望對大家有所幫助
1.python提取多個pdf特定頁,并合并為新pdf文件
方法如下
import os
from PyPDF2 import PdfReader, PdfWriter
class PdfMerge:
def __init__(self, fileList, dstFile):
self.fileList = fileList
self.dstFile = dstFile
def readPdf(self, pdfFile, pageRange):
pageList = []
pdf_reader = PdfReader(pdfFile)
for i in range(len(pdf_reader.pages)):
if i in pageRange:
pageList.append(pdf_reader.pages[i])
return pageList
def writePdf(self, pageList):
pdf_writer = PdfWriter()
for page in pageList:
pdf_writer.add_page(page)
with open(self.dstFile, 'wb') as out:
pdf_writer.write(out)
def getRangeList(self, rangeStr):
rangeList = []
if rangeStr.find(':') >= 0:
r = rangeStr.split(':')
if len(r) != 2:
print("rangeStr[%s] split [:] failed!"%(rangeStr))
return rangeList
mi = int(r[0])
ma = int(r[1])
for i in range(mi, ma):
rangeList.append(i)
elif rangeStr.find(',') >= 0:
r = rangeStr.split(',')
mi = int(r[0])
ma = int(r[1])
for i in r:
rangeList.append(int(i))
elif rangeStr.isnumeric():
rangeList.append(int(rangeStr))
else:
print("rangeStr split failed! not find [:] and [,]")
return rangeList
def mergePdf(self):
pageList = []
for pdf in self.fileList:
file = pdf["file"]
fileRange = self.getRangeList(pdf["range"])
print("file[{}] rangeStr[{}] rangeList{}".format(file, pdf["range"], fileRange))
pageList.extend(self.readPdf(file, fileRange))
self.writePdf(pageList)
def main():
fileList = [{"file":"source/1_任務(wù)書.pdf", "range":"0:10"},{"file":"source/20230409074902162.pdf", "range":"0"}]
# fileList = [{"file":"source/1_任務(wù)書.pdf", "range":"0,1,5,6,7"},{"file":"source/20230409074902162.pdf", "range":"0"}]
fileProcess = PdfMerge(fileList, "source/任務(wù)書.pdf")
fileProcess.mergePdf()
if __name__ == "__main__":
main()
2.批量截取PDF指定頁面
說明:此腳本用于批量截取pdf指定頁面。
import os
from PyPDF2 import PdfFileWriter, PdfFileReader
def get_file(path, all_files):
FileNames = os.listdir(path)
for file_name in FileNames:
cur_path = os.path.join(path, file_name)
if os.path.isdir(cur_path):
get_file(cur_path, all_files)
else:
if file_name.endswith('.pdf'):
all_files.append(cur_path)
return all_files
def extract_one_pdf(pdf_path, save_dir, start_page, end_page):
pdf_name = pdf_path.split("\\")[-1]
print(f"Processing file -- {pdf_path}")
if not os.path.exists(save_dir):
print(save_dir)
os.makedirs(save_dir)
pdf_file = PdfFileReader(pdf_path, strict=False)
pdf_pages = pdf_file.getNumPages()
if not -1 < start_page < end_page < pdf_pages:
raise ValueError("Pages Error")
pdf_output = PdfFileWriter()
for i in range(start_page, end_page):
page = pdf_file.getPage(i)
pdf_output.addPage(page)
with open(save_dir + pdf_name, 'wb') as out:
pdf_output.write(out)
def extract_many_pdf(pdf_dir_path, save_path, start_page, end_page):
source_files = get_file(pdf_dir_path, [])
for i, file in enumerate(source_files):
file_name = file.split("\\")[-1]
save_file = file.replace(pdf_dir_path, save_path)
save_dir = save_file.replace(file_name, '')
extract_one_pdf(file, save_dir, start_page, end_page)
if __name__ == '__main__':
path = "C:\\Users\\Lenovo\\Desktop\\test\\"
out_path = "C:\\Users\\Lenovo\\Desktop\\pdf_out\\"
extract_many_pdf(path, out_path, 0, 1)
到此這篇關(guān)于Python實(shí)現(xiàn)合并與拆分多個PDF文檔中的指定頁的文章就介紹到這了,更多相關(guān)Python合并與拆分PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python filter過濾器原理及實(shí)例應(yīng)用
這篇文章主要介紹了Python filter過濾器原理及實(shí)例應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
python爬蟲入門教程--利用requests構(gòu)建知乎API(三)
這篇文章主要給大家介紹了關(guān)于python爬蟲入門之利用requests構(gòu)建知乎API的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。2017-05-05
使用Python自動處理Excel數(shù)據(jù)缺失值的完整指南
在數(shù)據(jù)分析中,數(shù)據(jù)清洗是至關(guān)重要的第一步,尤其在處理 Excel 文件時,缺失值常常會阻礙分析流程,本文將通過一個自動化腳本,展示如何使用 Python 的 pandas 和 scikit-learn 庫,快速填充或刪除 Excel 文件中的缺失值,并最終生成干凈的數(shù)據(jù)集,需要的朋友可以參考下2025-04-04
python中實(shí)現(xiàn)定制類的特殊方法總結(jié)
這篇文章主要介紹了python中實(shí)現(xiàn)定制類的特殊方法總結(jié),本文講解了__str__、__iter__、__getitem__、__getattr__、__call__等特殊方法,需要的朋友可以參考下2014-09-09
pycharm使用matplotlib.pyplot不顯示圖形的解決方法
今天小編就為大家分享一篇pycharm使用matplotlib.pyplot不顯示圖形的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
解決python繪圖使用subplots出現(xiàn)標(biāo)題重疊的問題
這篇文章主要介紹了python繪圖使用subplots出現(xiàn)標(biāo)題重疊的問題及解決方法,本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-04-04

