python 压缩jpg、PDF文件的大小,可根据参数进行压缩

python 压缩jpg、PDF文件的大小,可根据参数进行压缩

-- coding: utf-8 --

import sys, fitz
import os
import stat
import shutil
import datetime
from PIL import Image
import re
import winerror
from win32com.client.dynamic import Dispatch, ERRORS_BAD_CONTEXT
from PyQt5 import QtCore, QtGui, QtWidgets
import cv2, glob
from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog

def pdf_jpg(pdfPath, tem):

ERRORS_BAD_CONTEXT.append(winerror.E_NOTIMPL)

my_dir = r'D:\jpg\\' + str(tem)
if not os.path.exists(my_dir):#判断存放图片的文件夹是否存在
    os.makedirs(my_dir) 
# my_pdf = "1.pdf"

# #os.chdir(my_dir)
# src = os.path.abspath(my_pdf)
#print(pdfPath)
try:
    AvDoc = Dispatch("AcroExch.AVDoc")
    if AvDoc.Open(pdfPath, ""):
        pdDoc = AvDoc.GetPDDoc()
        jsObject = pdDoc.GetJSObject()
        jsObject.SaveAs(os.path.join(my_dir, '1.jpeg'), "com.adobe.acrobat.jpeg")

except Exception as e:
    print(str(e))

finally:        
    AvDoc.Close(True)

    jsObject = None
    pdDoc = None
    AvDoc = None

def natural_sort_key(s):
_nsre = re.compile(‘([0-9]+)’)
return [int(text) if text.isdigit() else text.lower() for text in re.split(_nsre, s)]

def yes(pdf_name1, tem):
img_path = r’D:\jpg\’ + str(tem)
doc = fitz.open()
new_pic = os.listdir(img_path)
new_pic.sort(key=natural_sort_key)
# 循环path中的文件,可import os 然后用 for img in os.listdir(img_path)实现
# 这里为了让文件以1,2,3的形式进行拼接,就偷懒循环文件名中的数字。
ii = 1
for i in new_pic:
img_file = os.path.join(img_path, i)
imgdoc = fitz.open(img_file)#打开照片路径
pdfbytes = imgdoc.convertToPDF()
pdf_name = os.path.join(img_path, ‘%s.pdf’%ii)
imgpdf = fitz.open(pdf_name, pdfbytes)
doc.insertPDF(imgpdf)
ii += 1
doc.save(pdf_name1)
doc.close()
#print(pdf_name1)

def all_files_path(df_path):
filepaths = []
for root, dirs, files in os.walk(df_path): # 分别代表根目录、文件夹、文件
for file in files: # 遍历文件
file_path = os.path.join(root, file) # 获取文件绝对路径
#print(file_path)
if file_path[-4:].lower() == ‘.pdf’:
filepaths.append(file_path) # 将文件路径添加进列表
for dir in dirs: # 遍历目录下的子目录
dir_path = os.path.join(root, dir) # 获取子目录路径
all_files_path(dir_path)
return filepaths

def all_jpf_path(df_path):
filepaths = []
for root, dirs, files in os.walk(df_path): # 分别代表根目录、文件夹、文件
for file in files: # 遍历文件
file_path = os.path.join(root, file) # 获取文件绝对路径
#print(file_path)
if file_path[-5:].lower() == ‘.jpeg’:
filepaths.append(file_path) # 将文件路径添加进列表
for dir in dirs: # 遍历目录下的子目录
dir_path = os.path.join(root, dir) # 获取子目录路径
all_jpf_path(dir_path)
return filepaths

def delete():
filePath = r’D:\jpg’
if os.path.exists(filePath):
for fileList in os.walk(filePath):
for name in fileList[2]:
try:
os.chmod(os.path.join(fileList[0],name), stat.S_IWRITE)
os.remove(os.path.join(fileList[0],name))
except:
pass
try:
shutil.rmtree(filePath)
except:
pass
return “delete ok”
else:
return “no filepath”

def main():
pdfPath = r’C:\Users\ye\Desktop\新建文件夹 (6)\新建文件夹 (2)’
pdf_name = r’C:\Users\ye\Desktop\新建文件夹 (6)\新建文件夹 (3)’
list_pdf = all_files_path(pdfPath)
#delete()
#print(list_pdf)
i = 1
for path_pdf in list_pdf:
pdf_jpg(path_pdf, i)
path_pdf_h = path_pdf.replace(pdfPath, pdf_name)
a,b = os.path.split(path_pdf_h)
if os.path.exists(a) == False:
os.makedirs(a)
yes(path_pdf_h, i)
i += 1
#delete()

def cx2_jpd(jpg_dx):
list_jpg = all_jpf_path(r’D:\jpg\1’)
i = 1
for path_jpg in list_jpg:
a, b = os.path.split(path_jpg)
os.rename(path_jpg,os.path.join(a, ‘%s.jpeg’%i))
i += 1
for ii in range(1, i):
path_jpg = os.path.join(r’D:\jpg\1’, ‘%s.jpeg’%ii)
img = cv2.imread(path_jpg.replace(‘/’, ‘\’),1)
cv2.imwrite(path_jpg, img,[cv2.IMWRITE_JPEG_QUALITY, int(jpg_dx)])

