Python使用PyPDF2輕松實(shí)現(xiàn)pdf的拆分與合并
背景
日常工作中使用 pdf 文件時(shí),拆分與合并是一個(gè)十分常見(jiàn)的操作。
特別是在使用問(wèn)答形式的 AI 工具時(shí),部分工具可能對(duì) pdf 文件的大小有一定的限制,這時(shí)就需要將原來(lái)的大 pdf 文件拆分為若干個(gè)小文件。
當(dāng)需要拆分和合并的 pdf 量級(jí)較少時(shí),通過(guò)一些在線工具或桌面應(yīng)用就可以很好的解決;但當(dāng)需要批量處理時(shí),可通過(guò)幾句簡(jiǎn)單的 python 代碼來(lái)實(shí)現(xiàn)。
以下基于 python 3.X 環(huán)境 + PyPDF2 第三方庫(kù),從多個(gè)實(shí)際使用場(chǎng)景出發(fā),梳理出了一些可直接復(fù)制粘貼使用的完整代碼及一些常見(jiàn)注意事項(xiàng)。
拆分,包括:逐頁(yè)拆分、連續(xù)頁(yè)拆分、指定頁(yè)拆分(可以為非連續(xù)頁(yè))。
合并,包括:多個(gè)合并成一個(gè)、在原文件后添加一頁(yè)。
環(huán)境安裝
本文所有用法均是基于第三方庫(kù) PyPDF2 ,該庫(kù)可直接通過(guò) pip 命令實(shí)現(xiàn)安裝。
完整命令如下:
pip install PyPDF2
需要注意的是:PyPDF2 本身不支持 python 2.X,因此本文的所有用法都是基于 python 3.X 版本。
pdf 拆分
逐頁(yè)拆分
逐頁(yè)拆分 pdf ,即將原 pdf 中的每一頁(yè)拆分為單獨(dú)的 pdf,這種做法較為少用。
可作為了解 PyPDF2 基礎(chǔ)用法的參考,復(fù)制以下代碼,將路徑修改為自己需要拆分的 pdf 路徑,運(yùn)行即可。
from PyPDF2 import PdfReader, PdfWriter
import os
# 逐頁(yè)拆分pdf,將pdf中的每一頁(yè)拆分為單獨(dú)的pdf
def split_pdf(input_pdf_path, output_dir):
# 創(chuàng)建 PdfReader 對(duì)象
reader = PdfReader(input_pdf_path)
# 遍歷原 PDF d的每一頁(yè),逐頁(yè)拆分
for page_number in range(len(reader.pages)):
output_path = os.path.join(output_dir, f"page_{page_number}.pdf")
writer = PdfWriter()
writer.add_page(reader.pages[page_number])
with open(output_path, "wb") as output_file:
writer.write(output_file)
print(f"Page {page_number + 1} saved to {output_path}")
if __name__=="__main__":
# 需要拆分的PDF完整路徑
input_pdf = 'data/test.pdf'
# 逐頁(yè)拆分后每個(gè)單獨(dú)PDF保存的文件夾路徑,注意是文件夾的路徑
output_file = 'data/'
split_pdf(input_pdf,output_file)上述代碼,以 test.pdf 為例,運(yùn)行后的結(jié)果如下圖:

