Python PDF转JPG图片小工具

Python PDF转JPG图片小工具

1.简介

将单个pdf装换成jpg格式图片

Tip:

1、软件窗口默认最前端,不支持调整窗口大小;
2、可通过按钮选择PDF文件,也可以直接拖拽文件到窗口;
3、转换质量有5个档位,(0.25,0.5,原分辨率,2倍,4倍),默认为原分辨率;
4、转换后的文件路径与导入文件的路径一致;
5、单页文件直接生成JPG图片,多页文件是生成文件夹;
6、不支持批量转换,不支持文件夹,只能单个文件转换结束再选下一个;

2.运行效果:

在这里插入图片描述

3.相关源码:

#coding:utf-8
import tkinter as tk
from tkinter import Label
from tkinter import Entry
from tkinter import filedialog
from tkinter.font import Font
import os
import fitz
from tkinterdnd2 import DND_FILES,TkinterDnDdef center_window(root, width, height):  #创建窗口居中screen_width = root.winfo_screenwidth()screen_height = root.winfo_screenheight()x = int((screen_width - width) / 2)y = int((screen_height - height) / 2)root.geometry(f"{width}x{height}+{x}+{y}")
def open_file():  #浏览文件按钮代码filetypes = (('pdf files', '*.pdf'),('All files', '*.*'))file = filedialog.askopenfilename(title='选择PDF文件',initialdir=os.getcwd(),filetypes=filetypes)pathname.delete(0, tk.END)pathname_2.delete(0, tk.END)if str.upper(file[-3:])=='PDF':pathname.insert(0, os.path.split(file)[1])pathname_2.insert(0, file)
def main():  #开始转换按钮代码path = pathname_2.get()name = pathname.get()[:-4]value_list = [1/3,2/3,4/3,8/3,16/3]# 图片缩放倍数(0.25,0.5,原分辨率,2倍,4倍)value_base =int(slider.get())value = value_list[value_base]pdf = fitz.open(path)for page_num in range(len(pdf)):page = pdf.load_page(page_num)mat = fitz.Matrix(value,value)pix = page.get_pixmap(matrix=mat)# 图片缩放if len(pdf) == 1:outpath = path[:-4]+'.jpg'else:if not os.path.exists(path[:-4]):os.mkdir(path[:-4])outpath = os.path.join(path[:-4] , f'{name}_{page_num}.jpg')pix.save(outpath)num = (page_num+1)/len(pdf)*100//1.25text = '正在转换'+'.'* int(num)+str(round((page_num+1)/len(pdf)*100,1))+'%'label.config(text=text)win.update()
def drop(event):  #支持拖拽文件file =event.datalabel.config(text='')pathname.delete(0, tk.END)pathname_2.delete(0, tk.END)if ' ' in file:file = file[1:-1]  #文件名有空格时,会生成大括号if str.upper(file[-3:])=='PDF':pathname.insert(0, os.path.split(file)[1])pathname_2.insert(0, file)win = TkinterDnD.Tk()
win.title('PDF转JPG工具')
center_window(win, 500, 110)
win.resizable(False, False)  #锁定窗口大小
win.wm_attributes('-topmost', 1)  #窗口保持前置
ft = Font(family='微软雅黑', size=15, weight='bold')
Label(text='选择文件:',font=ft).place(x=40, y=10)
Label(text='转换质量:',font=ft).place(x=40, y=50)
Label(text='低',font=Font(family='微软雅黑', size=12)).place(x=145, y=55)
Label(text='高',font=Font(family='微软雅黑', size=12)).place(x=358, y=55)
entry_font = ('微软雅黑', 12)
pathname = Entry(win, width=28,font=entry_font)
pathname.place(x=150, y=15)
#文本框,用于显示文件名
pathname_2 = Entry(win, width=28,font=entry_font)
pathname_2.place(x=150, y=150)
#隐藏文本框,用于获取完整路径
browser_button = tk.Button(win, text='. . .',font=Font(family='微软雅黑', size=7,weight='bold') ,command=open_file)
browser_button.place(x=420, y=15)
win.drop_target_register(DND_FILES)
win.dnd_bind('<<Drop>>',drop)
label = tk.Label(win,text='', font=Font(family='微软雅黑', size=10))
label.place(x=40, y=85)
#用于显示进度
button = tk.Button(win, text='开始转换',fg='red',font=Font(family='微软雅黑', size=12,weight='bold') ,command=main)
button.place(x=390, y=50)
slider = tk.Scale(win, from_=0, to=4,orient=tk.HORIZONTAL,length=180,sliderlength=30,sliderrelief=tk.RIDGE,showvalue=False,resolution=1)
slider.place(x=170, y=58)
slider.set(2)
win.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用SOAtest进行功能回归测试

