предисловие
Однажды, когда мы работали в фоновом режиме редактирования, мы сказали, что каждый раз, когда мы загружаем 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)
слово к изображению
Чтобы преобразовать слово в изображение, вам нужно один раз передать, сначала преобразовать слово в 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 HUAWEI CLOUD. Хранилища объектов, такие как Alibaba Cloud и Tencent Cloud, имеют свои собственные SDK для Python, к которым легко получить доступ.
Наконец, сгруппируйтесь, чтобы позвонить
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 поиск进阶的大前端
Апплеты