Python使用pypdf按文件大小智能拆分?PDF
在日常工作中,我們經(jīng)常會遇到超大的 PDF 文件(比如掃描書、論文合集、電子書等),直接上傳到郵箱、微信、網(wǎng)盤時經(jīng)常因為超過大小限制而失敗。這時候就需要把大 PDF 拆分成若干個小文件。
今天給大家分享一個超級實用的 Python 腳本:根據(jù)指定大?。ū热?4MB)自動拆分 PDF,而且每拆出來的一份都盡量接近但不超過目標大小,真正實現(xiàn)“按需拆分、物盡其用”!
安裝依賴(只需一次)
pip install pypdf
完整代碼(已添加詳細中文注釋)
from pypdf import PdfReader, PdfWriter
import os
import sys
def split_pdf_by_size(input_pdf, max_size_mb, output_dir):
"""
按指定大?。∕B)拆分 PDF 文件
:param input_pdf: 輸入的 PDF 文件路徑
:param max_size_mb: 每個分片的最大大小(MB)
:param output_dir: 輸出文件夾路徑
"""
# 將 MB 轉(zhuǎn)換成 bytes(1MB = 1024 * 1024 bytes)
max_size_bytes = max_size_mb * 1024 * 1024
# 讀取原始 PDF
try:
reader = PdfReader(input_pdf)
except Exception as e:
print(f"錯誤:無法讀取 PDF 文件!{e}")
return
total_pages = len(reader.pages)
print(f"總頁數(shù):{total_pages} 頁,準備按不超過 {max_size_mb} MB 進行拆分...")
# 創(chuàng)建輸出目錄
if not os.path.exists(output_dir):
os.makedirs(output_dir)
print(f"已創(chuàng)建輸出目錄:{output_dir}")
current_writer = PdfWriter() # 當前正在構(gòu)造的分片
current_size = 0 # 當前分片臨時大小
part_number = 1 # 分片編號
start_page = 0 # 當前分片的起始頁(從 0 開始計數(shù))
for page_num in range(total_pages):
# 把當前頁添加到 writer 中
current_writer.add_page(reader.pages[page_num])
# 為了準確獲取文件大小,需要先寫入一個臨時文件
temp_output = f"temp_part_{part_number}.pdf"
with open(temp_output, "wb") as temp_file:
current_writer.write(temp_file)
# 獲取臨時文件實際大小
current_size = os.path.getsize(temp_output)
# 判斷條件:超出大小限制 OR 已經(jīng)是最后一頁
if current_size > max_size_bytes or page_num == total_pages - 1:
# 最后一頁也滿足條件時,需要強制保存(即使沒超大?。?
if current_size > max_size_bytes and page_num != total_pages - 1:
# 超了!需要把最后一頁拿出來,單獨成下一份
# 先移除剛加的最后一頁
current_writer.remove_page(-1) # 移除最后一頁
# 重新寫入不包含最后一頁的正確文件
with open(temp_output, "wb") as temp_file:
current_writer.write(temp_file)
current_size = os.path.getsize(temp_output)
# 正式保存這一份
output_filename = f"Part_{part_number}_第{start_page+1}-{page_num+1 if current_size <= max_size_bytes else page_num}頁.pdf"
output_path = os.path.join(output_dir, output_filename)
# 如果前面移除了最后一頁,這里要重新寫入不包含最后一頁的版本
final_writer = current_writer if current_size <= max_size_bytes else PdfWriter()
if current_size > max_size_bytes:
# 重新構(gòu)建不包含最后一頁的 writer
for i in range(start_page, page_num):
final_writer.add_page(reader.pages[i])
with open(output_path, "wb") as output_file:
(final_writer if current_size > max_size_bytes else current_writer).write(output_file)
actual_size_mb = current_size / (1024 * 1024)
print(f"√ 已生成:{output_filename} ({actual_size_mb:.2f} MB)")
# 重置,為下一份做準備
current_writer = PdfWriter()
current_writer.add_page(reader.pages[page_num]) # 把被“擠出去”的那一頁放進新分片
start_page = page_num
part_number += 1
# 刪除臨時文件
os.remove(temp_output)
else:
# 沒超大小,繼續(xù)累加,刪除臨時文件
os.remove(temp_output)
# 清理可能的殘留臨時文件
for file in os.listdir("."):
if file.startswith("temp_part_"):
try:
os.remove(file)
except:
pass
print("\n?? 所有分片生成完畢!")
print(f"輸出目錄:{os.path.abspath(output_dir)}")
# ========================= 使用示例 =========================
if __name__ == "__main__":
# 請修改這里為你的實際路徑
input_pdf = r"C:\Users\Administrator\Downloads\BaiduNetdiskDownload\英文版\FORCE - Drawing Human Anatomy - 1E (2016).pdf"
max_size_mb = 4 # 每個文件不超過 4MB(微信、QQ、郵箱常用限制)
output_dir = "split_pdfs" # 輸出文件夾名稱
if not os.path.exists(input_pdf):
print("錯誤:PDF 文件路徑不存在!請檢查路徑是否正確。")
sys.exit(1)
split_pdf_by_size(input_pdf, max_size_mb, output_dir)實際效果示例
把一本 87MB 的《FORCE - Drawing Human Anatomy》拆分成 4MB 以內(nèi):
text
總頁數(shù):325 頁,準備按不超過 4 MB 進行拆分...
√ 已生成:Part_1_第1-68頁.pdf (3.98 MB)
√ 已生成:Part_2_第69-136頁.pdf (3.97 MB)
...
√ 已生成:Part_22_第310-325頁.pdf (2.41 MB)
?? 所有分片生成完畢!
到此這篇關于Python使用pypdf按文件大小智能拆分 PDF的文章就介紹到這了,更多相關Python拆分pdf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python實現(xiàn)一個點繞另一個點旋轉(zhuǎn)后的坐標
今天小編就為大家分享一篇python實現(xiàn)一個點繞另一個點旋轉(zhuǎn)后的坐標,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python將圖片文件轉(zhuǎn)換成base64編碼的方法
這篇文章主要介紹了python將圖片文件轉(zhuǎn)換成base64編碼的方法,涉及Python操作base64編碼的技巧,需要的朋友可以參考下2015-03-03