持续集成是将所有开发人员的工作副本合并到共享的主线上。这个过程使软件开发对开发人员来说更容易访问、更快、风险更小。 阅读这篇文章&#xff0c;让我们了解如何配置Parasoft SOAtest作为持续集成过程的一部分&#xff0c;来执行功能测试和回归测试。我们将介绍如何使用主…

ais_server 学习笔记

ais_server 学习笔记 一前序二、ais init1、时序图如下2. 初始化一共分为以下几个重要步骤&#xff1a;2.1.1、在ais_server中启动main函数&#xff0c;然后创建AisEngine&#xff0c;接着初始化AisEngine2.1.2、解析/var/camera_config.xml 文件&#xff0c;获取相关配置参数。…

L1G3000 任务-浦语提示词工程

基础任务 (完成此任务即完成闯关) 背景问题&#xff1a;近期相关研究指出&#xff0c;在处理特定文本分析任务时&#xff0c;语言模型的表现有时会遇到挑战&#xff0c;例如在分析单词内部的具体字母数量时可能会出现错误。任务要求&#xff1a;利用对提示词的精确设计&#xf…

Unity之一键创建自定义Package包

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! Unity之一键创建自定义Package包 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; …

python的Flask框架使用

python的Flask框架使用 python环境搭建conda安装python自带的虚拟环境&#xff1a;venv python环境搭建 官网地址 点击downloads 选择你需要的版本&#xff0c;我这里使用的3.12.6 选择Windows installer (64-bit) 选择自定义安装&#xff0c;勾选以管理员权限安装&#xff0…

网络原理(一)—— http

什么是 http http 是一个应用层协议&#xff0c;全称为“超文本传输协议”。 http 自 1991 年诞生&#xff0c;目前已经发展为最主流使用的一种应用层协议。 HTTP 往往基于传输层的 TCP 协议实现的&#xff0c;例如 http1.0&#xff0c;http1.0&#xff0c;http2.0 http3 是…

103.【C语言】数据结构之建堆的时间复杂度分析

1.向下调整的时间复杂度 推导 设树高为h 发现如下规律 按最坏的情况考虑(即调整次数最多) 第1层,有个节点,最多向上调整h-1次 第2层,有个节点,最多向上调整h-2次 第3层,有个节点,最多向上调整h-3次 第4层,有个节点,最多向上调整h-4次 ... 第h-1层,有个节点,最多向上调整1次 第…

用Python爬虫“偷窥”1688商品详情:一场数据的奇妙冒险

引言&#xff1a;数据的宝藏 在这个信息爆炸的时代&#xff0c;数据就像是一座座等待挖掘的宝藏。而对于我们这些电商界的探险家来说&#xff0c;1688上的商品详情就是那些闪闪发光的金子。今天&#xff0c;我们将化身为数据的海盗&#xff0c;用Python这把锋利的剑&#xff0…

Python基础学习-12匿名函数lambda和map、filter

目录 1、匿名函数&#xff1a; lambda 2、Lambda的参数类型 3、map、 filter 4、本节总结 1、匿名函数&#xff1a; lambda 1&#xff09;语法&#xff1a; lambda arg1, arg2, …, argN : expression using arg 2&#xff09; lambda是一个表达式&#xff0c;而不是一个语…

【JavaEE初阶 — 网络编程】TCP流套接字编程

