CN日记 || Python | PDF转图片

原来一直用迅捷在线转换把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.csdn.net/download/bekote/85013190

做到这个地步,能用是能用,但是忍不住就想再完善一下,让程序可以自定义输出配置,然而tkinter用法还要再研究一下,不能摸鱼太久了orz,只能等下一次有空了,闪人(* ̄▽ ̄)( ̄▽:;.…::;.:.:::;..::;.:...

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bekote

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值