python 如何将office文件转换为PDF


Posted in Python onSeptember 22, 2020

在平时的工作中,难免需要一些 小Tip 来解决工作中遇到的问题,今天的文章给大家安利一个方便快捷的小技巧,将 Office(doc/docx/ppt/pptx/xls/xlsx)文件批量或者单一文件转换为 PDF 文件。 不过在做具体操作之前需要在 PC 安装好 Office,再利用 Python 的 win32com 包来实现 Office 文件的转换操作。

安装 win32com

在实战之前,需要安装 Python 的 win32com,详细安装步骤如下:

使用 pip 命令安装

pip install pywin32

如果我们遇到安装错误,可以通过python -m pip install ?upgrade pip更新云端的方式再进行安装即可:

python -m pip install --upgrade pip

下载离线安装包安装

如果 pip 命令未安装成功的话还可以下载离线包安装,方法步骤如下: 首先在官网选择对应的 Python 版本下载离线包:https://sourceforge.net/projects/pywin32/files/pywin32/Build%20221/ 下载好后傻瓜式安装好即可。

文件转换逻辑

详细代码如下:

class PDFConverter:
 def __init__(self, pathname, export='.'):
  self._handle_postfix = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx'] # 支持转换的文件类型
  self._filename_list = list() #列出文件
  self._export_folder = os.path.join(os.path.abspath('.'), 'file_server/pdfconver')
  if not os.path.exists(self._export_folder):
   os.mkdir(self._export_folder)
  self._enumerate_filename(pathname)

 def _enumerate_filename(self, pathname):
  '''
  读取所有文件名
  '''
  full_pathname = os.path.abspath(pathname)
  if os.path.isfile(full_pathname):
   if self._is_legal_postfix(full_pathname):
    self._filename_list.append(full_pathname)
   else:
    raise TypeError('文件 {} 后缀名不合法!仅支持如下文件类型:{}。'.format(pathname, '、'.join(self._handle_postfix)))
  elif os.path.isdir(full_pathname):
   for relpath, _, files in os.walk(full_pathname):
    for name in files:
     filename = os.path.join(full_pathname, relpath, name)
     if self._is_legal_postfix(filename):
      self._filename_list.append(os.path.join(filename))
  else:
   raise TypeError('文件/文件夹 {} 不存在或不合法!'.format(pathname))

 def _is_legal_postfix(self, filename):
  return filename.split('.')[-1].lower() in self._handle_postfix and not os.path.basename(filename).startswith(
   '~')

 def run_conver(self):
  print('需要转换的文件数是:', len(self._filename_list))
  for filename in self._filename_list:
   postfix = filename.split('.')[-1].lower()
   funcCall = getattr(self, postfix)
   print('原文件:', filename)
   funcCall(filename)
  print('转换完成!')

doc/docx 转换为 PDF

doc/docx 转换为 PDF 部分代码如下所示:

def doc(self, filename):
  name = os.path.basename(filename).split('.')[0] + '.pdf'
  exportfile = os.path.join(self._export_folder, name)
  print('保存 PDF 文件:', exportfile)
  gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 4)
  pythoncom.CoInitialize()
  w = Dispatch("Word.Application")
  pythoncom.CoInitialize() # 加上防止 CoInitialize 未加载
  doc = w.Documents.Open(filename)
  doc.ExportAsFixedFormat(exportfile, constants.wdExportFormatPDF,
        Item=constants.wdExportDocumentWithMarkup,
        CreateBookmarks=constants.wdExportCreateHeadingBookmarks)
  w.Quit(constants.wdDoNotSaveChanges)
	def docx(self, filename):
  self.doc(filename)

ppt/pptx 转换为 PDF

ppt/pptx 转换为 PDF 部分代码如下:

def ppt(self, filename):
  name = os.path.basename(filename).split('.')[0] + '.pdf'
  exportfile = os.path.join(self._export_folder, name)
  gencache.EnsureModule('{00020905-0000-0000-C000-000000000046}', 0, 8, 4)
  pythoncom.CoInitialize()
  p = Dispatch("PowerPoint.Application")
  pythoncom.CoInitialize()
  ppt = p.Presentations.Open(filename, False, False, False)
  ppt.ExportAsFixedFormat(exportfile, 2, PrintRange=None)
  print('保存 PDF 文件:', exportfile)
  p.Quit()

 def pptx(self, filename):
  self.ppt(filename)

xls/xlsx 转换为 PDF

