吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2357|回复: 9
收起左侧

[讨论] python PDF 转word (tk UI打包)小白进度条没搞定

  [复制链接]
lihu5841314 发表于 2021-9-5 14:09
[Asm] 纯文本查看 复制代码
"""
PDF转Word功能所需的依赖包如下:
PDFParser(文档分析器)
PDFDocument(文档对象)
PDFResourceManager(资源管理器)
PDFPageInterpreter(解释器)
PDFPageAggregator(聚合器)
LAParams(参数分析器)
步骤:
安装pdfminer3k模块
安装pip install python_docx
"""
from pdfminer.pdfparser import PDFParser, PDFDocument
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.layout import LAParams
from pdfminer.converter import PDFPageAggregator
from pdfminer.pdfinterp import PDFTextExtractionNotAllowed
from docx import Document
import  tkinter  as tk
import functools,re,time
from tkinter import  ttk
from  tkinter.filedialog import   askdirectory,askopenfilename
from threading import Thread

document = Document()

def cal_back(func):
    # 添加装饰函数,目的不改变被装饰函数的函数名
    @functools.wraps(func)
    def marge(*args):
        t = Thread(target=func, args=(*args,))  # 第一个参数是线程函数变量,第二个参数args是一个数组变量参数,如果只传递一个值,就只需要i, 如果需要传递多个参数,那么还可以继续传递下去其他的参数,其中的逗号不能少,少了就不是数组了,就会出错。
        print(func.__name__, "正在开启线程")  # func.__name__获取 函数名字
        t.start()

    return marge



@cal_back
def parse():
    start = time.time()
    text1.delete("1.0","end")
    path1 = vv1.get()
    #判断是不是pdf文件
    if  path1.split(".")[-1]!="pdf":
          print("请选择pdf文件")
          text1.insert("insert","***请选择pdf文件***")
          text1.insert("insert", "\n")
          return
    else:
        name = path1.split("\\")[-1].split(".")[0]
        print(name)
        # rb以二进制读模式打开本地pdf文件
        fn = open(path1, 'rb')
        text1.insert("insert", f"正在打开{name}文件")
        text1.insert("insert", "\n")
        # 创建一个pdf文档分析器
        parser = PDFParser(fn)
        text1.insert("insert", f"创建一个pdf文档分析器")
        text1.insert("insert", "\n")
        # 创建一个PDF文档
        doc = PDFDocument()
        # 连接分析器 与文档对象
        parser.set_document(doc)
        doc.set_parser(parser)
        text1.insert("insert", f"连接分析器 与文档对象")
        text1.insert("insert", "\n")


        # 提供初始化密码doc.initialize("lianxipython")
        # 如果没有密码 就创建一个空的字符串
        doc.initialize("")
        # 检测文档是否提供txt转换,不提供就忽略
        if not doc.is_extractable:
            raise PDFTextExtractionNotAllowed

        else:
            # 创建PDf资源管理器
            resource = PDFResourceManager()
            text1.insert("insert", f"创建PDf资源管理器")
            text1.insert("insert", "\n")
            # 创建一个PDF参数分析器
            laparams = LAParams()
            # 创建聚合器,用于读取文档的对象
            device = PDFPageAggregator(resource, laparams=laparams)
            # 创建解释器,对文档编码,解释成Python能够识别的格式
            interpreter = PDFPageInterpreter(resource, device)
            # 循环遍历列表,每次处理一页的内容
            # doc.get_pages() 获取page列表
            text1.insert("insert", f"循环遍历列表,每次处理一页的内容")
            text1.insert("insert", "\n")


            for page in doc.get_pages():
                # 利用解释器的process_page()方法解析读取单独页数
                interpreter.process_page(page)
                # 使用聚合器get_result()方法获取内容
                layout = device.get_result()
                # 这里layout是一个LTPage对象,里面存放着这个page解析出的各种对象
                for out in layout:
                    # 判断是否含有get_text()方法,获取我们想要的文字
                    if hasattr(out, "get_text"):
                        # print(out.get_text(), type(out.get_text()))
                        content = out.get_text().replace(u'\xa0', u' ')  # 将'\xa0'替换成u' '空格,这个\xa0就是&nbps空格
                        # with open('test.txt','a') as f:
                        #     f.write(out.get_text().replace(u'\xa0', u' ')+'\n')
                        document.add_paragraph(
                            content, style='ListBullet'  # 添加段落,样式为unordered list类型
                        )
                    document.save(vv2.get() +"\\"+name + '.docx')  # 保存这个文档
                text1.insert("insert", f"正在添加段落,获取我们想要的文字,请等候========")
                text1.insert("insert", "\n")
                text1.see("end")
            tim = time.time()-start
            tim = round(tim,2)
            text1.insert("insert", f"{name}转换完毕")
            text1.insert("insert", "\n")
            text1.insert("insert", f"一共耗时{tim}秒")
            text1.see("end")

