有多種方法可以減小給定 PDF 文件的大小。最簡(jiǎn)單的方法是刪除內(nèi)容(例如圖像)或頁(yè)面。

去除重復(fù)

某些 PDF 文檔多次包含相同的對(duì)象。例如,如果圖像在 PDF 中出現(xiàn)三次,則可以嵌入三次?;蛘咚梢郧度胍淮尾⒁脙纱巍?

這可以通過讀取和寫入文件來完成:

from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("big-old-file.pdf")
writer = PdfWriter()

for page in reader.pages:
    writer.add_page(page)

writer.add_metadata(reader.metadata)

with open("smaller-new-file.pdf", "wb") as fp:
    writer.write(fp)

這取決于 PDF 的效果如何,但我們已經(jīng)看到在真實(shí) PDF 中文件減少了 86%(從 5.7 MB 到 0.8 MB)。

刪除圖片

from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("example.pdf")
writer = PdfWriter()

for page in reader.pages:
    writer.add_page(page)

writer.remove_images()

with open("out.pdf", "wb") as f:
    writer.write(f)

無損壓縮

PyPDF2 支持使用 zlib/deflate 壓縮方法的 FlateDecode 過濾器。它是一種無損壓縮,這意味著生成的 PDF 看起來完全一樣。

可以通過 ?page.compress_content_streams? 將 Deflate 壓縮應(yīng)用于頁(yè)面:

from PyPDF2 import PdfReader, PdfWriter

reader = PdfReader("example.pdf")
writer = PdfWriter()

for page in reader.pages:
    page.compress_content_streams()  # This is CPU intensive!
    writer.add_page(page)

with open("out.pdf", "wb") as f:
    writer.write(f)

使用這種方法,我們看到真實(shí) PDF 的大小減少了 70%(從 11.8 MB 到 3.5 MB)。