吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 3928|回复: 108
收起左侧

[Python 原创] PDF转图片或Word文档

  [复制链接]
KentChen0126 发表于 2024-1-9 23:38
本帖最后由 KentChen0126 于 2024-1-21 00:32 编辑

因工作需要,经常要将PDF转换为图片,所以自己摸索使用Python写一个PDF转换器,现在分享出来,与大家一起交流。

一、功能:
    1、将PDF文件转换为JPG图片;
    2、将PDF文件转换为Word文档,若PDF文件是通过Word文档转换的,可完美转换为可编辑Word文档。
    3、可选择多个文件或文件夹批量转换。

三、界面展示:
界面.jpg

三、需要的第三方库:
[Python] 纯文本查看 复制代码
pdf2docx==0.5.7
PyMuPDF==1.23.8


四、源代码;
[Python] 纯文本查看 复制代码
import tkinter as tk
from tkinter import filedialog
import fitz
from pdf2docx import Converter
import os
import time
import threading
import ctypes


class PdfConverter:

    def __init__(self):
        self.root = tk.Tk()
        self.root.title('PDF转换器')
        self.root.geometry("500x300+350+250")
        #self.root.resizable(width=False,height=False)禁用最大化
        #self.root.overrideredirect(1)删除主窗口标题栏
        self.interface()

    def interface(self):
        """"界面编写位置"""
        self.Button0 = tk.Button(self.root, text="选择文件", command=self.multiple_files)
        self.Button0.grid(row=0, column=0, pady=20)

        self.Button0 = tk.Button(self.root, text="选择文件夹", command=self.single_folder)
        self.Button0.grid(row=0, column=1, pady=20)

        self.Button1 = tk.Button(self.root, text="转为图片", command=self.start_to_jpg)
        self.Button1.grid(row=0, column=2, pady=20)

        self.Button2 = tk.Button(self.root, text="转为Word", command=self.start_to_word)
        self.Button2.grid(row=0, column=3, pady=20)

        self.w1 = tk.Text(self.root, width=68, height=15)
        self.w1.insert('insert','说明:1、文件可单选或多选;文件夹下文件均需转换,可直接选择文件夹;\n      2、转换后文件保存位置为所选文件或文件夹位置。')
        self.w1.grid(row=1, column=0, columnspan=4, padx=10)

    def single_folder(self):
        '''获取单个文件夹'''
        path = filedialog.askdirectory() + '/'
        files_path = [os.path.join(path,i) for i in os.listdir(path) if os.path.splitext(i)[-1].lower() == '.pdf']
        if len(files_path) != 0:
            self.w1.delete('1.0',tk.END)
            self.w1.insert('insert','\n'.join(files_path))

    def multiple_files(self):
        '''获取多个文件'''
        path = filedialog.askopenfilenames(filetypes=[('All Files', '.PDF')])
        if len(path) != 0:
            self.w1.delete('1.0',tk.END)
            self.w1.insert('insert','\n'.join(path))

    def pdf_to_jpg(self):
        '''将PDF转换为图片'''
        start_time = time.time()
        for file in self.path_list:
            os.makedirs(os.path.splitext(file)[0],exist_ok=True) # 创建以PDF文件名命名的文件夹
            pdf = fitz.open(file) # 打开PDF文件
            temp = 0
            for pg in range(pdf.page_count):
                page = pdf[pg]
                temp += 1
                rotate = int(0)
                # 每个尺寸的缩放系数为2,这将为我们生成分辨率提高四倍的图像。
                zoom_x = 2
                zoom_y = 2
                trans = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
                pm = page.get_pixmap(matrix=trans, alpha=False)
                pic_name = '{}.jpg'.format(temp)
                #拼接生成图片存放的文件路径
                pic_pwd = os.path.join(os.path.splitext(file)[0], pic_name)
                pm.save(pic_pwd)
            self.w1.insert('end','完成 %s 转换\n' % os.path.split(file)[1])
            #self.w1.insert(tk.INSERT,'\n')换行
        end_time = time.time()
        self.w1.insert('end','转换已完成,共用时 %.2f 秒' % ((end_time - start_time)))
        
    def start_to_jpg(self):
        #将路径字符串转换为列表,strip():去除字符串前后空格或特殊字符;split('\n'):将字符串转为列表,元素以换行符分割
        self.path_list = self.w1.get('1.0','end').strip().split('\n')
        self.w1.delete('1.0',tk.END)
        if os.path.isfile(self.path_list[0]):
            self.T = threading.Thread(target=self.pdf_to_jpg)
            self.T.setDaemon(True)
            self.T.start()
        else:
            self.w1.insert('insert','请选择文件或文件夹')

    def pdf_to_word(self):
        '''将PDF转换为WORD'''
        start_time = time.time()
        for file in self.path_list:
            docx_name = os.path.splitext(file)[0] + '.docx'
            cv = Converter(file)
            cv.convert(docx_name)
            cv.close
            self.w1.insert('end','完成 %s 转换\n' % os.path.split(file)[1])
            #self.w1.insert(tk.INSERT,'\n')换行
        end_time = time.time()
        self.w1.insert('end','转换已完成,共用时 %.2f 秒' % ((end_time - start_time)))

    def start_to_word(self):
        #将路径字符串转换为列表,strip():去除字符串前后空格或特殊字符;split('\n'):将字符串转为列表,元素以换行符分割
        self.path_list = self.w1.get('1.0','end').strip().split('\n')
        self.w1.delete('1.0',tk.END)
        if os.path.isfile(self.path_list[0]):
            self.T = threading.Thread(target=self.pdf_to_word)
            self.T.setDaemon(True)
            self.T.start()
        else:
            self.w1.insert('insert','请选择文件或文件夹')


