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中如何优雅的合并两个字典(dict)方法示例
Aug 09 Python
深入学习Python中的上下文管理器与else块
Aug 27 Python
python 中的divmod数字处理函数浅析
Oct 17 Python
Python 装饰器实现DRY(不重复代码)原则
Mar 05 Python
NLTK 3.2.4 环境搭建教程
Sep 19 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
浅谈python3.6的tkinter运行问题
Feb 22 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
使用Django搭建一个基金模拟交易系统教程
Nov 18 Python
解决Keras中CNN输入维度报错问题
Jun 29 Python
python pyhs2 的安装操作
Apr 07 Python
七个非常实用的Python工具包总结
Jun 15 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 Document 代码注释规范
2009/04/13 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
PHP使用xpath解析XML的方法详解
2017/05/20 PHP
JavaScript Cookie显示用户上次访问的时间和次数
2009/12/08 Javascript
style、 currentStyle、 runtimeStyle区别分析
2010/08/01 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
2011/07/26 Javascript
JS构建页面的DOM节点结构的实现代码
2011/12/09 Javascript
js弹出层(jQuery插件形式附带reLoad功能)
2013/04/12 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
jquery实现将获取的颜色值转换为十六进制形式的方法
2014/12/20 Javascript
js的回调函数详解
2015/01/05 Javascript
js中for in语句的用法讲解
2015/04/24 Javascript
Javascript通过overflow控制列表闭合与展开的方法
2015/05/15 Javascript
JS实现的网页背景闪电闪烁效果代码
2015/10/17 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
jQuery实现的简单在线计算器功能
2017/05/11 jQuery
Vue官网todoMVC示例代码
2018/01/29 Javascript
详解webpack 最简打包结果分析
2019/02/20 Javascript
babel7.x和webpack4.x配置vue项目的方法步骤
2019/05/12 Javascript
vue-cli基础配置及webpack配置修改的完整步骤
2019/10/20 Javascript
使用Python的Twisted框架实现一个简单的服务器
2015/04/16 Python
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
利用python程序生成word和PDF文档的方法
2017/02/14 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
Python猜数字算法题详解
2020/03/01 Python
python 截取XML中bndbox的坐标中的图像,另存为jpg的实例
2020/03/10 Python
Python学习之路之pycharm的第一个项目搭建过程
2020/06/18 Python
Pandas对每个分组应用apply函数的实现
2020/12/13 Python
HTML5离线缓存Manifest是什么
2016/03/09 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
MATCHESFASHION.COM法国官网:英国奢侈品零售商
2018/01/04 全球购物
介绍一下Make? 为什么使用make
2016/07/31 面试题
个人简历的自荐信
2013/10/23 职场文书
优秀应届生求职信
2014/06/16 职场文书
教师远程研修感悟
2015/11/18 职场文书
go select编译期的优化处理逻辑使用场景分析
2021/06/28 Golang