关于python:python批量ppt转图片pdf转图片word转图片脚本

8次阅读

共计 3521 个字符,预计需要花费 9 分钟才能阅读完成。

前言

某天咱们经营在编辑后盾的时候说每次上传 ppt,pdf,word 时都要把每个文件先导出一次图片, 而后一个一个上传 (png 用作预览,ppt,pdf,word 源文件不能间接下载的),说效率太低了,问有没有方法只有上传文件就行。过后就想了想每个上传都转一次的确效率低,因为有些导出来可能有几十张图片。

最初通过 GitHub 和网友博客。最终把主动转图片问题解决。第一次写 python 脚本有谬误不优雅的欢送指出~

本文 python 版本 3.9.5
需 windows 平台,需装置 Microsoft Office

脚本思路

经营人员上传 ppt,pdf,word 到数据库,脚本读取文件近程连贯 -> 下载到本地 -> 转图片 -> 上传到云存储 -> 获取近程图片连贯 -> 存储到数据库。

连贯数据库查问须要转的汇合

def connectDatabase():
    conn = pymysql.connect(host='127.0.0.1', user='root', password="",database ='pic',port=3306)  
# host=localhost #也能够写, 如果 127.0.0.1 不能用的话#  登录数据库
    cur = conn.cursor(pymysql.cursors.DictCursor) 
    return {
       "conn":conn,
       "cur":cur
    }
# 获取须要转的文件汇合
def getUrlArr(cur):
    sql = 'select * from pic' # 写本人的 sql 语句
    arr = ''
    try:
        cur.execute(sql)
        ex = cur.execute(sql)
        arr = cur.fetchmany(ex)
    except Exception as e:
        raise e
    finally:
        return arr

下载文件到本地

# 下载文件到本地
def downLoad(url):
    print('----url-----',url)
    filename=''
    try:
        suffix = os.path.basename(url).split('.')[1]
        filename = "miaohui."+suffix
        if os.path.exists(filename):  # 如果文件存在 删除文件
            os.remove(filename)
        wget.download(url,filename)
    except IOError:
        print('下载失败',url)
    else:
        print('\n')
        print('下载胜利',url)
        return filename

ppt 转图片

# pip install pywin32

# 初始化 PPT
def init_powerpoint():
    powerpoint = win32com.client.Dispatch('PowerPoint.Application') #comtypes.client.CreateObject("Powerpoint.Application")
    powerpoint.Visible = 1
    return powerpoint
# PPT 转 png
def ppt2png(url,pptFileName,powerpoint):
    try:
        ppt_path = os.path.abspath(pptFileName)
        ppt = powerpoint.Presentations.Open(ppt_path)
        #保留为图片
        img_path = os.path.abspath(downLoad_path + '.png')
        ppt.SaveAs(img_path, 18) # 17 保留为 jpg 格局
        # 敞开关上的 ppt 文件
        ppt.Close()
    except IOError:
        print('PPT 转 png 失败',url)
    else:
        print("PPT 转 png 胜利",url)

pdf 转图片

# pip install PyMuPDF
# pdf 转图片
def pdf2png(_url,pptFileName):
    imagePath = os.path.abspath(downLoad_path)
    try:
        pdfDoc = fitz.open(pptFileName)
        for pg in range(pdfDoc.pageCount):
            page = pdfDoc[pg]
            rotate = int(0)
            # 每个尺寸的缩放系数为 1.3,这将为咱们生成分辨率进步 2.6 的图像。# 此处若是不做设置,默认图片大小为:792X612, dpi=96
            zoom_x = 1.33333333  # (1.33333333-->1056x816)   (2-->1584x1224)
            zoom_y = 1.33333333
            mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
            pix = page.get_pixmap(matrix=mat, alpha=False)

            if not os.path.exists(imagePath):  # 判断寄存图片的文件夹是否存在
                os.makedirs(imagePath)  # 若图片文件夹不存在就创立
            pix.save(imagePath + '/' + '幻灯片 %s.png' % pg)  # 将图片写入指定的文件夹内

    except IOError:
        print('pdf 转 png 失败',_url)
    else:
        print("pdf 转 png 胜利",_url)

word 转图片

word 转图片要先直达一次,先把 word 转成 pdf,而后再把 pdf 转成图片。

# word 转 Pdf
def word2pdf(word_file):
    '''
    将 word 文件转换成 pdf 文件
    :param word_file: word 文件
    :return:
    '''
    # 获取 word 格局解决对象
    word = Dispatch('Word.Application')
    # 以 Doc 对象关上文件
    doc_ = word.Documents.Open(word_file)
    # 另存为 pdf 文件
    suffix = os.path.basename(word_file).split('.')[1]
    doc_.SaveAs(word_file.replace(suffix, "pdf"), FileFormat=17)
    print(word_file,'---- 转 pdf 胜利')
    # 敞开 doc 对象
    doc_.Close()
    # 退出 word 对象
    word.Quit()
    return os.path.basename(word_file).split('.')[0]+'.pdf'

而后在调用下面的pdf2png

上传到对象存储

这里就不贴出来了,咱们用的是华为云的 OBS。阿里云,腾讯云等对象存储都有各自的 Python 版 SDK,接入也很不便。

最初组在一起调用

if __name__=='__main__':
    connect = connectDatabase()
    powerpoint = init_powerpoint()
    downArr = getUrlArr(connect['cur'])
    for i in downArr:
        if(os.path.exists('./'+downLoad_path)):
            removeFileInFirstDir('./'+downLoad_path)
        _url = unquote(i['url'])
        id = i['id']
        pptFileName = downLoad(_url)# 下载文件
        if(('.pdf' in _url) ==True):
            pdf2png(_url,pptFileName)
        elif (('.doc' in _url) ==True):
            _file = os.path.abspath(pptFileName)
            pdfNmae = word2pdf(_file)
            pdf2png(_url,pdfNmae)
        else:   
             ppt2png(_url,pptFileName,powerpoint) #转 png
        imgArr = uploadImg(_url) #上传图片到云存储拿到近程链接
        setData(_url,id,imgArr,connect) #保留到数据库
        time.sleep(2)
        print('\n')
        print('\n')
    connect['cur'].close()    #敞开游标
    connect['conn'].close()   #断开数据库, 开释资源
    powerpoint.Quit()
    input("输出任意键完结")

因为是本人外部用,所以能够应用 pyinstaller 打包成了一个 exe,提供给经营用,材料上传完运行下,便可批量主动转图片了。

#py 转 exe
pyinstaller -c -F -i a.ico ppt_to_img.py   

最初

心愿本文对你有一些帮忙,如有问题,欢送斧正~

换工作?找面试题?来前端面试题库 wx 搜寻 进阶的大前端

正文完
 0