if __name__ == '__main__':
    whnd = ctypes.windll.kernel32.GetConsoleWindow()
    if whnd != 0:
        ctypes.windll.user32.ShowWindow(whnd, 0)
        ctypes.windll.kernel32.CloseHandle(whnd)
    a = PdfConverter()
    #a.root.after(1000,a.pdf_to_jpg)
    a.root.mainloop()


应大家要求,将源代码打包成EXE文件并放到蓝奏云网盘了,供大家下载。
源代码稍作修改:
1、增加右侧滚动条;
2、转换成Word文档时将转换日志显示出来。
打包文件如下:
https://www.ilanzou.com/s/07WNOdD

免费评分

参与人数 15吾爱币 +15 热心值 +14 收起 理由
bingduti + 1 + 1 谢谢@Thanks!
andylove + 1 + 1 能不能用百度云或阿里云分享,蓝奏云优享版竟然还要开会员才能下载文件。
guoruihotel + 1 + 1 谢谢@Thanks!
qwe1111 + 1 + 1 谢谢@Thanks!
doudou110 + 1 + 1 谢谢@Thanks!
wqjsir + 1 + 1 很好用
qingfeng1214 + 1 + 1 谢谢@Thanks!
wangcx + 1 热心回复!
老鬼222 + 1 + 1 谢谢@Thanks!
spctiger + 1 + 1 支持原创~
ysy2001 + 1 + 1 谢谢@Thanks!
YYL7535 + 1 + 1 谢谢@Thanks!
LuckyClover + 1 + 1 热心回复!
你是谁啊这么帅 + 1 + 1 谢谢@Thanks!
为之奈何? + 1 + 1 我很赞同!

查看全部评分

本帖被以下淘专辑推荐:

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

topcoolgame 发表于 2024-1-10 09:57
建议 打包成exe 安装或者运行文件,方便小白直接使用。  此程序已收入到,不可错过的施用工具
BilboBaggins 发表于 2024-1-10 08:39
丶丿後宫 发表于 2024-1-10 10:54
kakaxixi2024 发表于 2024-1-10 02:55
看看怎么样,正好需要办公使用到,谢谢。
刘大富 发表于 2024-1-10 03:23
感谢分享
zhangting2022 发表于 2024-1-10 04:54
kakaxixi2024 发表于 2024-1-10 02:55
看看怎么样,正好需要办公使用到,谢谢。

效果怎么样?
你是谁啊这么帅 发表于 2024-1-10 06:58
感谢大佬分享
chyutong 发表于 2024-1-10 07:37
感谢楼主分享
Python666999 发表于 2024-1-10 07:44
先收藏了,再学习使用
chuh 发表于 2024-1-10 07:55
谢谢@Thanks!
cjy1link 发表于 2024-1-10 07:56
这功能我也会常用到
liuyangmochen 发表于 2024-1-10 08:02
请问可以吧软件分享么?需要安装PY?小白 不太懂
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-29 12:51

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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