用python做PDF本地化压缩,新增多进程 |
您所在的位置:网站首页 › pdf格式缩小文件大小 › 用python做PDF本地化压缩,新增多进程 |
用python做PDF压缩
虽然现在有很多成熟的工具了,但是就是想自己捣鼓一下 在网上找了一圈,发现实现方法有两种,一种是需要联网上传(TinyPNG的API)压缩的,一种是本地用python算法 这里采用的是本地,基本的思路是 1、提取PDF内容,保存成图片 2、压缩图片 3、图片合成PDF 4、新增加入多进程和队列的方式,加快压缩 联网上传的我觉得直接用i love pdf这个网页,挺好用的,就不知道安不安全。。。 Compress PDF online. Same PDF quality less file size (ilovepdf.com) 这里参考了两篇博客的代码 (2条消息) Python实现PDF文件压缩_xinxinbupp的博客-CSDN博客 (2条消息) Python-从PDF中提取图片、压缩PDF_xinRCNN的博客-CSDN博客 但是感觉压缩出来的图片不是很理想,就想找一个图片压缩算法替换上去 在网上找到一个python的图片压缩算法,说是**“可能是最接近微信朋友圈的图片压缩算法”** GitHub - Freefighter/Luban-Py: Python version of Luban(鲁班)—Image compression with efficiency very close to WeChat Moments/可能是最接近微信朋友圈的图片压缩算法 依赖安装先安装库 fitz,再安装库pymupdf,地址:https://github.com/pymupdf/PyMuPDF/ pip install fitz pip install PyMuPDF pip install easygui # 用来弹出文件选择框的,thinker的话会弹出两个窗口怪怪的 缝合修改CV大法用上 # -*- coding:utf-8 -*- # author: peng # file: mypdf.py # time: 2021/9/8 17:47 # desc:压缩PDF,对纯图片的PDF效果效果较好,有文字内容的可能会比较模糊,推荐高质量的压缩 import fitz from PIL import Image import os from shutil import copyfile, rmtree from math import ceil from time import strftime, localtime, time import easygui as g from functools import wraps # 时间计数装饰器,func如果有return值,必须返回才能有值 def runtime(func): @wraps(func) def wrapper(*args, **kwargs): print(strftime("%Y-%m-%d %H:%M:%S", localtime())) start = time() func_return = func(*args, **kwargs) end = time() print(func.__name__, args[-1], args[-2], " spend time ", end - start, " sec") return func_return return wrapper class Luban(object): def __init__(self, quality, ignoreBy=102400): self.ignoreBy = ignoreBy self.quality = quality def setPath(self, path): self.path = path def setTargetDir(self, foldername="target"): self.dir, self.filename = os.path.split(self.path) self.targetDir = os.path.join(self.dir, foldername) if not os.path.exists(self.targetDir): os.makedirs(self.targetDir) self.targetPath = os.path.join(self.targetDir, "c_" + self.filename) def load(self): self.img = Image.open(self.path) if self.img.mode == "RGB": self.type = "JPEG" elif self.img.mode == "RGBA": self.type = "PNG" else: # 其他的图片就转成JPEG self.img = self.img.convert("RGB") self.type = "JPEG" def computeScale(self): # 计算缩小的倍数 srcWidth, srcHeight = self.img.size srcWidth = srcWidth + 1 if srcWidth % 2 == 1 else srcWidth srcHeight = srcHeight + 1 if srcHeight % 2 == 1 else srcHeight longSide = max(srcWidth, srcHeight) shortSide = min(srcWidth, srcHeight) scale = shortSide / longSide if (scale 0.5625): if (longSide |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |