<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 小技之 Office 文件轉 PDF

          共 4918字,需瀏覽 10分鐘

           ·

          2020-09-23 20:35

          文 |?潮汐

          來源:Python 技術「ID: pythonall」

          在平時的工作中,難免需要一些 小Tip 來解決工作中遇到的問題,今天的文章給大家安利一個方便快捷的小技巧,將 Office(doc/docx/ppt/pptx/xls/xlsx)文件批量或者單一文件轉換為 PDF 文件。不過在做具體操作之前需要在 PC 安裝好 Office,再利用 Python 的 win32com 包來實現(xiàn) Office 文件的轉換操作。

          安裝 win32com

          在實戰(zhàn)之前,需要安裝 Python 的 win32com,詳細安裝步驟如下:

          使用 pip 命令安裝


          pip?install?pywin32

          如果我們遇到安裝錯誤,可以通過python -m pip install --upgrade pip更新云端的方式再進行安裝即可:


          python?-m?pip?install?--upgrade?pip?

          下載離線安裝包安裝

          如果 pip 命令未安裝成功的話還可以下載離線包安裝,方法步驟如下:首先在官網(wǎng)選擇對應的 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('需要轉換的文件數(shù)是:',?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)?

          執(zhí)行轉換邏輯

          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 實戰(zhàn)之小工具的運用,希望對大家有所幫助,下一期將講解如何通過接口的方式通過文件服務器來下載文件并轉換,敬請期待。。。

          So 今天的小 Tip 你安利到了嗎?

          示例代碼?Python 小技之 Office 文件轉 PDF


          PS公號內(nèi)回復「Python」即可進入Python 新手學習交流群,一起?100 天計劃!


          老規(guī)矩,兄弟們還記得么,右下角的 “在看” 點一下,如果感覺文章內(nèi)容不錯的話,記得分享朋友圈讓更多的人知道!

          代碼獲取方式

          識別文末二維碼,回復:200922

          瀏覽 56
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  女人被男人操黄色午夜网止 | 操逼乱轮国产 | 国产一区免费 | 大鸡巴久久久久久久久久 | 豆花视频在线一区二区在线视频 |