吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 547|回复: 32
上一主题 下一主题
收起左侧

[原创工具] 简单的PDF转JPG小工具,单文件,支持拖拽,支持缩放,附源码

[复制链接]
跳转到指定楼层
楼主
szh12123 发表于 2024-11-24 18:11 回帖奖励
本帖最后由 szh12123 于 2024-11-24 18:18 编辑

本人建筑师一枚,由于工作上有时会用到PDF转JPG的时候,
adobe PDF转质量不太好,通常是用Indesign转,但是操作过程比较繁琐,遇到日照分析的pdf根本打不开,
刚好周末不加班,加上之前有点python基础,于是花了点时间研究了一下如何做一个程序,
查阅了很多资料,就像打怪升级,最后通过以下库实现,
比如:tkinter库做交互,pymupdf库转图片,tkinterdnd2库实现拖拽,pyinstaller库打包。
软件是用python写的,由于是新手,代码可能写的不尽人意,各位大佬有兴趣的可以帮忙优化指点,源码附下文。

软件下载:
百度网盘:https://pan.baidu.com/s/1VPFASoIDrX-a_xiaLrOaFw?pwd=52pj

源码.py:
PDF转JPG工具.zip (1.8 KB, 下载次数: 40)

软件运行界面:


软件大小:26.6M(刚开始打包有好几百兆,后面偶然发现虚拟环境pipenv库打包,于是缩减了很多,但好像也不是很小)

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

软件源码:
[Python] 纯文本查看 复制代码
#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()

免费评分

参与人数 3吾爱币 +9 热心值 +3 收起 理由
Acerry + 1 + 1 我很赞同!
maheadst + 1 + 1 谢谢@Thanks!
风之暇想 + 7 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

沙发
yjf306 发表于 2024-11-26 22:07
谢谢楼主提供
3#
xiaoxing365 发表于 2024-11-26 23:30
4#
mocken 发表于 2024-11-27 07:51
5#
风中飘雪 发表于 2024-11-27 08:52
能否打个包,搞成可执行文件?
6#
zyqking 发表于 2024-11-27 10:34
想找个PPT转JPG
7#
wangzhj2 发表于 2024-11-27 10:45
很有用,谢谢分享!
8#
igloo 发表于 2024-11-27 10:58
感谢楼主分享好资源
9#
hhyqqq 发表于 2024-11-27 11:01

感谢楼主的制作与分享!
10#
maoyj 发表于 2024-11-27 11:21
感谢分享!支持支持!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 20:20

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表