赞
踩
fitz模块(PyMuPDF库的一部分),将PDF文件压缩为图片,然后再将图片合并为新的PDF文件。
在运行代码之前,你需要安装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目录中的临时文件将被清理删除。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。