Python PDF转JPG图片小工具

news2024/11/30 5:48:15

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,TkinterDnD
 
def 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.25
        text = '正在转换'+'.'* int(num)+str(round((page_num+1)/len(pdf)*100,1))+'%'
        label.config(text=text)
        win.update()
def drop(event):  #支持拖拽文件
    file =event.data
    label.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.coloradmin.cn/o/2250231.html

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

相关文章

剖析 SpringBoot 于夕阳红公寓管理系统架构搭建的核心作用

3 系统分析 本文作者在确定了研究的课题之后&#xff0c;从各大数字图书馆下载文献来阅读&#xff0c;并了解同类型的网站具备的大致功能&#xff0c;然后与本系统用户的实际需求结合进行分析&#xff0c;得出本系统要研究的具体功能与性能。虽然分析系统这一阶段性工作主要是确…

springboot336社区物资交易互助平台pf(论文+源码)_kaic

毕 业 设 计&#xff08;论 文&#xff09; 社区物资交易互助平台设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff…

嵌入式linux系统中网络编程的具体实现

1.网络编程简介 要编写通过计算机网络通信的程序,首先要确定这些程序同通信的协议(protocol),在设计一个协议的细节之前,首先要分清程序是由哪个程序发起以及响应何时产生。 举例来说,一般认为WEB服务器程序是一个长时间运行的程序(守护进程deamon),它只在响应来自网…

vue3.0 根据富文本html页面生成压缩包(含视频在线地址、图片在线地址、前端截图、前端文档)

vue3.0生成压缩包&#xff08;含在线地址、前端截图、前端文档&#xff09; 需求描述效果开始下载插件包基本代码构造 点击下载按钮1.截图content元素&#xff0c;并转化为pdfcanvas putImageData、getImageDatagetImageData 获取指定矩形区域的像素信息putImageData 将这些数据…

由于导包而引发的错误

今天在调试时发现删除功能无论如何都无法实现&#xff0c;于是调试找到了mapper层的错误但不知道为什么报错。以下是报错信息。 Caused by: org.apache.ibatis.binding.BindingException: Parameter userIds not found. Available parameters are [arg0, collection, list]at o…

黑马2024AI+JavaWeb开发入门Day04-SpringBootWeb入门-HTTP协议-分层解耦-IOCDI飞书作业

视频地址&#xff1a;哔哩哔哩 讲义作业飞书地址&#xff1a;day04作业&#xff08;IOC&DI&#xff09; 作业很简单&#xff0c;主要是练习拆分为三层架构controller、service、dao&#xff0c;并基于IOC & DI进行解耦。 1、结构&#xff1a; 2、代码 网盘链接&…

【LeetCode: 145. 二叉树的后序遍历 + 栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

哈希表算法题

目录 题目一——1. 两数之和 - 力扣&#xff08;LeetCode&#xff09; 1.1.暴力解法1 1.2.暴力解法2 1.2.哈希表解法 题目二——面试题 01.02. 判定是否互为字符重排 - 力扣&#xff08;LeetCode&#xff09; 题目三——217. 存在重复元素 - 力扣&#xff08;LeetCode&…

Galaxy预测比特币期权活跃交易将持续至2027年,特朗普执政中期

随着比特币及其相关产品的交易量不断增加&#xff0c;加密货币市场的期权交易也迎来了前所未有的活跃。Galaxy Digital的交易团队指出&#xff0c;贝莱德IBIT ETF期权在美国股市的交易量已经创下了新纪录。首日交易量高达353,716份合约&#xff0c;几乎与2012年Facebook期权上线…

Java-GUI(登录界面示例)

简述&#xff1a; 步骤&#xff1a; (1)构造界面(将组件对象加入容器对象,注意&#xff1a;应设定对容器对象的布局策略&#xff09; (2)为界面加入事件响应处理(如单击按钮&#xff09; 实现&#xff1a; 两种方式实现&#xff0c;只有用户名为"admin"且密码为…

屏幕分辨率|尺寸|颜色深度指纹

