Python批量把PDF转换为PNG图片(带界面)

利用Python的fitz模块可以很方便的操作PDF,fitz模块是pymupdf模块的升级版,pymupdf模块用于读取和处理PDF文件,fitz则在此基础上增加了PDF文件的编辑功能,可以合并、删除、替换、旋转和调整PDF页面大小等功能。

首先安装fitz模块:

pip install PyMuPDF

示例代码:

import fitz

# 打开PDF文件
doc = fitz.open('example.pdf')

# 打印PDF文件中的页面数量
print(doc.page_count)

# 获取PDF文件中的第一页
page = doc.load_page(0)

# 提取页面中的文本
text = page.get_text()

# 保存PDF文件中的第一页为图片
pix = page.get_pixmap(alpha=False)
pix.save('page-1.png')

# 关闭PDF文件
doc.close()

上面的代码虽然可以实现功能,但是使用起来非常的不方便。我们的目标是要做一个完整的程序,如图:

首先我们使用tkiner来实现gui:

root = tkinter.Tk()
root.title("PDF批量转图片")
root.geometry('400x400')
root.resizable(width=False, height=False)

msg = tkinter.StringVar()

listbox1 = tkinter.Listbox(root,width=50)
listbox1.pack(pady=10)

windnd.hook_dropfiles(root, func=dragged_files)

msg.set('请拖入PDF文件')
label1 = tkinter.Label(root,textvariable=msg, background='#ffffff', foreground='#0066cc',width=50)  # 使用 textvariable 代替 text
label1.pack(pady=10)

fm_button = tkinter.Frame(root)
btn0 = tkinter.Button(fm_button, text='清空', width=10, height=2, state='disabled', command=clear_files)
btn0.grid(row=0, column=0, padx=10)
btn1 = tkinter.Button(fm_button, text='开始', width=10, height=2, command=thread_start)
btn1.grid(row=0, column=1, padx=10)
fm_button.pack(pady=10)

root.mainloop()

拖动文件到窗口,可以把文件列表加载至listbox中

#拖动文件至listbox
def dragged_files(files):
    for f in files:
        if is_pdf_file(f):
            listbox1.insert('end', f.decode('gbk'))
    if listbox1.get(0,"end"):
        btn0.config(state='normal')

点击开始按钮,即可批量将PDF转换成PNG图片,会根据PDF名称,在当前目录创建一个文件夹,将PNG图片文件保存至文件夹内。当然也可以转换成其他格式,可自行修改:


#转换所有文件
def conver_all():
    for f in listbox1.get(0,"end"):
        file_name = os.path.basename(f)
        out_path = os.path.splitext(f)[0]
        if not os.path.exists(out_path):
            os.makedirs(out_path)
        with lock:  #  加锁
            msg.set('开始:'+file_name)
        conver_pdf(f, out_path)
    msg.set('已处理完成!')
    showinfo(title='提示',message='已处理完成!')

#将文件转换成PNG
def conver_pdf(pdf_file, out_path):
    pdfDoc = fitz.open(pdf_file)
    for pg in range(pdfDoc.pageCount):
        page = pdfDoc[pg]
        rotate = int(0)
        #(1.33333333-->1056x816)   (2-->1584x1224)
        zoom_x = 1.33333333 
        zoom_y = 1.33333333
        mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
        pix = page.getPixmap(matrix=mat, alpha=False)
        out_file = '{}/images_{}.png'.format(out_path, pg)        
        pix.writePNG(out_file)
        with lock:  #  加锁
            msg.set(os.path.basename(out_file))

最后,如果我们直接运行conver_all()函数,会导致程序卡顿,所以我们需要用多线程来运行它:

#多线程转换
def thread_start():
    items = listbox1.get(0,"end")
    if not items:
        showinfo(title='错误', message='先拖入pdf文件!')
    else:
        t = threading.Thread(target=conver_all)
        t.start()

当然这只是一个非常简单的带gui的pdf转换图片功能,我们可以继续扩展界面,增加导出图片格式,大小,以及导出位置等等信息来扩展功能。

完整代码下载:

链接:https://pan.baidu.com/s/1lFgptuWflkbXdd3I4o62bQ 提取码:6666

发布日期:2023-05-12 浏览次数:689

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注