連續(xù)頁(yè)拆分
連續(xù)頁(yè)拆分,即提取原 pdf 中連續(xù)的幾頁(yè)。
如:原 test.pdf 中一共有 5 頁(yè),需要將第 2 頁(yè)、第 3 頁(yè)提取出來(lái)作為一個(gè)新的 pdf 文件。完整代碼如下。
from PyPDF2 import PdfReader, PdfWriter
import os
# 指定連續(xù)頁(yè)拆分pdf
def split_page_pdf(input_pdf_path, output_pdf_path,start_num,end_num):
# 創(chuàng)建 PdfReader 對(duì)象
reader = PdfReader(input_pdf_path)
# 創(chuàng)建 PdfWriter 對(duì)象
writer = PdfWriter()
# 指定連續(xù)的頁(yè)碼
for page_number in range(start_num,end_num):
writer.add_page(reader.pages[page_number])
# 保存到新pdf
with open(output_pdf_path, "wb") as output_file:
writer.write(output_file)
if __name__=="__main__":
# 需要拆分的PDF完整路徑
input_pdf = 'data/test.pdf'
# 拆分PDF保存的完整路徑
output_pdf = 'data/test1.pdf'
split_page_pdf(input_pdf,output_pdf,1,3)復(fù)制上述代碼,將文件路徑和需要提取的連續(xù)頁(yè)碼修改為自己需要的即可。
需要注意的是:代碼中的頁(yè)碼從 0 開(kāi)始,區(qū)間為左閉右開(kāi)。如上面的【1,3】中的 1 代表的是第 2 頁(yè)。
指定頁(yè)拆分
指定頁(yè)拆分,即是提取原 pdf 中的其中幾頁(yè),不一定是連續(xù)的頁(yè)。
如:原 test.pdf 中一共有 5 頁(yè),需要將第 1 頁(yè)、第 3 頁(yè)、第 5 頁(yè)提取出來(lái)作為一個(gè)新的 pdf 文件。完整代碼如下:
from PyPDF2 import PdfReader, PdfWriter
# 指定頁(yè)拆分pdf
def split_page_pdf(input_pdf_path, output_pdf_path,page_list):
# 創(chuàng)建 PdfReader 對(duì)象
reader = PdfReader(input_pdf_path)
# 創(chuàng)建 PdfWriter 對(duì)象
writer = PdfWriter()
for page_number in page_list:
writer.add_page(reader.pages[page_number])
# 保存到新pdf
with open(output_pdf_path, "wb") as output_file:
writer.write(output_file)
if __name__=="__main__":
# 需要拆分的PDF完整路徑
input_pdf = 'data/test.pdf'
# 拆分PDF保存的完整路徑
output_pdf = 'data/test2.pdf'
# 指定需要的pdf頁(yè)碼列表
page_list = [0, 2, 4]
split_page_pdf(input_pdf,output_pdf,page_list)復(fù)制上述代碼,將文件路徑和需要提取的指定頁(yè)的頁(yè)碼修改為自己需要的即可。
需要注意的是:代碼中的頁(yè)碼從 0 開(kāi)始。如上面的【0,2,4】,分別指的是第 1、3、5 頁(yè)。
pdf 合并
相對(duì)拆分來(lái)說(shuō),pdf 合并的場(chǎng)景較少一點(diǎn),“多個(gè)合并成一個(gè)”和“在原文件后添加一頁(yè)”(可視為 2 個(gè) pdf 的合并)的使用方式是一樣的。
完整代碼如下。復(fù)制上述代碼,將需要合并的 pdf 文件路徑和保存的合并后的文件路徑改為自己需要的即可。
from PyPDF2 import PdfMerger
# 合并pdf
def merger_pdf(input_pdf,output_filename):
merger = PdfMerger()
for pdf_info in input_pdf:
merger.append(pdf_info)
with open(output_filename, "wb") as f_out:
merger.write(f_out)
print('合并完成!')
if __name__=="__main__":
# 需要合并的pdf文件完整路徑列表
pdf_list = ['data/page_0.pdf','data/page_4.pdf']
# 傳入需要合并的pdf文件完整路徑列表,和合并后的文件路徑及名稱(chēng)
merger_pdf(pdf_list,'data/page_test.pdf')以上就是基于 python 3.X + PyPDF2 的常見(jiàn)拆分與合并使用代碼塊,可供參考。
進(jìn)階技巧:旋轉(zhuǎn)頁(yè)面與提取文本
頁(yè)面旋轉(zhuǎn):對(duì)于掃描件中方向錯(cuò)誤的頁(yè)面,你可以使用 page.rotate(angle) 方法來(lái)旋轉(zhuǎn)頁(yè)面。需要注意的是,這個(gè)旋轉(zhuǎn)操作必須在將頁(yè)面添加到 PdfWriter 之前完成。
# 示例:在添加頁(yè)面前將其順時(shí)針旋轉(zhuǎn)90度 page = reader.pages[0] page.rotate(90) # 順時(shí)針旋轉(zhuǎn)90度 writer.add_page(page)
提取文本:PyPDF2 可以從PDF中提取文字,但性能相對(duì)一般,對(duì)于復(fù)雜的排版或掃描件效果可能不佳。
# 示例:提取第一頁(yè)的所有文本
reader = PdfReader('source.pdf')
first_page = reader.pages[0]
text = first_page.extract_text()
print(text)注意事項(xiàng)與提示
- 處理加密PDF:如果PDF文件設(shè)置了打開(kāi)密碼,你需要先使用
reader.decrypt('密碼')方法來(lái)解鎖,然后才能進(jìn)行后續(xù)的讀取和頁(yè)面提取操作。 - 批量處理:當(dāng)需要處理大量PDF文件時(shí),可以結(jié)合
os和glob模塊來(lái)遍歷指定目錄下的所有.pdf文件,然后調(diào)用上面的合并函數(shù),實(shí)現(xiàn)批量化自動(dòng)化操作。 - 錯(cuò)誤處理:為了代碼的健壯性,建議在文件操作時(shí)使用
try...except塊來(lái)捕獲FileNotFoundError(文件不存在)或PyPDF2.errors.PdfReadError(PDF格式錯(cuò)誤)等常見(jiàn)異常。
到此這篇關(guān)于Python使用PyPDF2輕松實(shí)現(xiàn)pdf的拆分與合并的文章就介紹到這了,更多相關(guān)Python PyPDF2拆分與合并pdf內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
DJango的創(chuàng)建和使用詳解(默認(rèn)數(shù)據(jù)庫(kù)sqlite3)
今天小編就為大家分享一篇DJango的創(chuàng)建和使用詳解(默認(rèn)數(shù)據(jù)庫(kù)sqlite3),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
使用Pandas對(duì)數(shù)據(jù)進(jìn)行篩選和排序的實(shí)現(xiàn)
這篇文章主要介紹了使用Pandas對(duì)數(shù)據(jù)進(jìn)行篩選和排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
解決Python print輸出不換行沒(méi)空格的問(wèn)題
今天小編就為大家分享一篇解決Python print輸出不換行沒(méi)空格的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
安裝Python后IDA中找不到Python模塊的問(wèn)題解決
有天在一臺(tái)新PC上安裝完IDA和Python之后,啟動(dòng)IDA報(bào)找不到Python模塊的問(wèn)題,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2021-10-10
Python實(shí)現(xiàn)服務(wù)端渲染SSR的示例代碼
服務(wù)端渲染是一種常見(jiàn)的技術(shù)策略,特別是在需要改善網(wǎng)站的搜索引擎優(yōu)化(SEO)和首屏加載時(shí)間的場(chǎng)景下,本文將介紹如何利用?Python?實(shí)現(xiàn)?SSR,感興趣的可以了解下2024-02-02
零基礎(chǔ)學(xué)python應(yīng)該從哪里入手
在本篇文章里小編給大家分享的是一篇關(guān)于零基礎(chǔ)學(xué)python應(yīng)該從哪里入手的相關(guān)基礎(chǔ)內(nèi)容,需要的朋友們可以參考下。2020-08-08

