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 获取新浪微博的最新公共微博实例分享
Jul 03 Python
Python编程实现粒子群算法(PSO)详解
Nov 13 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
Apr 08 Python
PyQt5实现无边框窗口的标题拖动和窗口缩放
Apr 19 Python
Python中使用双下划线防止类属性被覆盖问题
Jun 27 Python
pygame实现打字游戏
Feb 19 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
Python爬取爱奇艺电影信息代码实例
Nov 26 Python
pytorch查看torch.Tensor和model是否在CUDA上的实例
Jan 03 Python
Django中如何用xlwt生成表格的方法步骤
Jan 31 Python
python tkinter实现下载进度条及抖音视频去水印原理
Feb 07 Python
Python使用OpenCV实现虚拟缩放效果
Feb 28 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实现弹出消息提示框的两种方法
2013/12/17 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
2016/09/22 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
javascript开发技术大全 第4章 直接量与字符集
2011/07/03 Javascript
用Javascript评估用户输入密码的强度实现代码
2011/11/30 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
js Math 对象的方法
2013/09/01 Javascript
js 遍历json返回的map内容示例代码
2013/10/29 Javascript
详解JavaScript中的异常处理方法
2015/06/16 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
ES6正则表达式的一些新功能总结
2017/05/09 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
axios发送post请求springMVC接收不到参数的解决方法
2018/03/05 Javascript
vue-router beforeEach跳转路由验证用户登录状态
2018/12/26 Javascript
JSON字符串操作移除空串更改key/value的介绍
2019/01/05 Javascript
JS实现简易日历效果
2021/01/25 Javascript
python 多线程应用介绍
2012/12/19 Python
python Django模板的使用方法(图文)
2013/11/04 Python
Python中的类学习笔记
2014/09/23 Python
python django使用haystack:全文检索的框架(实例讲解)
2017/09/27 Python
python基于C/S模式实现聊天室功能
2019/01/09 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
python selenium循环登陆网站的实现
2019/11/04 Python
解决Pycharm中恢复被exclude的项目问题(pycharm source root)
2020/02/14 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
Spongelle官网:美国的创意护肤洗护品牌
2019/05/15 全球购物
Linux内核产生并发的原因
2016/11/08 面试题
药学专业大学生自荐信
2013/09/28 职场文书
五年级音乐教学反思
2014/02/06 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
护士长竞聘演讲稿
2014/04/30 职场文书
大学活动总结模板
2014/07/10 职场文书
幼儿园端午节活动方案
2014/08/25 职场文书
单位委托书格式范本
2014/09/29 职场文书