| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 
 | import os
 from win32com.client import Dispatch, constants, gencache, DispatchEx
 
 
 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('.'), '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('转换完成!')
 
 def doc(self, filename):
 '''
 doc 和 docx 文件转换
 '''
 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)
 w = Dispatch("Word.Application")
 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)
 
 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 和 pptx 文件转换
 '''
 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)
 p = Dispatch("PowerPoint.Application")
 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)
 
 
 
 if __name__ == "__main__":
 
 
 folder = 'tmp'
 pathname = os.path.join(os.path.abspath('.'), folder)
 
 
 
 
 pdfConverter = PDFConverter(pathname)
 pdfConverter.run_conver()
 
 |