手上有一個PDF想要餵給chatPDF,免費版限制不能超過10MB,用pypdf2 寫一個Script但是分割出來的檔案大小還比原本的大
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
用pypdf2 寫一個Script但是分割出來的檔案大小還比原本的大
通常這是因為來源檔案本身就有壓縮處理過; 而 PyPDF2 / pypdf 處理 PDF 檔案時, 需要解壓縮被壓縮過的 PDF 資料後才能處理 PDF 資料; 所以 PyPDF2 / pypdf 提供壓縮功能, 用以將處理完成後的 PDF 資料, 在封裝成檔案時能縮小檔案大小。
根據 PyPDF2@pypi 的 NOTE: The PyPDF2 project is going back to its roots. (...)
所言, 若我沒誤解的話, 研發人員已暫停在 PyPDF2 的研發並回歸 pypdf 。
在 Reduce PDF Size 部分, 我推薦用 pypdf , 因為我在測試 Reduce PDF Size 時, 我感覺 PyPDF2 結果與用法有點詭異。
至於檔案大小的切割控制, 如 淺水員 大所言, PDF 大小經過壓縮後會有很大差異, 而且想取得壓縮後的結果大小得先花時間壓縮後才能得知。
因為你是想要丟給 chatPDF, 我「猜」只需要給文字的部分, 你可以參考 Reduce PDF Size - pypdf 的 Remove images + Lossless Compression + 自訂分割 (或僅你需要的片段) 試試。