|
|
|
'''
|
|
|
|
Created on 15. des. 2009
|
|
|
|
|
|
|
|
@author: pab
|
|
|
|
'''
|
|
|
|
# import os
|
|
|
|
# import sys
|
|
|
|
# import win32com
|
|
|
|
# from win32com.client.selecttlb import EnumTlbs
|
|
|
|
# typelib_mso = None
|
|
|
|
# typelib_msppt = None
|
|
|
|
# for typelib in EnumTlbs():
|
|
|
|
# d = typelib.desc.split(' ')
|
|
|
|
# if d[0] == 'Microsoft' and d[1] == 'Office' and d[3] == 'Object' \
|
|
|
|
# and d[4] == 'Library':
|
|
|
|
# typelib_mso = typelib
|
|
|
|
# if d[0] == 'Microsoft' and d[1] == 'PowerPoint' and d[3] == 'Object' \
|
|
|
|
# and d[4] == 'Library':
|
|
|
|
# typelib_msppt = typelib
|
|
|
|
# if hasattr(sys, 'frozen'): # If we're an .exe file
|
|
|
|
# win32com.__gen_path__ = os.path.dirname(sys.executable)
|
|
|
|
# # win32com.__gen_path__ = os.environ['TEMP']
|
|
|
|
# if win32com.client.gencache.is_readonly:
|
|
|
|
# win32com.client.gencache.is_readonly = False
|
|
|
|
# win32com.client.gencache.Rebuild()
|
|
|
|
# MSPPT = win32com.client.gencache.EnsureModule(typelib_msppt.clsid,
|
|
|
|
# typelib_msppt.lcid,
|
|
|
|
# int(typelib_msppt.major),
|
|
|
|
# int(typelib_msppt.minor))
|
|
|
|
# MSO = win32com.client.gencache.EnsureModule(typelib_mso.clsid,
|
|
|
|
# typelib_mso.lcid,
|
|
|
|
# int(typelib_mso.major), int(typelib_mso.minor))
|
|
|
|
import os
|
|
|
|
import warnings
|
|
|
|
import win32com.client
|
|
|
|
import MSO
|
|
|
|
import MSPPT
|
|
|
|
from PIL import Image # @UnresolvedImport
|
|
|
|
|
|
|
|
g = globals()
|
|
|
|
for c in dir(MSO.constants):
|
|
|
|
g[c] = getattr(MSO.constants, c)
|
|
|
|
for c in dir(MSPPT.constants):
|
|
|
|
g[c] = getattr(MSPPT.constants, c)
|
|
|
|
|
|
|
|
|
|
|
|
class Powerpoint(object):
|
|
|
|
|
|
|
|
def __init__(self, file_name=''):
|
|
|
|
|
|
|
|
self.application = win32com.client.Dispatch("Powerpoint.Application")
|
|
|
|
# self.application.Visible = True
|
|
|
|
self._visible = self.application.Visible
|
|
|
|
if file_name:
|
|
|
|
self.presentation = self.application.Presentations.Open(file_name)
|
|
|
|
else:
|
|
|
|
self.presentation = self.application.Presentations.Add()
|
|
|
|
self.num_slides = 0
|
|
|
|
# default picture width and height
|
|
|
|
self.default_width = 500
|
|
|
|
self.default_height = 400
|
|
|
|
self.title_font = 'Arial' # 'Boopee'
|
|
|
|
self.title_size = 36
|
|
|
|
self.text_font = 'Arial' # 'Boopee'
|
|
|
|
self.text_size = 20
|
|
|
|
self.footer = ''
|
|
|
|
|
|
|
|
def set_footer(self):
|
|
|
|
'''
|
|
|
|
Set Footer in SlideMaster and NotesMaster
|
|
|
|
'''
|
|
|
|
if self.footer:
|
|
|
|
if self.presentation.HasTitleMaster:
|
|
|
|
TMHF = self.presentation.TitleMaster.HeadersFooters
|
|
|
|
TMHF.Footer.Text = self.footer
|
|
|
|
TMHF.Footer.Visible = True
|
|
|
|
|
|
|
|
SMHF = self.presentation.SlideMaster.HeadersFooters
|
|
|
|
SMHF.Footer.Text = self.footer
|
|
|
|
SMHF.Footer.Visible = True
|
|
|
|
SMHF.SlideNumber.Visible = True
|
|
|
|
NMHF = self.presentation.NotesMaster.HeadersFooters
|
|
|
|
NMHF.Footer.Text = self.footer
|
|
|
|
NMHF.SlideNumber.Visible = True
|
|
|
|
for slide in self.presentation.Slides:
|
|
|
|
shapes = slide.Shapes
|
|
|
|
for shape in shapes:
|
|
|
|
if shape.Name == 'Footer':
|
|
|
|
footer = shape
|
|
|
|
break
|
|
|
|
else:
|
|
|
|
footer = shapes.AddTextbox(
|
|
|
|
msoTextOrientationHorizontal, # @UndefinedVariable
|
|
|
|
Left=0, Top=510, Width=720, Height=28.875)
|
|
|
|
footer.Name = 'Footer'
|
|
|
|
footer.TextFrame.TextRange.Text = self.footer
|
|
|
|
|
|
|
|
def add_title_slide(self, title, subtitle=''):
|
|
|
|
self.num_slides += 1
|
|
|
|
slide = self.presentation.Slides.Add(
|
|
|
|
self.num_slides, MSPPT.constants.ppLayoutTitle)
|
|
|
|
|
|
|
|
unused_title_id, unused_textbox_id = 1, 2
|
|
|
|
for id_, title1 in enumerate([title, subtitle]):
|
|
|
|
titlerange = slide.Shapes(id_ + 1).TextFrame.TextRange
|
|
|
|
titlerange.Text = title1
|
|
|
|
titlerange.Font.Name = self.title_font
|
|
|
|
titlerange.Font.Size = self.title_size - id_ * \
|
|
|
|
12 if self.title_size > 22 else self.title_size
|
|
|
|
|
|
|
|
def add_slide(self, title='', texts='', notes='', image_file='',
|
|
|
|
maxlevel=None, left=220, width=-1, height=-1):
|
|
|
|
self.num_slides += 1
|
|
|
|
slide = self.presentation.Slides.Add(
|
|
|
|
self.num_slides, MSPPT.constants.ppLayoutText)
|
|
|
|
|
|
|
|
self.add2slide(slide, title, texts, notes, image_file, maxlevel, left,
|
|
|
|
width, height)
|
|
|
|
return slide
|
|
|
|
|
|
|
|
def add2slide(self, slide, title='', texts='', notes='', image_file='',
|
|
|
|
maxlevel=None, left=220, width=-1, height=-1,
|
|
|
|
keep_aspect=True):
|
|
|
|
title_id, textbox_id = 1, 2
|
|
|
|
if title:
|
|
|
|
titlerange = slide.Shapes(title_id).TextFrame.TextRange
|
|
|
|
titlerange.Font.Name = self.title_font
|
|
|
|
titlerange.Text = title
|
|
|
|
titlerange.Font.Size = self.title_size
|
|
|
|
|
|
|
|
if texts != '' and texts != ['']:
|
|
|
|
# textrange = slide.Shapes(textbox_id).TextFrame.TextRange
|
|
|
|
self._add_text(slide, textbox_id, texts, maxlevel)
|
|
|
|
|
|
|
|
if image_file != '' and image_file != ['']:
|
|
|
|
if keep_aspect:
|
|
|
|
im = Image.open(image_file)
|
|
|
|
t_w, t_h = im.size
|
|
|
|
if height <= 0 and width <= 0:
|
|
|
|
if t_w * self.default_height < t_h * self.default_width:
|
|
|
|
height = self.default_height
|
|
|
|
else:
|
|
|
|
width = self.default_width
|
|
|
|
if height <= 0 and width:
|
|
|
|
height = t_h * width / t_w
|
|
|
|
elif height and width <= 0:
|
|
|
|
width = t_w * height / t_h
|
|
|
|
|
|
|
|
slide.Shapes.AddPicture(FileName=image_file, LinkToFile=False,
|
|
|
|
SaveWithDocument=True,
|
|
|
|
Left=left, Top=110,
|
|
|
|
Width=width, Height=height) # 400)
|
|
|
|
if notes != '' and notes != ['']:
|
|
|
|
notespage = slide.NotesPage # .Shapes(2).TextFrame.TextRange
|
|
|
|
self._add_text(notespage, 2, notes)
|
|
|
|
return slide
|
|
|
|
|
|
|
|
def _add_text(self, page, id, txt, maxlevel=None): # @ReservedAssignment
|
|
|
|
page.Shapes(id).TextFrame.TextRange.Font.Name = self.text_font
|
|
|
|
|
|
|
|
if isinstance(txt, dict):
|
|
|
|
self._add_text_from_dict(page, id, txt, 1, maxlevel)
|
|
|
|
elif isinstance(txt, (list, tuple)):
|
|
|
|
self._add_text_from_list(page, id, txt, maxlevel)
|
|
|
|
else:
|
|
|
|
unused_tr = page.Shapes(id).TextFrame.TextRange.InsertAfter(txt)
|
|
|
|
unused_temp = page.Shapes(id).TextFrame.TextRange.InsertAfter('\r')
|
|
|
|
|
|
|
|
page.Shapes(id).TextFrame.TextRange.Font.Size = self.text_size
|
|
|
|
|
|
|
|
def _add_text_from_dict(self, page, id, txt_dict, # @ReservedAssignment
|
|
|
|
level, maxlevel=None):
|
|
|
|
if maxlevel is None or level <= maxlevel:
|
|
|
|
for name, subdict in txt_dict.iteritems():
|
|
|
|
tr = page.Shapes(id).TextFrame.TextRange.InsertAfter(name)
|
|
|
|
unused_temp = page.Shapes(
|
|
|
|
id).TextFrame.TextRange.InsertAfter('\r')
|
|
|
|
tr.IndentLevel = level
|
|
|
|
self._add_text_from_dict(
|
|
|
|
page, id, subdict, min(level + 1, 5), maxlevel)
|
|
|
|
|
|
|
|
def _add_text_from_list(self, page, id, # @ReservedAssignment
|
|
|
|
txt_list, maxlevel=None):
|
|
|
|
for txt in txt_list:
|
|
|
|
level = 1
|
|
|
|
while isinstance(txt, (list, tuple)):
|
|
|
|
txt = txt[0]
|
|
|
|
level += 1
|
|
|
|
if maxlevel is None or level <= maxlevel:
|
|
|
|
tr = page.Shapes(id).TextFrame.TextRange.InsertAfter(txt)
|
|
|
|
unused_temp = page.Shapes(
|
|
|
|
id).TextFrame.TextRange.InsertAfter('\r')
|
|
|
|
tr.IndentLevel = level
|
|
|
|
|
|
|
|
def save(self, fullfile=''):
|
|
|
|
if fullfile:
|
|
|
|
self.presentation.SaveAs(FileName=fullfile)
|
|
|
|
else:
|
|
|
|
self.presentation.Save()
|
|
|
|
|
|
|
|
def quit(self): # @ReservedAssignment
|
|
|
|
if self._visible:
|
|
|
|
self.presentation.Close()
|
|
|
|
else:
|
|
|
|
self.application.Quit()
|
|
|
|
|
|
|
|
def quit_only_if_hidden(self):
|
|
|
|
if not self._visible:
|
|
|
|
self.application.Quit()
|
|
|
|
|
|
|
|
|
|
|
|
def test_powerpoint():
|
|
|
|
# Make powerpoint
|
|
|
|
|
|
|
|
ppt = Powerpoint()
|
|
|
|
ppt.footer = 'This is the footer'
|
|
|
|
ppt.add_title_slide('Title', 'Per A.')
|
|
|
|
ppt.add_slide(title='alsfkasldk', texts='asdflaf', notes='asdfas')
|
|
|
|
ppt.set_footer()
|
|
|
|
|
|
|
|
|
|
|
|
def make_ppt():
|
|
|
|
application = win32com.client.Dispatch("Powerpoint.Application")
|
|
|
|
application.Visible = True
|
|
|
|
presentation = application.Presentations.Add()
|
|
|
|
slide1 = presentation.Slides.Add(1, MSPPT.constants.ppLayoutText)
|
|
|
|
|
|
|
|
# title = slide1.Shapes.AddTextBox(Type=msoTextOrientationHorizontal,
|
|
|
|
# Left=50, Top=10, Width=620, Height=70)
|
|
|
|
# title.TextFrame.TextRange.Text = 'Overskrift'
|
|
|
|
title_id, textbox_id = 1, 2
|
|
|
|
slide1.Shapes(title_id).TextFrame.TextRange.Text = 'Overskrift'
|
|
|
|
# slide1.Shapes(title_id).TextFrame.Width = 190
|
|
|
|
|
|
|
|
slide1.Shapes(textbox_id).TextFrame.TextRange.InsertAfter('Test')
|
|
|
|
unused_tr = slide1.Shapes(textbox_id).TextFrame.TextRange.InsertAfter('\r')
|
|
|
|
slide1.Shapes(textbox_id).TextFrame.TextRange.IndentLevel = 1
|
|
|
|
tr = slide1.Shapes(textbox_id).TextFrame.TextRange.InsertAfter('tests')
|
|
|
|
unused_tr0 = slide1.Shapes(
|
|
|
|
textbox_id).TextFrame.TextRange.InsertAfter('\r')
|
|
|
|
tr.IndentLevel = 2
|
|
|
|
tr1 = slide1.Shapes(textbox_id).TextFrame.TextRange.InsertAfter('test3')
|
|
|
|
tr1.IndentLevel = 3
|
|
|
|
# slide1.Shapes(textbox_id).TextFrame.TextRange.Text = 'Test \r test2'
|
|
|
|
|
|
|
|
# textbox = slide1.Shapes.AddTextBox(Type=msoTextOrientationHorizontal,
|
|
|
|
# Left=30, Top=100, Width=190, Height=400)
|
|
|
|
# textbox.TextFrame.TextRange.Text = 'Test \r test2'
|
|
|
|
# picbox = slide1.Shapes(picb_id)
|
|
|
|
|
|
|
|
filename = r'c:\temp\data1_report1_and_2_Tr120_1.png'
|
|
|
|
slide1.Shapes.AddPicture(FileName=filename, LinkToFile=False,
|
|
|
|
SaveWithDocument=True,
|
|
|
|
Left=220, Top=100, Width=500, Height=420)
|
|
|
|
|
|
|
|
slide1.NotesPage.Shapes(2).TextFrame.TextRange.Text = 'test'
|
|
|
|
|
|
|
|
|
|
|
|
# for shape in slide1.Shapes:
|
|
|
|
# shape.TextFrame.TextRange.Text = 'Test \r test2'
|
|
|
|
# slide1.Shapes.Titles.TextFrames.TestRange.Text
|
|
|
|
# shape = slide1.Shapes.AddShape(msoShapeRectangle, 300, 100, 400, 400)
|
|
|
|
# shape.TextFrame.TextRange.Text = 'Test \n test2'
|
|
|
|
# shape.TextFrame.TextRange.Font.Size = 12
|
|
|
|
#
|
|
|
|
# app = wx.PySimpleApp()
|
|
|
|
# dialog = wx.FileDialog(None, 'Choose image file', defaultDir=os.getcwd(),
|
|
|
|
# wildcard='*.*',
|
|
|
|
# style=wx.OPEN | wx.CHANGE_DIR | wx.MULTIPLE)
|
|
|
|
#
|
|
|
|
# if dialog.ShowModal() == wx.ID_OK:
|
|
|
|
# files_or_paths = dialog.GetPaths()
|
|
|
|
# for filename in files_or_paths:
|
|
|
|
# slide1.Shapes.AddPicture(FileName=filename, LinkToFile=False,
|
|
|
|
# SaveWithDocument=True,
|
|
|
|
# Left=100, Top=100, Width=200, Height=200)
|
|
|
|
# dialog.Destroy()
|
|
|
|
# presentation.Save()
|
|
|
|
# application.Quit()
|
|
|
|
def rename_ppt():
|
|
|
|
root = r'C:/pab/tsm_opeval/analysis_tsmps_aco_v2008b/plots'
|
|
|
|
filenames = os.listdir(root)
|
|
|
|
prefix = 'TSMPSv2008b_'
|
|
|
|
for filename in filenames:
|
|
|
|
if filename.endswith('.ppt'):
|
|
|
|
try:
|
|
|
|
ppt = Powerpoint(os.path.join(root, filename))
|
|
|
|
ppt.footer = prefix + filename
|
|
|
|
ppt.set_footer()
|
|
|
|
ppt.save(os.path.join(root, ppt.footer))
|
|
|
|
except:
|
|
|
|
warnings.warn('Unable to load %s' % filename)
|
|
|
|
|
|
|
|
|
|
|
|
def load_file_into_ppt():
|
|
|
|
root = r'C:/pab/tsm_opeval/analysis_tsmps_aco_v2008b/plots'
|
|
|
|
filenames = os.listdir(root)
|
|
|
|
prefix = 'TSMPSv2008b_'
|
|
|
|
for filename in filenames:
|
|
|
|
if filename.startswith(prefix) and filename.endswith('.ppt'):
|
|
|
|
try:
|
|
|
|
unused_ppt = Powerpoint(os.path.join(root, filename))
|
|
|
|
except:
|
|
|
|
warnings.warn('Unable to load %s' % filename)
|
|
|
|
if __name__ == '__main__':
|
|
|
|
# make_ppt()
|
|
|
|
# test_powerpoint()
|
|
|
|
# load_file_into_ppt()
|
|
|
|
rename_ppt()
|