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