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分割和拼接字符串
Nov 01 Python
Python中使用MELIAE分析程序内存占用实例
Feb 18 Python
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
Python脚本完成post接口测试的实例
Dec 17 Python
Python关于excel和shp的使用在matplotlib
Jan 03 Python
numpy.random模块用法总结
May 27 Python
python flask框架实现传数据到js的方法分析
Jun 11 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
Keras实现将两个模型连接到一起
May 23 Python
Python实现手势识别
Oct 21 Python
python xlsxwriter模块的使用
Dec 24 Python
Python 实现Mac 屏幕截图详解
Oct 05 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 session劫持和防范的方法
2013/11/12 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
PHP实现浏览器中直接输出图片的方法示例
2018/03/14 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
JS常见问题之为什么点击弹出的i总是最后一个
2016/01/05 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
JS iFrame加载慢怎么解决
2016/05/13 Javascript
JS 实现banner图片轮播效果(鼠标事件)
2017/08/04 Javascript
Vue中使用 setTimeout() setInterval()函数的问题
2018/09/13 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
vue项目设置scrollTop不起作用(总结)
2018/12/21 Javascript
用node撸一个监测复联4开售短信提醒的实现代码
2019/04/10 Javascript
vue使用自定义指令实现拖拽
2021/01/29 Javascript
CentOS安装pillow报错的解决方法
2016/01/27 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
Python读写zip压缩文件的方法
2018/08/29 Python
Python编写通讯录通过数据库存储实现模糊查询功能
2019/07/18 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
在pycharm中关掉ipython console/PyDev操作
2020/06/09 Python
Python连接mysql方法及常用参数
2020/09/01 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
P D PAOLA意大利官网:西班牙著名的珠宝首饰品牌
2019/09/24 全球购物
化工专业求职信
2014/07/01 职场文书
统计学教授推荐信
2014/09/18 职场文书
就业协议书范本
2014/10/08 职场文书
租房协议书范例
2014/10/14 职场文书
人事主管岗位职责
2015/02/04 职场文书
护士个人总结范文
2015/02/13 职场文书
秋收起义观后感
2015/06/11 职场文书
周一问候语大全
2015/11/10 职场文书
vue项目如何打包之项目打包优化(让打包的js文件变小)
2022/04/30 Vue.js
python区块链实现简版工作量证明
2022/05/25 Python