Python 實用技:將 Office 文件轉為 PDF

文 |?潮汐
來源:Python 技術「ID: pythonall」

在平時的工作中,難免需要一些 小Tip 來解決工作中遇到的問題,今天的文章給大家安利一個方便快捷的小技巧,將 Office(doc/docx/ppt/pptx/xls/xlsx)文件批量或者單一文件轉換為 PDF 文件。不過在做具體操作之前需要在 PC 安裝好 Office,再利用 Python 的 win32com 包來實現 Office 文件的轉換操作。
安裝 win32com
在實戰(zhàn)之前,需要安裝 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)?
執(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)之小工具的運用,希望對大家有所幫助。

近期熱門文章推薦:

評論
圖片
表情
