''' @jiangmiemieï¼jiangyangcreate@gmailï¼ èªå¨å辨è¾å ¥æä»¶è·¯å¾ææä»¶å¤¹è·¯å¾ï¼è½¬æ¢æå®åç¼æä»¶ä¸ºPDFï¼'doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx'ï¼ ''' import os from pathlib import Path from win32com.client import Dispatch, gencache, DispatchEx import win32com.client class PDFConverter: def __init__(self, pathname): self._handle_postfix = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx'] self._filename_list = list() self._export_folder = os.path.join(os.path.abspath('.'), outpath) 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('转æ¢å®æï¼') def doc(self, filename): ''' doc å docx æä»¶è½¬æ¢ ''' name = os.path.basename(filename).split('.')[0] + '.pdf' word = Dispatch('Word.Application') doc = word.Documents.Open(filename) pdf_file = os.path.join(self._export_folder, name) doc.SaveAs(pdf_file, FileFormat=17) doc.Close() word.Quit() def docx(self, filename): self.doc(filename) def xls(self, filename): ''' xls å xlsx æä»¶è½¬æ¢ ''' name = os.path.basename(filename).split('.')[0] + '.pdf' exportfile = os.path.join(self._export_folder, name) xlApp = DispatchEx("Excel.Application") 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) def ppt(self,filename): """ PPTæä»¶å¯¼åºä¸ºpdfæ ¼å¼ :param filename: PPTæä»¶çåç§° :param output_filename: 导åºçpdfæä»¶çåç§° :return: """ name = os.path.basename(filename).split('.')[0] + '.pdf' exportfile = os.path.join(self._export_folder, name) ppt_app = win32com.client.Dispatch('PowerPoint.Application') ppt = ppt_app.Presentations.Open(filename) ppt.SaveAs(exportfile, 32) print('ä¿å PDF æä»¶ï¼', exportfile) ppt_app.Quit() def pptx(self, filename): self.ppt(filename) def main(In_Path): my_file = Path(In_Path) if my_file.is_dir(): # 夿æ¯å¦ä¸ºæä»¶å¤¹ pathname = os.path.join(os.path.abspath('.'), In_Path) else: pathname = In_Path # å个æä»¶çè½¬æ¢ pdfConverter = PDFConverter(pathname) pdfConverter.run_conver() if __name__ == "__main__": outpath = 'SavePath' main(input('è¾å ¥ä½ è¦è½¬åçæä»¶ææä»¶å¤¹è·¯å¾'))