iT邦幫忙

0

[Python] 用PyPDF2根據需要的檔案大小分割檔案

  • 分享至 

  • xImage

手上有一個PDF想要餵給chatPDF,免費版限制不能超過10MB,用pypdf2 寫一個Script但是分割出來的檔案大小還比原本的大/images/emoticon/emoticon02.gif
Python3.8
謝謝你花時間 幫忙看程式互相學習
PDF檔案連結:https://www.dropbox.com/s/utn1v5dtp1dd7yt/infoblox_nios_8.6.pdf?dl=0
source code:

import os
from PyPDF2 import PdfFileReader, PdfFileWriter

def split_pdf(input_path, max_size):
    with open(input_path, 'rb') as input_file:
        input_pdf = PdfFileReader(input_file)
        num_pages = input_pdf.getNumPages()
        output = PdfFileWriter()
        current_size = 0
        current_page = 0
        while current_page < num_pages:
            output.addPage(input_pdf.getPage(current_page))
            current_size += input_pdf.getPage(current_page).getContents().get('/Length', 0)
            if current_size > max_size:
                output_path = os.path.splitext(input_path)[0] + '_part{}.pdf'.format(current_page // 100 + 1)
                with open(output_path, 'wb') as output_file:
                    output.write(output_file)
                output = PdfFileWriter()
                current_size = 0
            current_page += 1
        if not output.getNumPages() == 0:
            output_path = os.path.splitext(input_path)[0] + '_part{}.pdf'.format(current_page // 100 + 1)
            with open(output_path, 'wb') as output_file:
                output.write(output_file)

split_pdf('infoblox_nios_8.6.pdf', 9000000) # split into files of maximum 9MB
froce iT邦大師 1 級 ‧ 2023-05-03 11:15:16 檢舉
https://pypdf2.readthedocs.io/en/latest/user/file-size.html

懶的看你的code,給你官方文件自己拼。
Lossless Compression那節。
淺水員 iT邦大師 6 級 ‧ 2023-05-03 14:03:26 檢舉
ContentStream 只是其中一部分的內容
不能只用這個東西來計算最後的檔案大小

我覺得應該是試著輸出後再去看檔案大小
如果超過目標值,減少頁面後再重新輸出

如果只有1頁就超過大小
那可能裡面的圖片就要做破壞性壓縮了
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

1
re.Zero
iT邦研究生 5 級 ‧ 2023-05-03 23:23:27

用pypdf2 寫一個Script但是分割出來的檔案大小還比原本的大

通常這是因為來源檔案本身就有壓縮處理過; 而 PyPDF2 / pypdf 處理 PDF 檔案時, 需要解壓縮被壓縮過的 PDF 資料後才能處理 PDF 資料; 所以 PyPDF2 / pypdf 提供壓縮功能, 用以將處理完成後的 PDF 資料, 在封裝成檔案時能縮小檔案大小。


根據 PyPDF2@pypiNOTE: The PyPDF2 project is going back to its roots. (...) 所言, 若我沒誤解的話, 研發人員已暫停在 PyPDF2 的研發並回歸 pypdf
Reduce PDF Size 部分, 我推薦用 pypdf , 因為我在測試 Reduce PDF Size 時, 我感覺 PyPDF2 結果與用法有點詭異。


至於檔案大小的切割控制, 如 淺水員 大所言, PDF 大小經過壓縮後會有很大差異, 而且想取得壓縮後的結果大小得先花時間壓縮後才能得知。

因為你是想要丟給 chatPDF, 我「猜」只需要給文字的部分, 你可以參考 Reduce PDF Size - pypdfRemove images + Lossless Compression + 自訂分割 (或僅你需要的片段) 試試。

我要發表回答

立即登入回答