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基础教程之获取本机ip数据包示例
Feb 10 Python
Python 分析Nginx访问日志并保存到MySQL数据库实例
Mar 13 Python
Django验证码的生成与使用示例
May 20 Python
Python 12306抢火车票脚本 Python京东抢手机脚本
Feb 06 Python
python 图像平移和旋转的实例
Jan 10 Python
python实现广度优先搜索过程解析
Oct 19 Python
python ETL工具 pyetl
Jun 07 Python
使用Keras构造简单的CNN网络实例
Jun 29 Python
keras用auc做metrics以及早停实例
Jul 02 Python
Django生成数据库及添加用户报错解决方案
Oct 09 Python
给numpy.array增加维度的超简单方法
Jun 02 Python
教你如何使用Python Tkinter库制作记事本
Jun 10 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
全国中波电台频率表
2020/03/11 无线电
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
用php制作简单分页(从数据库读取记录)的方法详解
2013/05/04 PHP
laravel中命名路由的使用方法
2017/02/24 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
浅析jQuery中调用ajax方法时在不同浏览器中遇到的问题
2014/06/11 Javascript
JavaScript使用focus()设置焦点失败的解决方法
2014/09/03 Javascript
使用AngularJS来实现HTML页面嵌套的方法
2015/06/17 Javascript
jquery实现未经美化的简洁TAB菜单效果
2015/08/28 Javascript
理解javascript中Map代替循环
2016/02/26 Javascript
PHP实现本地图片上传和验证功能
2017/02/27 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
javaScript强制保留两位小数的输入数校验和小数保留问题
2018/05/09 Javascript
vue做移动端适配最佳解决方案(亲测有效)
2018/09/04 Javascript
Node.js的进程管理的深入理解
2019/01/09 Javascript
解决layui动态加载复选框无法选中的问题
2019/09/20 Javascript
Vue组件通信中非父子组件传值知识点总结
2019/12/05 Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
2020/01/12 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
学习python的几条建议分享
2013/02/10 Python
python中argparse模块用法实例详解
2015/06/03 Python
Python中摘要算法MD5,SHA1简介及应用实例代码
2018/01/09 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
python如何调用php文件中的函数详解
2020/12/29 Python
纯css3实现的动画按钮的实例教程
2014/11/17 HTML / CSS
教师实习的自我鉴定
2013/10/26 职场文书
企业统计员岗位职责
2013/12/13 职场文书
大二学生学习个人自我评价
2014/01/19 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
研究生毕业论文导师评语
2014/12/31 职场文书
车辆安全隐患排查制度
2015/08/05 职场文书
《少年闰土》教学反思
2016/02/18 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
《弟子规》读后感:知廉耻、明是非、懂荣辱、辨善恶
2019/12/03 职场文书
基于Android10渲染Surface的创建过程
2022/08/14 Java/Android