python批量ppt轉圖片,pdf轉圖片,word轉圖片指令碼

zhou_web發表於2021-11-29

前言

某天我們運營在編輯後臺的時候說每次上傳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搜尋 進階的大前端

相關文章