此方法不能指定大小,压缩比例为1/7
    目前只针对纯PDF图片压缩

    实现原理: 主要通过PYMUPDF进行图片提取,图片压缩,再合并生成一个新的PDF。

    1. # 压缩PDF大小
    2. def compress_pdf(filepath, tmpdir):
    3. if os.path.splitext(filepath)[-1] not in ['.pdf', 'PDF']:
    4. print('非PDF文件')
    5. return filepath
    6. else:
    7. # 先把PDF转成图片
    8. pdffile = filepath
    9. doc = fitz.open(pdffile)
    10. width, height = fitz.PaperSize("a4")
    11. totaling = doc.pageCount
    12. # 清空临时文件夹
    13. if not os.path.exists(tmpdir):
    14. os.makedirs(tmpdir) # 创建文件夹
    15. tmpic = os.path.join(tmpdir, 'tmpic')
    16. if not os.path.exists(tmpic):
    17. os.makedirs(tmpic) # 创建文件夹
    18. images = []
    19. for pg in range(totaling):
    20. page = doc[pg]
    21. zoom = int(100)
    22. rotate = int(0)
    23. print(page)
    24. trans = fitz.Matrix(zoom / 100.0, zoom / 100.0).preRotate(rotate)
    25. pm = page.getPixmap(matrix=trans, alpha=False)
    26. lurl = os.path.join(tmpic, os.path.splitext(os.path.basename(filepath))[0] + 'tmp%s.jpg' % str(pg + 1))
    27. images.append(lurl)
    28. pm.writePNG(lurl)
    29. doc.close()
    30. # 再把图片合并成PDF
    31. doc = fitz.open()
    32. for img in images: # 读取图片,确保按文件名排序
    33. print(img)
    34. imgdoc = fitz.open(img) # 打开图片
    35. pdfbytes = imgdoc.convertToPDF() # 使用图片创建单页的 PDF
    36. imgpdf = fitz.open("pdf", pdfbytes)
    37. doc.insertPDF(imgpdf) # 将当前页插入文档
    38. outfile = os.path.join(tmpdir, os.path.basename(filepath))
    39. if os.path.exists(outfile): # 若文件存在先删除
    40. os.remove(outfile)
    41. doc.save(outfile) # 保存pdf文件
    42. doc.close()
    43. return outfile