开始压缩

简介: 【9月更文挑战第05天】

image.png
更改说明:
临时图像文件:将 Pixmap 对象保存到临时文件中,然后将该图像插入到页面。这可以避免直接处理 Pixmap 对象可能带来的问题。

import os
import tkinter as tk
from tkinter import filedialog, ttk, messagebox
import fitz  # PyMuPDF


# 压缩PDF文件
def compress_pdf(input_file, output_file, compression_ratio, progress_callback):
    # 打开 PDF 文件
    doc = fitz.open(input_file)
    num_pages = len(doc)

    # 压缩过程
    for i in range(num_pages):
        page = doc.load_page(i)  # 加载页面

        # 计算新图像尺寸
        scale = compression_ratio / 100.0
        mat = fitz.Matrix(scale, scale)
        pix = page.get_pixmap(matrix=mat)  # 使用缩放比例渲染页面

        # 清除当前页面内容
        page.clean_contents()

        # 使用缩放后的图像插入到页面
        rect = fitz.Rect(0, 0, pix.width, pix.height)
        # 将图像保存到临时文件
        temp_image_path = "temp_image.png"
        pix.save(temp_image_path)

        # 插入临时图像到页面
        page.insert_image(rect, filename=temp_image_path)

        # 删除临时图像文件
        os.remove(temp_image_path)

        progress_callback(i + 1, num_pages)

    # 保存压缩后的文件
    doc.save(output_file, garbage=4, deflate=True)
    doc.close()


# 选择文件
def select_file():
    file_path = filedialog.askopenfilename(
        filetypes=[("PDF files", "*.pdf")])
    file_entry.delete(0, tk.END)
    file_entry.insert(0, file_path)


# 更新进度条
def update_progress(current, total):
    progress_var.set(current / total * 100)
    root.update_idletasks()


# 开始压缩
def start_compression():
    input_file = file_entry.get()
    compression_ratio = ratio_entry.get()

    if not input_file:
        messagebox.showerror("Error", "Please select a PDF file")
        return

    if not compression_ratio.isdigit() or not (0 < int(compression_ratio) <= 100):
        messagebox.showerror("Error", "Please enter a valid compression ratio (1-100)")
        return

    compression_ratio = int(compression_ratio)
    output_file = os.path.join(os.path.dirname(input_file), "compressed.pdf")

    try:
        compress_pdf(input_file, output_file, compression_ratio, update_progress)
        messagebox.showinfo("Success", f"File compressed and saved as {output_file}")
    except Exception as e:
        messagebox.showerror("Error", f"An error occurred: {e}")


# 主窗口
root = tk.Tk()
root.title("PDF Compressor")
root.geometry("400x250")

# 文件选择部分
file_frame = tk.Frame(root)
file_frame.pack(pady=10)
file_label = tk.Label(file_frame, text="Select PDF File:")
file_label.pack(side=tk.LEFT)
file_entry = tk.Entry(file_frame, width=30)
file_entry.pack(side=tk.LEFT, padx=5)
file_button = tk.Button(file_frame, text="Browse", command=select_file)
file_button.pack(side=tk.LEFT)

# 压缩比例输入框
ratio_frame = tk.Frame(root)
ratio_frame.pack(pady=10)
ratio_label = tk.Label(ratio_frame, text="Compression Ratio (%):")
ratio_label.pack(side=tk.LEFT)
ratio_entry = tk.Entry(ratio_frame, width=10)
ratio_entry.pack(side=tk.LEFT, padx=5)

# 进度条
progress_var = tk.DoubleVar()
progress_bar = ttk.Progressbar(root, variable=progress_var, maximum=100)
progress_bar.pack(pady=20, fill=tk.X, padx=20)

# 开始压缩按钮
start_button = tk.Button(root, text="Start Compression", command=start_compression)
start_button.pack(pady=10)

# 运行主循环
root.mainloop()
目录
相关文章
|
6月前
|
存储 算法 Linux
Gzip的压缩级别有哪些选择?
【4月更文挑战第29天】Gzip的压缩级别有哪些选择?
269 1
|
6月前
|
存储 算法 Linux
Gzip的压缩级别
【4月更文挑战第29天】压缩级别
362 1
|
6月前
|
存储 编解码 算法
图像的压缩算法--尺寸压缩、格式压缩和品质压缩
图像的压缩算法--尺寸压缩、格式压缩和品质压缩
108 0
|
存储 编解码 算法
编码压缩介绍
压缩编码介绍,JPEG标准,H.264,AVS,预测,变换,量化,熵编码,环路滤波
135 0
|
API Android开发
|
SQL 分布式计算 HIVE
记一个压缩格式的问题
问题描述 Hive ORC table常规小文件过多问题,于是用Spark写了一个Application来自动的Merge分区数据,思路很简单大概就是 insert overwrite table partition (分区 XXX) select * from table where (分区 XXX)当然已经把该dataframe repartition到想要的目标并发度,来控制最终分区下的文件个数 但是发现生成的文件个数虽然是对的,但是最后整个分区的Size竟然几乎翻倍。
记一个压缩格式的问题
|
监控 算法 Cloud Native
开发函数计算的正确姿势——使用 brotli 压缩大文件
函数计算对上传的 zip 代码包尺寸限制为 50M。某些场景中代码包中会超过这一限制,比如未经裁剪的 serverless-chrome,类似的还有 libreoffice ,此外常见的还有机器学习训练的模型文件。本文会比较几种常见的解决大文件的方案,并重点介绍借助 brotli 提高压缩比的方法。
开发函数计算的正确姿势——使用 brotli 压缩大文件
|
Serverless 对象存储 弹性计算
函数计算对文件进行压缩和解压缩使用总结
前言 函数计算具有弹性伸缩的能力,可以给用户带来免运维和毫秒级扩容的计算能力。 但是它也存在一些限制, 比如一个执行环境最大内存只有3G, 本文旨在进行总结一些函数计算在文件压缩和解压缩的一些实践案例, 希望能给大家抛砖引玉,引出更好的实践案例。
2974 0