一、前端通过window.screen接口获取屏幕分辨率 尺寸 颜色深度&#xff0c;横屏竖屏信息。 二、window.screen c接口实现&#xff1a; 1、third_party\blink\renderer\core\frame\screen.idl // https://drafts.csswg.org/cssom-view/#the-screen-interface[ExposedWindow ] …

【论文阅读】三平面相关与变体

文章目录 1. 【CVPR2023】Tri-Perspective View for Vision-Based 3D Semantic Occupancy Prediction动机可视化方法Pipeline 2. 【2023/08/31】PointOcc: Cylindrical Tri-Perspective View for Point-based 3D Semantic Occupancy Prediction动机&#xff08;针对雷达点云、与…

Java - JSR223规范解读_在JVM上实现多语言支持

文章目录 1. 概述2. 核心目标3. 支持的脚本语言4. 主要接口5. 脚本引擎的使用执行JavaScript脚本执行groovy脚本1. Groovy简介2. Groovy脚本示例3. 如何在Java中集成 Groovy4. 集成注意事项 6. 与Java集成7. 常见应用场景8. 优缺点9. 总结 1. 概述 JSR223&#xff08;Java Spe…

定时/延时任务-ScheduledThreadPoolExecutor的使用

文章目录 1. 概要2. 固定速率和固定延时2.1 固定速率2.2 固定延时 3. API 解释3.1 schedule3.2 固定延时 - scheduleWithFixedDelay3.2 固定速率 - scheduleWithFixedDelay 4. 小结 1. 概要 前三篇文章的地址&#xff1a; 定时/延时任务-自己实现一个简单的定时器定时/延时任…

什么是sfp,onu,​为什么PON(​俗称“光猫”​)模块使用SC光纤接口

在现代网络设备中&#xff0c;我们经常会看到SFP或SFP接口的身影&#xff0c;这些接口有时被简称为光口&#xff0c;但这个称呼并不严谨。有些厂商则称之为多功能口或多用途口&#xff0c;然而这对于不了解的人来说可能还是一头雾水。SFP&#xff0c;即Small Form-Factor Plugg…

005 MATLAB符号微积分

前言&#xff1a; 在MATLAB中&#xff0c;数值与符号的主要区别在于它们的处理方式和应用场景 数值计算适用于实际的数值计算问题&#xff0c;如矩阵运算、数据分析等。符号计算适用于符号推导、公式化简和符号解析&#xff0c;如理论物理和工程计算。 01 符号对象 1.基本符…

深入实践:从零开始掌握GPT的应用开发

1. 为什么选择GPT&#xff1f; GPT&#xff08;Generative Pre-trained Transformer&#xff09;是当下最具影响力的语言生成模型之一&#xff0c;适用于生成文本、分析语言情感、翻译、多任务对话等多种场景。相比传统算法和模型&#xff0c;GPT有以下显著优势&#xff1a; …

WRF-Chem模式安装、环境配置、原理、调试、运行方法;数据准备及相关参数设置方法

大气污染是工农业生产、生活、交通、城市化等方面人为活动的综合结果&#xff0c;同时气象因素是控制大气污染的关键自然因素。大气污染问题既是局部、当地的&#xff0c;也是区域的&#xff0c;甚至是全球的。本地的污染物排放除了对当地造成严重影响外&#xff0c;同时还会在…

开源项目:纯Python构建的中后台管理系统

来源&#xff1a;Python大数据分析 费弗里 大家好我是费老师&#xff0c;目前市面上有很多开源的「中后台管理系统」解决方案&#xff0c;复杂如「若依」那种前端基于Vue&#xff0c;后端基于Java的框架&#xff0c;虽然其提供了较为完善的一整套前后端分离权限管理系统解决方…

汽车免拆诊断案例 | 2017款捷豹F-PACE车发动机偶尔怠速不稳

故障现象  一辆2017款捷豹F-PACE车&#xff0c;搭载2.0 L GTDi发动机&#xff0c;累计行驶里程约为16万km。车主反映&#xff0c;车辆组合仪表上发动机故障灯点亮&#xff08;图1&#xff09;&#xff0c;且发动机偶尔怠速不稳。 图1 发动机故障灯点亮 故障诊断 接车后试车…