一:实现原理
将ppt/pptx转换成pdf,利用前端iframe标签实现预览
二:ppt转换为pdf
将目标文件夹下的ppt/pptx全部转换为pdf
import win32com.client
import os
def ppt_pdf(filename, output_filename):
ppt_app = win32com.client.Dispatch('PowerPoint.Application')
ppt = ppt_app.Presentations.Open(filename)
ppt.SaveAs(output_filename, 32)
ppt_app.Quit()
dirname = 'D:/' # ppt路径
filenames = os.listdir(dirname) # 所有文件
for filename in filenames:
if filename.endswith('ppt') or filename.endswith('pptx'): # 遍历寻找ppt/pptx
base, ext = filename.split('.')
new_name = base + '.pdf'
filename = dirname + '/' + filename
output_filename = dirname + '/' + new_name # pdf保存路径
ppt_pdf(filename, output_filename)
参考文章:
小tips:
如果是在多线程里调用win32com包可能会出现这个报错:
pywintypes.com_error: (-2147221008, '尚未调用 CoInitialize。', None, None)
解决方法是导入 pythoncom 库,然后线程前面加一句这个即可 pythoncom.CoInitialize()
参考文章:
本文的话就是这样:
import pythoncom # 增加导入
def ppt_pdf(filename, output_filename):
pythoncom.CoInitialize() # 增加这句
ppt_app = win32com.client.Dispatch('PowerPoint.Application')
ppt = ppt_app.Presentations.Open(filename)
ppt.SaveAs(output_filename, 32)
ppt_app.Quit()
三:前端预览
后端传输文件名file_name给前端HTML
(这里是由于我想要动态改变预览的pdf链接,正常直接用iframe标签打开预览即可)
content = {
'file_name': file_name,
}
return render_template('file_name.html', **content)
前端获取后拼接好地址给iframe标签的src,这样就能实现预览不同ppt
<body>
<input type="hidden" id="file_name" value="{{ file_name }}">
<iframe id="reportFrame" src="" frameborder="0" style="border: none; width: 100%; height: 100%"></iframe>
</body>
<script>
var file_name = $('#file_name').val();
let url = '/static/' + file_name ; // 拼接地址
document.getElementById('reportFrame').src = url
</script>