python PDF 转word (tk UI打包)小白进度条没搞定
"""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
importtkinteras tk
import functools,re,time
from tkinter importttk
fromtkinter.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文件
ifpath1.split(".")[-1]!="pdf":
print("请选择pdf文件")
text1.insert("insert","***请选择pdf文件***")
text1.insert("insert", "\n")
return
else:
name = path1.split("\\")[-1].split(".")
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'', '*', 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)
# #显示下载进度
# defprogress():
# #填充进度条
# fill_line = canvas.create_rectangle(1.5,1.5,0,23,width=0,fill="green")
# x=500
# n= 465/x #465是矩形填充满的次数
# foriinrange(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是矩形填充满的次数
# foriinrange(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,操作更方便哦 本帖最后由 江男 于 2021-9-5 15:00 编辑
参考装饰器是怎么实现的,进度条的话用PYQT5比较好实现,有现成可用的库函数 感谢楼主分享 图片未识别 那怕是以图片格式存在 sxpdwzs 发表于 2021-9-5 15:55
图片未识别 那怕是以图片格式存在
图片肯定不行 感谢分享,就是功能少了点 不错的工具,多谢分享! 感谢楼主,正在做窗口,你这里可以参考一下。
最近也做了一个简单的多图片排版成WORD,转成PDF,不过转成PDF后,图片像素被压缩的有点狠。
不知道 楼主有没有啥 解决办法。
谢谢分享,正在学习PY 最近在学PY,谢谢分享
页:
[1]