def ye(self, row, col, text):
# _translate = QtCore.QCoreApplication.translate
item = QtWidgets.QTableWidgetItem()
self.tableWidget.setItem(row, col, item)
item = self.tableWidget.item(row, col)
item.setText(text)
QApplication.processEvents()

def formatSize(bytes):
try:
bytes = float(bytes)
kb = round(bytes / 1024,2)
except:
print(“传入的字节格式不对”)
return “Error”

if kb >= 1024:
    M = round(kb / 1024,2)
    if M >= 1024:
        G = round(M / 1024,2)
        return "%sG" % (G)
    else:
        return "%sM" % (M)
else:
    return "%skb" % (kb)

def getDocSize(path):
try:
size = os.path.getsize(path)
return formatSize(size)
except Exception as err:
print(err)

def main_pdf(self, path_ys, name_pdf, name_path, name_path1, xs, tem):
path_pdf = os.path.join(name_path, name_pdf)
delete()
pdf_jpg(path_pdf, 1)
cx2_jpd(xs)
print(path_pdf, path_ys, name_path1)
path_pdf_h = path_pdf.replace(‘\’,‘/’).replace(path_ys, name_path1)
a,b = os.path.split(path_pdf_h)
if os.path.exists(a) == False:
os.makedirs(a)
yes(path_pdf_h, 1)
ye(self, tem, 3, ‘%s/%s’%(getDocSize(path_pdf), getDocSize(path_pdf_h)))
#delete()

if name == “main”:
main()

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
原书名: Core Python Programming (2nd Edition) 原出版社: Prentice Hall PTR 作者: (美)Wesley J. Chun 译者: 宋吉广 出版社:人民邮电出版社 ISBN:9787115178503 上架时间:2008-6-23 出版日期:2008 年7月 开本:16开 页码:654 版次:2-1 第1部分 python核心  第1章 欢迎来到python世界    1.1 什么是python    1.2 起源    1.3 特点     1.3.1 高级     1.3.2 面向对象     1.3.3 可升级     1.3.4 可扩展     1.3.5 可移植性     1.3.6 易学     1.3.7 易读     1.3.8 易维护     1.3.9 健壮性     1.3.10 高效的快速原型开发工具     1.3.11 内存管理器     1.3.12 解释性和(字节)编译性    1.4 下载和安装python    1.5 运行python     1.5.1 命令行上的交互式解释器  .   1.5.2 从命令行启动脚本     1.5.3 集成开发环境     1.5.4 其他的集成开发环境和执行环境    1.6 python文档    1.7 比较pythonpython与其他语言的比较)    1.8 其他实现    1.9 练习   第2章 快速入门    2.1 程序输出,print语句及“hello world!”    2.2 程序输入和raw_input()内建函数    2.3 注释    2.4 操作符    2.5 变量和赋值    2.6 数字    2.7 字符串    2.8 列表和元组    2.9 字典    2.10 代码块及缩进对齐    2.11 if语句    2.12 while循环    2.13 for循环和range()内建函数    2.14 列表解析    2.15 文件和内建函数open()、file()    2.16 错误和异常    2.17 函数     2.17.1 如何定义函数     2.17.2 如何调用函数     2.17.3 默认参数    2.18 类    2.19 模块     2.19.1 如何导入模块     2.19.2 如何访问一个模块函数或访问一个模块变量    2.20 实用的函数    2.21 练习   第3章 python基础    3.1 语句和语法     3.1.1 注释(#)     3.1.2 继续(\)     3.1.3 多个语句构成代码组(:)     3.1.4 代码组由不同的缩进分隔     3.1.5 同一行书写多个语句(;)     3.1.6 模块    3.2 变量赋值     3.2.1 赋值操作符     3.2.2 增量赋值     3.2.3 多重赋值     3.2.4 “多元”赋值    3.3 标识符     3.3.1 合法的python标识符     3.3.2 关键字     3.3.3 内建     3.3.4 专用下划线标识符    3.4 基本风格指南     3.4.1 模块结构和布局     3.4.2 在主程序中书写测试代码    3.5 内存管理     3.5.1 变量定义     3.5.2 动态类型     3.5.3 内存分配     3.5.4 引用计数     3.5.5 垃圾收集    3.6 第一个python程序    3.7 相关模块和开发工具    3.8 练习   第4章 python对象    4.1 python 对象    4.2 标准类型    4.3 其他内建类型     4.3.1 类型对象和type类型对象     4.3.2 none--python的null对象    4.4 内部类型     4.4.1 代码对象     4.4.2 帧对象     4.4.3 跟踪记录对象     4.4.4 切片对象     4.4.5 省略对象     4.4.6 xrange 对象    4.5 标准类型操作符     4.5.1 对象值的比较     4.5.2 对象身份比较     4.5.3 布尔类型    4.6 标准类型内建函数     4.6.1 type()     4.6.2 cmp()     4.6.3 str()和repr()(及``操作符)     4.6.4 type()和isinstance()     4.6.5 python类型操作符和内建函数总结    4.7 类型工厂函数    4.8 标准

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DK业

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值