开始压缩

简介: 【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()
目录
相关文章
|
7月前
|
存储 算法 Linux
Gzip的压缩级别有哪些选择?
【4月更文挑战第29天】Gzip的压缩级别有哪些选择?
314 1
|
7月前
|
存储 算法 Linux
Gzip的压缩级别
【4月更文挑战第29天】压缩级别
448 1
|
7月前
|
存储 编解码 算法
图像的压缩算法--尺寸压缩、格式压缩和品质压缩
图像的压缩算法--尺寸压缩、格式压缩和品质压缩
151 0
|
存储 编解码 算法
编码压缩介绍
压缩编码介绍,JPEG标准,H.264,AVS,预测,变换,量化,熵编码,环路滤波
144 0
|
存储 算法
Quicklz压缩算法
以前对压缩算法一无所知,只是知道哈弗曼编码能做这种事情,但是感觉这样的方法奇慢无比。昨天下午看了下号称世界上最快的压缩算法Quicklz,对压缩的基本思路有了一定的了解。一般的压缩程序的要求读入文件之后以便压缩一边输出,而不是去先分析整个文件中的情况之后才做决定采取哪种算法。
1551 0
|
API Android开发
Java字符串压缩(两种压缩方式)
第一种,只统计字符出现次数,比如aabcccccaaa,压缩成a5b1c5 思路:利用hashMap键的唯一性
1275 0
|
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 压缩大文件