TCP流套接字编程 1. TCP &#xff06; UDP 的区别 TCP 的核心特点是面向字节流&#xff0c;读写数据的基本单位是字节 byte 2 API介绍 2.1 ServerSocket 定义 ServerSocket 是创建 TCP 服务端 Socket 的API。 构造方法 方法签名 方法说明 ServerS…

idea新建springboot web项目

idea新建springboot web项目 写在前面开始项目结构定义依赖初始化创建完成修复配置文件内容乱码修改配置文件名称更新配置文件内容为yml格式 配置项目启动项启动项目 写在前面 以下操作以IntelliJ IDEA 2022.3.3版本为例&#xff0c;其他版本应该大体相似。 开始 项目结构定义…

Docker 容器网络创建网桥链接

一、网络:默认情况下,所有的容器都以bridge方式链接到docker的一个虚拟网桥上; 注意:“172.17.0.0/16”中的“/16”表示子网掩码的长度为16位,它表示子网掩码中有16个连续的1,后面跟着16个连续的0。用于区分IP地址中的网络部分和主机部分; 二、为何自定义网络? 加入自…

智能产品综合开发 - 温湿度检测

1 实训选题目的 本次实训选择的题目是“温湿度检测系统”&#xff0c;旨在提升我们对日常生活中实际应用场景的观察力、问题描述能力、分析力和产品设计能力。通过本项目&#xff0c;我们将能够将所学的人工智能专业知识进行综合应用&#xff0c;包括但不限于Linux操作系统、Py…

人工智能如何改变你的生活?

在我们所处的这个快节奏的世界里&#xff0c;科技融入日常生活已然成为司空见惯的事&#xff0c;并且切实成为了我们生活的一部分。在这场科技变革中&#xff0c;最具变革性的角色之一便是人工智能&#xff08;AI&#xff09;。从我们清晨醒来直至夜晚入睡&#xff0c;人工智能…

vue3 ajax获取json数组排序举例

使用axios获取接口数据 可以在代码中安装axios包&#xff0c;并写入到package.json文件&#xff1a; npm install axios -S接口调用代码举例如下&#xff1a; const fetchScore async () > {try {const res await axios.get(http://127.0.0.1:8000/score/${userInput.v…

Vue前端开发-动态插槽

不仅父组件可以通过插槽方式访问并控制子组件传入的数据&#xff0c;而且可以控制传入父组件时插槽的名称&#xff0c;从而使不同的插槽根据名称的不同&#xff0c;使用场景也不同&#xff0c;例如在一个小区详细页中&#xff0c;可以根据小区类型&#xff0c;调用不同名称的详…

SqlServer强制转换函数TRY_CONVERT和TRY_CAST

SqlServer强制转换函数TRY_CONVERT和TRY_CAST的介绍和案例分享 1、本节内容 CAST 和 CONVERT TRY_CAST TRY_CONVERT 适用于&#xff1a; SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse Analytics 分析平台系统 (PDW)Microsoft Fabric 中的 SQL 分析端点Micro…

PaddleOCR:一款高性能的OCR工具介绍

一、引言 随着人工智能技术的不断发展&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术在各行各业得到了广泛应用。OCR技术能够将图片、扫描件等非结构化数据中的文字信息提取出来&#xff0c;转换为可编辑的文本格式。在我国&#xff0c;百度开源了一款优秀的OCR工具…

如果在docker 容器中安装ros遇到的问题

1.在容器内部无法修改时间&#xff0c;需要在宿主机外边修改时钟。修改时钟&#xff1a; hwclock --systohc或者执行 date -s "2024-11-24 19:25:10"2.容器内部内置有opencv4.5版本&#xff0c;需要卸载&#xff0c;重新安装4.2.0版本。记录折腾好久的卸载过程。 …

LLM*:路径规划的大型语言模型增强增量启发式搜索

路径规划是机器人技术和自主导航中的一个基本科学问题&#xff0c;需要从起点到目的地推导出有效的路线&#xff0c;同时避开障碍物。A* 及其变体等传统算法能够确保路径有效性&#xff0c;但随着状态空间的增长&#xff0c;计算和内存效率会严重降低。相反&#xff0c;大型语言…