最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用pypdf按文件大小智能拆分?PDF

 更新時間:2025年11月26日 09:42:03   作者:weixin_46244623  
在日常工作中,我們經(jīng)常會遇到超大的 PDF 文件,今天給大家分享一個超級實用的 Python 腳本,可以根據(jù)指定大?。ū热?nbsp;4MB)自動拆分 PDF,下面小編就和大家詳細(xì)講講吧

在日常工作中,我們經(jīng)常會遇到超大的 PDF 文件(比如掃描書、論文合集、電子書等),直接上傳到郵箱、微信、網(wǎng)盤時經(jīng)常因為超過大小限制而失敗。這時候就需要把大 PDF 拆分成若干個小文件。

今天給大家分享一個超級實用的 Python 腳本:根據(jù)指定大?。ū热?4MB)自動拆分 PDF,而且每拆出來的一份都盡量接近但不超過目標(biāo)大小,真正實現(xiàn)“按需拆分、物盡其用”!

安裝依賴(只需一次)

pip install pypdf

完整代碼(已添加詳細(xì)中文注釋)

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: 每個分片的最大大?。∕B)
    :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} 頁,準(zhǔn)備按不超過 {max_size_mb} MB 進(jìn)行拆分...")
    
    # 創(chuàng)建輸出目錄
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
        print(f"已創(chuàng)建輸出目錄:{output_dir}")
    
    current_writer = PdfWriter()   # 當(dāng)前正在構(gòu)造的分片
    current_size = 0               # 當(dāng)前分片臨時大小
    part_number = 1                # 分片編號
    start_page = 0                 # 當(dāng)前分片的起始頁(從 0 開始計數(shù))
    
    for page_num in range(total_pages):
        # 把當(dāng)前頁添加到 writer 中
        current_writer.add_page(reader.pages[page_num])
        
        # 為了準(zhǔn)確獲取文件大小,需要先寫入一個臨時文件
        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:
            # 最后一頁也滿足條件時,需要強(qiáng)制保存(即使沒超大小)
            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)")
            
            # 重置,為下一份做準(zhǔn)備
            current_writer = PdfWriter()
            current_writer.add_page(reader.pages[page_num])  # 把被“擠出去”的那一頁放進(jìn)新分片
            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 頁,準(zhǔn)備按不超過 4 MB 進(jìn)行拆分...
√ 已生成:Part_1_第1-68頁.pdf (3.98 MB)
√ 已生成:Part_2_第69-136頁.pdf (3.97 MB)
...
√ 已生成:Part_22_第310-325頁.pdf (2.41 MB)
?? 所有分片生成完畢!

到此這篇關(guān)于Python使用pypdf按文件大小智能拆分 PDF的文章就介紹到這了,更多相關(guān)Python拆分pdf內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python實現(xiàn)股票歷史數(shù)據(jù)可視化分析案例

    python實現(xiàn)股票歷史數(shù)據(jù)可視化分析案例

    股票交易數(shù)據(jù)分析可直觀股市走向,對于如何把握股票行情,快速解讀股票交易數(shù)據(jù)有不可替代的作用,感興趣的可以了解一下
    2021-06-06
  • Python字符串拼接的正確姿勢

    Python字符串拼接的正確姿勢

    字符串拼接,簡單說就是把多個字符串片段組合成一個新的字符串,在Python中,這幾乎是每天都要進(jìn)行的操作,無論是生成日志、構(gòu)建SQL語句、拼接URL還是格式化輸出,都離不開它,所以本文給大家介紹了Python字符串拼接的正確姿勢,需要的朋友可以參考下
    2026-02-02
  • python3 cmp實現(xiàn)方式

    python3 cmp實現(xiàn)方式

    這篇文章主要介紹了python3 cmp實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • python顯示天氣預(yù)報

    python顯示天氣預(yù)報

    這篇文章主要介紹了python顯示天氣預(yù)報功能,python2.7運(yùn)行通過,需要的朋友可以參考下
    2014-03-03
  • 2022最新Python日志庫logging總結(jié)

    2022最新Python日志庫logging總結(jié)

    這篇文章主要介紹了2022最新Python日志庫logging總結(jié),Python logging 庫設(shè)計的真的非常靈活,如果有特殊的需要還可以在這個基礎(chǔ)的 logging 庫上進(jìn)行改進(jìn),創(chuàng)建新的 Handler 類解決實際開發(fā)中的問題,需要的朋友可以參考下
    2022-05-05
  • Appium中scroll和drag_and_drop根據(jù)元素位置滑動

    Appium中scroll和drag_and_drop根據(jù)元素位置滑動

    本文主要介紹了Appium中scroll和drag_and_drop根據(jù)元素位置滑動,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • 解決Pycharm 運(yùn)行后沒有輸出的問題

    解決Pycharm 運(yùn)行后沒有輸出的問題

    這篇文章主要介紹了解決Pycharm 運(yùn)行后沒有輸出的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • python中for循環(huán)輸出列表索引與對應(yīng)的值方法

    python中for循環(huán)輸出列表索引與對應(yīng)的值方法

    今天小編就為大家分享一篇python中for循環(huán)輸出列表索引與對應(yīng)的值方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • python如何實現(xiàn)華氏溫度和攝氏溫度轉(zhuǎn)換

    python如何實現(xiàn)華氏溫度和攝氏溫度轉(zhuǎn)換

    這篇文章主要介紹了python如何實現(xiàn)華氏溫度和攝氏溫度轉(zhuǎn)換,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • django model的update時auto_now不被更新的原因及解決方式

    django model的update時auto_now不被更新的原因及解決方式

    這篇文章主要介紹了django model的update時auto_now不被更新的原因及解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-04-04

最新評論

白玉县| 嵊泗县| 巫山县| 怀来县| 台江县| 澄江县| 杨浦区| 招远市| 磐安县| 雅江县| 新丰县| 肥西县| 广丰县| 枞阳县| 长治县| 读书| 嘉荫县| 深州市| 彰化市| 长葛市| 科技| 佛冈县| 韩城市| 公主岭市| 察雅县| 松原市| 寿光市| 阳城县| 靖州| 紫云| 威远县| 衡阳县| 赤水市| 新源县| 光泽县| 怀宁县| 乌拉特中旗| 承德市| 民和| 莆田市| 松桃|