原来一直用迅捷在线转换把pdf转成图片,最近发现没有会员居然不能去水印了,试了下迅读居然可以免费转(虽说是个捆绑软件,意外地很好用),但是以防万一,还是用万能的python写个小程序备用。
(参考资料:python实现高质量PDF转PNG - 知乎 (zhihu.com))
首先下载 fitz 和 PyMuPDF 库
!!!最好先安装fitz再安装PyMuPDF,如果使用时报错fitz ModuleNotFoundError: No module named 'frontend',就把PyMuPDF卸载了重新安装
def pdf_to_image(pdf_path, img_path, zoom_x=5, zoom_y=5, rotation_angle=0):
"""
# 将PDF转化为图片
pdf_path pdf文件的路径
img_path 图像要保存的文件夹
zoom_x x方向的缩放系数
zoom_y y方向的缩放系数
rotation_angle 旋转角度
"""
# 图像要保存的文件夹如果不存在,先创建
if not os.path.exists(img_path):
os.mkdir(img_path)
# 打开PDF文件
pdf = fitz.open(pdf_path)
# 逐页读取PDF
for pg in range(0, pdf.pageCount):
page = pdf[pg]
# 设置缩放和旋转系数
# zoom_x和zoom_y取相同值等比例缩放
trans = fitz.Matrix(zoom_x, zoom_y).preRotate(rotation_angle)
pm = page.getPixmap(matrix=trans, alpha=False)
# 生成图像
pm.writePNG(img_path + '/' + str(pg) + ".png")
pdf.close()
这样子用python运行就能实现转换了,但是还不够方便,所以再安装个tkinter库做个可视化界面
import tkinter as tk
import tkinter.filedialog as tk_filedialog
import tkinter.messagebox as tk_messagebox
import fitz
import os
# 调用Tk()创建主窗口
rw = tk.Tk()
# 目标文件夹路径字符串对象
target_path = tk.StringVar()
# pdf文件路径字符串对象
pdf_file = tk.StringVar()
def select_path():
"""
# 选择目标文件夹
"""
global target_path
path = tk_filedialog.askdirectory()
target_path.set(path)
def select_file():
"""
# 选择PDF文件
"""
global pdf_file
global target_path
file = str(tk_filedialog.askopenfilename(title='选择PDF文件', filetypes=[('PDF', '*.pdf')]))
pdf_file.set(file)
# 默认目标文件夹是PDF文件同级目录下的同名文件夹
target_path.set(file[:file.rindex('.')])
def transfer():
file = pdf_file.get()
path = target_path.get()
if file is None or file == '':
tk_messagebox.showerror("", "未选择PDF文件!")
return
if path is None or path == '':
tk_messagebox.showerror("", "未选择图片存储路径!")
return
try:
pdf_to_image(pdf_file.get(), target_path.get())
except Exception as ex:
tk_messagebox.showerror("", ex)
return
tk_messagebox.showinfo("", "转换成功!")
return
def run_window():
global rw
global target_path
global pdf_file
# 给主窗口起一个名字,也就是窗口的名字
rw.title('PDF转图片')
# rw.config(background="#99CCFF")
screen_width = rw.winfo_screenwidth() # 获取显示区域的宽度
screen_height = rw.winfo_screenheight() # 获取显示区域的高度
width = 300 # 设定窗口宽度
height = 130 # 设定窗口高度
left = (screen_width - width) / 2
top = (screen_height - height) / 2
# 宽度x高度+x偏移+y偏移
# 在设定宽度和高度的基础上指定窗口相对于屏幕左上角的偏移位置,让窗口在屏幕正中间显示
rw.geometry("%dx%d+%d+%d" % (width, height, left, top))
tk.Label(rw).grid(row=0, column=1, columnspan=3)
tk.Label(rw, text="PDF文件:").grid(row=1, column=0, sticky="e")
tk.Entry(rw, textvariable=pdf_file).grid(row=1, column=1)
tk.Button(rw, text="文件选择", command=select_file, relief=tk.GROOVE, height=1, width=8, bg="#FFFFFF", font=("宋体", 10)).grid(row=1, column=2, padx=5)
tk.Label(rw, text="图片存储目录:").grid(row=2, column=0, sticky="e")
tk.Entry(rw, textvariable=target_path).grid(row=2, column=1)
tk.Button(rw, text="路径选择", command=select_path, relief=tk.GROOVE, height=1, width=8, bg="#FFFFFF", font=("宋体", 10)).grid(row=2, column=2, padx=5)
tk.Button(rw, text="转换", command=transfer, relief=tk.GROOVE, width=10, bg="#FFFFFF").grid(row=3, column=1, pady=10)
# 开启主循环,让窗口处于显示状态
rw.mainloop()
最终界面效果图如下
有了界面还要用python运行也太麻烦了,所以再pip安装个pyinstaller,把代码打包成为exe文件,双击就能使用了~( ̄▽ ̄~)(~ ̄▽ ̄)~
exe文件下载地址:https://download.youkuaiyun.com/download/bekote/85013190
做到这个地步,能用是能用,但是忍不住就想再完善一下,让程序可以自定义输出配置,然而tkinter用法还要再研究一下,不能摸鱼太久了orz,只能等下一次有空了,闪人(* ̄▽ ̄)( ̄▽:;.…::;.:.:::;..::;.:...