用python做PDF本地化压缩,新增多进程

您所在的位置:网站首页 pdf格式缩小文件大小 用python做PDF本地化压缩,新增多进程

用python做PDF本地化压缩,新增多进程

2023-12-05 15:45| 来源: 网络整理| 查看: 265

用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