Python压缩PDF

使用fitz模块

fitz模块(PyMuPDF库的一部分),将PDF文件压缩为图片,然后再将图片合并为新的PDF文件。
在运行代码之前,你需要安装PyMuPDF库:

安装PyMuPDF库

pip install PyMuPDF

代码示例

import fitz
import os


def convert_to_pic(zoom):
    if os.path.exists('squeeze_pdf\.pdf'):  # 临时文件夹,需要为空
        os.removedirs('squeeze_pdf\.pdf')
    os.mkdir('squeeze_pdf\.pdf')
    for pg in range(totaling):
        page = doc[pg]
        zoom = int(zoom)  # 值越大,分辨率越高,文件越清晰
        rotate = int(0)
        print(page)
        trans = fitz.Matrix(zoom / 100.0, zoom / 100.0).prerotate(rotate)
        pm = page.get_pixmap(matrix=trans, alpha=False)

        img_path = 'squeeze_pdf\.pdf/%s.jpg' % str(pg + 1)
        pm.save(img_path)  # 保存为图像文件
    doc.close()


def pic_to_pdf(output_path):
    doc = fitz.open()
    for pg in range(totaling):
        img_path = 'squeeze_pdf\.pdf/%s.jpg' % str(pg + 1)
        imgdoc = fitz.open(img_path)  # 打开图片
        # print(dir(imgdoc))
        pdfbytes = imgdoc.convert_to_pdf()  # 使用图片创建单页的PDF
        os.remove(img_path)
        imgpdf = fitz.open("pdf", pdfbytes)
        # print(dir(doc))
        doc.insert_pdf(imgpdf)  # 将当前页插入文档
    if os.path.exists(output_path):  # 若文件存在先删除
        os.remove(output_path)
    doc.save(output_path)  # 保存PDF文件
    doc.close()


def compress_pdf(source_path, output_path, zoom):
    convert_to_pic(zoom)
    pic_to_pdf(output_path)


if __name__ == "__main__":
    source_path = "squeeze_pdf\source.pdf"  # 需要压缩的PDF文件
    output_path = "squeeze_pdf\compressed.pdf"  # 压缩后的PDF文件路径
    doc = fitz.open(source_path)
    totaling = doc.page_count

    zoom = 200  # 清晰度调节,缩放比率
    compress_pdf(source_path, output_path, zoom)
    os.removedirs('squeeze_pdf\.pdf')

代码分析

另外,代码中使用了一个.pdf目录来存储临时图片文件,并在压缩完成后将其删除。

你可以将source.pdf替换为要压缩的PDF文件的路径,并将compressed.pdf替换为输出压缩后的PDF文件的路径。同时,你可以调整zoom参数来控制输出图片的清晰度和分辨率。

请确保代码所在的目录具有读写权限,并且没有与代码中使用的.pdf同名的文件或目录,以免冲突。

运行代码后,将生成一个压缩后的PDF文件,并且.pdf目录中的临时文件将被清理删除。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值