You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pywafo/wafo/powerpoint.py

312 lines
12 KiB
Python

'''
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))
from __future__ import absolute_import
from six import iteritems # @UnresolvedImport
import os
import warnings
import win32com.client
from . import MSO
from . 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 iteritems(txt_dict):
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()