def select_file():
    path = askopenfilename()
    #re.sub(r'[0-9]', '*', s) 这句话则表示只匹配单一数字,并将每一个数字替换为一个星号 。
    path = re.sub(r"/","\\\\",path) #用正则是要用\\\\转义
    # path =path.replace("/","\\")
    vv1.set(path)
    print(path)

def save_address():
    path = askdirectory()
    path = path.replace("/", "\\")
    vv2.set(path)
    print(path)
# #显示下载进度
# def  progress():
#     #填充进度条
#     fill_line = canvas.create_rectangle(1.5,1.5,0,23,width=0,fill="green")
#     x=500
#     n= 465/x   #465是矩形填充满的次数
#     for  i  in  range(x):
#          n = n + 465/x
#          print(n)
#          canvas.coords(fill_line,(0,0,n,60))
#          root.update()
#          time.sleep(0.02)  #控制进度条流动的速度
#
#     #清空进度条
#     fill_line = canvas.create_rectangle(1.5,1.5,0,23,width=0,fill="white")
#     x= 500  #未知变量,可更改
#     n= 465/x   #465是矩形填充满的次数
#     for  i  in  range(x):
#          n = n + 465/x
#          canvas.coords(fill_line,(0,0,n,60))
#          root.update()
#          time.sleep(0)  #控制进度条流动的速度

#画布
root = tk.Tk()
#标题
root.title("pdf转word")
#大小
root.geometry('480x370')
#组件
#组件1  标签
tk.Label(root,text="pdf转word",font=("楷书",20)).place(x=180,y=10)
#选择pdf文件按钮 和输入框
vv1=tk.StringVar()
vv2=tk.StringVar()
btn1 =ttk.Button(root,text='选择pdf文件',command=select_file).place(x=10,y=50)
Ent1 =ttk.Entry(root,width=48,textvariable=vv1).place(x=120,y=52)
#保存位置 文本框状态选项,状态有DISABLED/NORMAL,DISABLED状态文本框无法输入,NORMAL状态可以正常输入
btn2 =ttk.Button(root,text='doc保存位置',command=save_address).place(x=10,y=90)
Ent2 =ttk.Entry(root,width=48,textvariable=vv2)
Ent2.place(x=120,y=92)
#保存位置
btn3 =ttk.Button(root,text='开始转换',command=parse).place(x=10,y=125)

#状态栏文本区域
text1 = tk.Text(root,width=64,height=14)
text1.place(x=10,y=160)

# #进度条
# canvas = tk.Canvas(root,width=450,height=24,bg="white")
# canvas.place(x=10,y=350)




#循环
root.mainloop()

#++++++++++++
链接: https://pan.baidu.com/s/1gvRzZ9-21maCvwbyK92qvg 提取码: d55x 复制这段内容后打开百度网盘手机App,操作更方便哦
8D2243F8-90CD-49d6-9964-DB94C484749F.png

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
九点五指 + 1 + 1 请问WORD转PDF后 不让图片像素降低的办法。
枫叶荻花 + 1 + 1 建立再打包个32位的

查看全部评分

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

江男 发表于 2021-9-5 14:58
本帖最后由 江男 于 2021-9-5 15:00 编辑

参考装饰器是怎么实现的,进度条的话用PYQT5比较好实现,有现成可用的库函数
tek2y 发表于 2021-9-5 15:22
sxpdwzs 发表于 2021-9-5 15:55
 楼主| lihu5841314 发表于 2021-9-5 16:30
sxpdwzs 发表于 2021-9-5 15:55
图片未识别 那怕是以图片格式存在

图片肯定不行
lwedwin 发表于 2021-9-5 20:34
感谢分享,就是功能少了点
ch52 发表于 2021-9-5 21:03
不错的工具,多谢分享!
九点五指 发表于 2021-9-6 11:56
感谢楼主,正在做窗口,你这里可以参考一下。
最近也做了一个简单的  多图片排版成WORD,转成PDF,不过转成PDF后,图片像素被压缩的有点狠。
不知道 楼主有没有啥 解决办法。
baggio_czm 发表于 2021-10-21 11:52
谢谢分享,正在学习PY
baggio_czm 发表于 2021-10-21 12:17
最近在学PY,谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-25 21:13

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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