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
发表回复