有多种方法可以减小给定 PDF 文件的大小。最简单的方法是删除内容(例如图像)或页面。

去除重复

某些 PDF 文档多次包含相同的对象。例如,如果图像在 PDF 中出现三次,则可以嵌入三次。或者它可以嵌入一次并引用两次。

这可以通过读取和写入文件来完成:

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 的效果如何,但我们已经看到在真实 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 压缩应用于页面:

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)

使用这种方法,我们看到真实 PDF 的大小减少了 70%(从 11.8 MB 到 3.5 MB)。