Python實現(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ù)招.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\自招考試—數(shù)學(xué)每日一練5(3.18).pdf', # 替換為B.pdf的實際路徑 '物模.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\物理一模每日一練5(3.18).pdf', # 替換為C.pdf的實際路徑 '物招.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\自招考試—物理每日一練5(3.18).pdf', # 替換為C.pdf的實際路徑 '化模.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\化學(xué)一模每日一練5(3.18).pdf', # 替換為C.pdf的實際路徑 '化招.pdf': r'D:\Users\Documents\WeChat Files\FileStorage\File\2025-03\自招版—化學(xué)每日一練5(3.18).pdf' # 替換為C.pdf的實際路徑 } # 定義要提取的頁碼(注意:頁碼從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' # 替換為輸出文件的實際路徑 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的實際路徑 'b.pdf': '/path/to/b.pdf', # 替換為b.pdf的實際路徑 'c.pdf': '/path/to/c.pdf' # 替換為c.pdf的實際路徑 } # 定義輸出目錄 output_dir = '/path/to/output' # 替換為輸出目錄的實際路徑 # 如果輸出目錄不存在,則創(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實現(xiàn)合并與拆分多個PDF文檔中的指定頁的文章就介紹到這了,更多相關(guān)Python合并與拆分PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
手把手教你用Python打造互動式中秋節(jié)慶祝小程序
中秋節(jié)將至,本文提供了一個使用Python開發(fā)的中秋節(jié)慶祝小程序教程,通過簡單的步驟,您可以創(chuàng)建一個具有節(jié)日祝福、互動式燈謎游戲和模擬中秋明月動態(tài)背景的小程序,文章詳細(xì)介紹了程序的功能、實現(xiàn)步驟以及如何運(yùn)行程序,需要的朋友可以參考下2024-09-09使用python?itertools實現(xiàn)計算雙十一滿減湊單
一年一度的雙十一又到了,在這樣一個日子中,可能遇到一些問題,首先是“湊單”問題,本文將使用python中的itertools庫解決這一問題,感興趣的可以了解下2024-11-11Python中函數(shù)的參數(shù)定義和可變參數(shù)用法實例分析
這篇文章主要介紹了Python中函數(shù)的參數(shù)定義和可變參數(shù)用法,以實例形式較為詳細(xì)的分析了Python中參數(shù)定義與可變參數(shù)的具體使用方法,需要的朋友可以參考下2015-06-06