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中的装饰器用法详解
Jan 14 Python
在Python中使用模块的教程
Apr 27 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 Python
Python双向循环链表实现方法分析
Jul 30 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
对IPython交互模式下的退出方法详解
Feb 16 Python
python字符串的拼接方法总结
Nov 18 Python
python 导入数据及作图的实现
Dec 03 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
Python利用myqr库创建自己的二维码
Nov 24 Python
Python编程中内置的NotImplemented类型的用法
Mar 23 Python
浅析Python OpenCV三种滤镜效果
Apr 11 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/03/08 PHP
php DOS攻击实现代码(附如何防范)
2012/05/29 PHP
typecho插件编写教程(一):Hello World
2015/05/28 PHP
详解php设置session(过期、失效、有效期)
2015/11/12 PHP
PHP进行批量任务处理不超时的解决方法
2016/07/11 PHP
PHP数组遍历的几种常见方式总结
2019/02/15 PHP
常常会用到的截取字符串substr()、substring()、slice()方法详解
2015/12/16 Javascript
改变checkbox默认选中状态及取值的实现代码
2016/05/26 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
jQuery实现ToolTip元素定位显示功能示例
2016/11/23 Javascript
JavaScript设计模式之代理模式简单实例教程
2018/07/03 Javascript
JavaScript数据结构与算法之二叉树实现查找最小值、最大值、给定值算法示例
2019/03/01 Javascript
微信小程序访问豆瓣电影api的实现方法
2019/03/31 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
Jquery动态列功能完整实例
2019/08/30 jQuery
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
[55:39]DOTA2-DPC中国联赛 正赛 VG vs LBZS BO3 第二场 1月19日
2021/03/11 DOTA
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
python读取和保存图片5种方法对比
2018/09/12 Python
python+selenium实现自动化百度搜索关键词
2019/06/03 Python
利用python读取YUV文件 转RGB 8bit/10bit通用
2019/12/09 Python
在python里创建一个任务(Task)实例
2020/04/25 Python
Python字典实现伪切片功能
2020/10/28 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
2021/01/28 Python
python推导式的使用方法实例
2021/02/28 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
CSS Grid布局教程之什么是网格布局
2014/12/30 HTML / CSS
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
英国排名第一的冲浪店:Ann’s Cottage
2020/06/21 全球购物
护士自我鉴定
2013/10/23 职场文书
季度思想汇报
2014/01/01 职场文书
城建学院毕业生自荐信
2014/01/31 职场文书
成人继续教育实施方案
2014/03/01 职场文书
大学生标准自荐书
2014/06/15 职场文书
卖房授权委托书样本
2014/10/05 职场文书
我收到了德劲DE1107
2022/04/05 无线电