def xls(self, filename):
  name = os.path.basename(filename).split('.')[0] + '.pdf'
  exportfile = os.path.join(self._export_folder, name)
  pythoncom.CoInitialize()
  xlApp = DispatchEx("Excel.Application")
  pythoncom.CoInitialize()
  xlApp.Visible = False
  xlApp.DisplayAlerts = 0
  books = xlApp.Workbooks.Open(filename, False)
  books.ExportAsFixedFormat(0, exportfile)
  books.Close(False)
  print('保存 PDF 文件:', exportfile)
  xlApp.Quit()

 def xlsx(self, filename):
  self.xls(filename)

执行逻辑转换

if __name__ == "__main__":
 # 支持文件夹批量导入
 #folder = 'tmp'
 #pathname = os.path.join(os.path.abspath('.'), folder)
 # 也支持单个文件的转换
 pathname = "G:/python_study/test.doc"
 pdfConverter = PDFConverter(pathname)
 pdfConverter.run_conver()

总结

今天的文章主要是 Python 实战之小工具的运用,希望对大家有所帮助,下一期将讲解如何通过接口的方式通过文件服务器来下载文件并转换,敬请期待。。。 So 今天的小 Tip 你安利到了吗?

示例代码

https://github.com/JustDoPython/python-examples/tree/master/chaoxi/FilesToPDF

以上就是python 如何将office文件转换为PDF的详细内容,更多关于python Office 文件转 PDF的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python随机读取文件实现实例
May 25 Python
浅谈python中的数字类型与处理工具
Aug 02 Python
Python实现的概率分布运算操作示例
Aug 14 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
python+pandas+时间、日期以及时间序列处理方法
Jul 10 Python
Python实现计算文件MD5和SHA1的方法示例
Jun 11 Python
Python程序控制语句用法实例分析
Jan 14 Python
python numpy 矩阵堆叠实例
Jan 17 Python
JupyterNotebook 输出窗口的显示效果调整方法
Apr 13 Python
pymysql之cur.fetchall() 和cur.fetchone()用法详解
May 15 Python
Keras-多输入多输出实例(多任务)
Jun 22 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
Python制作一个仿QQ办公版的图形登录界面
Sep 22 #Python
Python使用for生成列表实现过程解析
Sep 22 #Python
python实现发送带附件的邮件代码分享
Sep 22 #Python
使用Python绘制台风轨迹图的示例代码
Sep 21 #Python
利用python绘制中国地图(含省界、河流等)
Sep 21 #Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 #Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 #Python
You might like
php后退一页表单内容保存实现方法
2012/06/17 PHP
PHP使用静态方法的几个注意事项
2014/09/16 PHP
php给一组指定关键词添加span标签的方法
2015/03/31 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
php lcg_value与mt_rand生成0~1随机小数的效果对比分析
2017/04/05 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
javascript之typeof、instanceof操作符使用探讨
2013/05/19 Javascript
jquery easyui中treegrid用法的简单实例
2014/02/18 Javascript
详谈jQuery操纵DOM元素属性 attr()和removeAtrr()方法
2015/01/22 Javascript
简述AngularJS相关的一些编程思想
2015/06/23 Javascript
JS平滑无缝滚动效果的实现代码
2016/05/06 Javascript
jQuery实现定位滚动条位置
2016/08/05 Javascript
详解JavaScript模块化开发
2016/12/04 Javascript
关于微信上网页图片点击全屏放大效果
2016/12/19 Javascript
JavaScript实现微信红包算法及问题解决方法
2018/04/26 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
vue脚手架搭建过程图解
2018/06/06 Javascript
浅谈JS对象添加getter与setter的5种方法
2018/06/09 Javascript
微信小程序实现星级评价效果
2018/12/28 Javascript
Node.js Windows Binary二进制文件安装方法
2019/05/16 Javascript
vue+elementUI实现表格关键字筛选高亮
2020/10/26 Javascript
python3简单实现微信爬虫
2015/04/09 Python
Python的time模块中的常用方法整理
2015/06/18 Python
结合Python的SimpleHTTPServer源码来解析socket通信
2016/06/27 Python
python 使用pandas计算累积求和的方法
2019/02/08 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
施华洛世奇水晶荷兰官方网站:SWAROVSKI荷兰
2017/05/12 全球购物
小学红领巾中秋节广播稿
2014/01/13 职场文书
学术会议邀请函范文
2014/01/22 职场文书
逃课上网检讨书
2014/02/20 职场文书
机械系毕业生求职信
2014/05/28 职场文书
装修施工安全责任书
2014/07/24 职场文书
慰问信范文
2015/02/14 职场文书
工厂门卫岗位职责
2015/04/13 职场文书
python绘图subplots函数使用模板的示例代码
2021/04/30 Python