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 相关文章推荐
pyside写ui界面入门示例
Jan 22 Python
Python urlopen()函数 示例分享
Jun 12 Python
详解Python import方法引入模块的实例
Aug 02 Python
python MysqlDb模块安装及其使用详解
Feb 23 Python
python3 读取Excel表格中的数据
Oct 16 Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 Python
python pygame实现五子棋小游戏
Oct 26 Python
python使用requests.session模拟登录
Aug 09 Python
Python使用mongodb保存爬取豆瓣电影的数据过程解析
Aug 14 Python
Python递归实现打印多重列表代码
Feb 27 Python
python代数式括号有效性检验示例代码
Oct 04 Python
Python使用plt.boxplot()函数绘制箱图、常用方法以及含义详解
Aug 14 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操作sqlserver关于时间日期读取的小小见解
2009/11/29 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
Laravel框架中Blade模板的用法示例
2017/08/30 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
2018/12/20 PHP
PHP html_entity_decode()函数讲解
2019/02/25 PHP
PHP使用OB缓存实现静态化功能示例
2019/03/23 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
Jquery cookie操作代码
2010/03/14 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
JS Replace()的高级使用方法介绍
2013/06/29 Javascript
动态改变div的z-index属性的简单实例
2013/08/08 Javascript
JS中的异常处理方法分享
2013/12/22 Javascript
jQuery实现的网格线绘制方法
2016/06/20 Javascript
Es6 写的文件import 起来解决方案详解
2016/12/13 Javascript
JS实现多张图片预览同步上传功能
2017/06/23 Javascript
jquery自定义显示消息数量
2017/12/19 jQuery
vue中引用swiper轮播插件的教程详解
2018/08/16 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
python版opencv摄像头人脸实时检测方法
2018/08/03 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
Python 求数组局部最大值的实例
2019/11/26 Python
python调用私有属性的方法总结
2020/07/24 Python
python openCV自制绘画板
2020/10/27 Python
印度购物网站:TATA CLiQ
2017/11/23 全球购物
ghd法国官方网站:英国最受欢迎的美发工具品牌
2019/04/18 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
业务部门经理岗位职责
2014/02/23 职场文书
高中军训第一天感言
2014/03/06 职场文书
有创意的广告词
2014/03/18 职场文书
奥巴马竞选演讲稿
2014/05/15 职场文书
三分钟自我介绍演讲稿
2014/08/21 职场文书
银行会计主管岗位职责
2014/10/01 职场文书
2019年恭贺升学祝福语集锦
2019/08/15 职场文书
Python中json.load()和json.loads()有哪些区别
2021/06/07 Python
Sleuth+logback 设置traceid 及自定义信息方式
2021/07/26 Java/Android
Ubuntu安装Mysql+启用远程连接的完整过程
2022/06/21 Servers