def run(save_dir: str): pp = PPTXCreator(TemplateExample()) title_slide = pp.add_title_slide( "Paragraph style example 01 - title slide") text = "This text has three paragraphs. This is the first.\n" \ "Das ist der zweite ...\n" \ "... and the third." text_shape = pp.add_text_box(title_slide, text, PPTXPosition(0.02, 0.24)) text_shape.width = Inches(6) text_shape.height = Inches(2) paragraph_style = PPTXParagraphStyle() paragraph_style.alignment = PP_PARAGRAPH_ALIGNMENT.CENTER paragraph_style.write_paragraph(text_shape.text_frame.paragraphs[0]) paragraph_style.line_spacing = 3 paragraph_style.write_paragraph(text_shape.text_frame.paragraphs[1]) paragraph_style.level = 8 paragraph_style.write_paragraph(text_shape.text_frame.paragraphs[2]) filename_pptx = os.path.join(save_dir, "paragraph_style_example_01.pptx") pp.save(filename_pptx, create_pdf=True, overwrite=True)
def run(save_dir: str): pp = PPTXCreator(TemplateExample()) PPTXFontStyle.lanaguage_id = MSO_LANGUAGE_ID.ENGLISH_UK PPTXFontStyle.name = "Roboto" title_slide = pp.add_title_slide("General example 01 - title slide") font = font_title( ) # returns a PPTXFontStyle instance with bold paragraph and size = 32 Pt font.write_shape( title_slide.shapes.title ) # change paragraph attributes for all paragraphs in shape slide2 = pp.add_slide("General example 01 - page2") pp.add_slide("General example 01 - page3") pp.add_slide("General example 01 - page4") pp.add_content_slide() # add slide with hyperlinks to all other slides text = "This text has three paragraphs. This is the first.\n" \ "Das ist der zweite ...\n" \ "... and the third." my_font = font_default() my_font.size = 16 text_shape = pp.add_text_box(title_slide, text, PPTXPosition(0.02, 0.24), my_font) my_font.set(size=22, bold=True, language_id=MSO_LANGUAGE_ID.GERMAN, strikethrough=TEXT_STRIKE_VALUES.SingleStrike, caps=TEXT_CAPS_VALUES.All) my_font.write_paragraph(text_shape.text_frame.paragraphs[1]) my_font.set(size=18, bold=False, italic=True, name="Vivaldi", language_id=MSO_LANGUAGE_ID.ENGLISH_UK, underline=MSO_TEXT_UNDERLINE_TYPE.WAVY_DOUBLE_LINE, color_rgb=(255, 0, 0), strikethrough=None, caps=None) my_font.write_paragraph(text_shape.text_frame.paragraphs[2]) table_data = [] table_data.append([1, 2]) # rows can have different length table_data.append( [4, slide2, 6] ) # there is specific type needed for entries (implemented as text=f"{entry}") table_data.append(["", 8, 9]) table = pp.add_table(title_slide, table_data, PPTXPosition(0.02, 0.4)) paragraph_style = PPTXParagraphStyle() paragraph_style.set(alignment=PP_PARAGRAPH_ALIGNMENT.CENTER) paragraph_style.write_shape(table) if matplotlib_installed: fig = create_demo_figure() pp.add_matplotlib_figure(fig, title_slide, PPTXPosition(0.3, 0.4)) pp.add_matplotlib_figure(fig, title_slide, PPTXPosition(0.3, 0.4, fig.get_figwidth(), -1.0), zoom=0.4) pp.add_matplotlib_figure(fig, title_slide, PPTXPosition(0.3, 0.4, fig.get_figwidth(), 0.0), zoom=0.5) pp.add_matplotlib_figure(fig, title_slide, PPTXPosition(0.3, 0.4, fig.get_figwidth(), 1.5), zoom=0.6) pp.add_text_box(title_slide, "Use latex-like syntax \nto create formula:", PPTXPosition(0.748, 0.23)) pp.add_latex_formula(f"\mu={5}^{5}", title_slide, PPTXPosition(0.75, 0.35)) formula02 = "\\int_0^\\infty e^{-x^2} dx=\\frac{\\sqrt{\\pi}}{2}" pp.add_latex_formula(formula02, title_slide, PPTXPosition(0.75, 0.45)) pp.add_latex_formula(formula02, title_slide, PPTXPosition(0.75, 0.55), font_size=24, color="red") formula03 = "\\hat{x}, \\check{x}, \\tilde{a}, \\bar{\\ell}, \\dot{y}, \\ddot{y}, \\vec{z_1}, \\vec{z}_1" pp.add_latex_formula(formula03, title_slide, PPTXPosition(0.75, 0.65), font_size=24, color="blue") formula04 = r"\frac{3}{4} \binom{3}{4} \genfrac{}{}{0}{}{3}{4}" pp.add_latex_formula(formula04, title_slide, PPTXPosition(0.75, 0.75), font_size=44, color="g") pp.save(os.path.join(save_dir, "general_example_01.pptx")) try: # only on Windows with PowerPoint installed: filename_pptx = os.path.join(save_dir, "general_example_01.pptx") filename_pdf = os.path.join(save_dir, "general_example_01.pdf") foldername_png = os.path.join(save_dir, "general_example_01_pngs") # use absolute path, because its not clear where PowerPoint saves PDF/PNG ... otherwise pp.save(filename_pptx, create_pdf=True, overwrite=True) pp.save_as_pdf(filename_pdf, overwrite=True) pp.save_as_png(foldername_png, overwrite_folder=True) except Exception as e: print(e)
class PI88ToPPTX: def __init__(self, measurements_path=None, template=None): self.path = measurements_path self.measurements = [] if self.path: self.load_tdm_files(measurements_path) self.plotter = PI88Plotter(self.measurements) self.pptx_creator = PPTXCreator(template=template) self.prs = self.pptx_creator.prs self.position = self.pptx_creator.default_position self.poisson_ratio = 0.3 self.beta = 1.0 self.measurements_unloading_data: dict = {} def load_tdm_files(self, path: str, sort_key=os.path.getctime ): # sorted by creation time (using windows) self.measurements.extend(load_tdm_files(path, sort_key)) def add_measurements( self, measurements: Union[PI88Measurement, Iterable[PI88Measurement]]) -> None: """ Adds a single PI88Measurement or a list o PI88Measurement's to the plotter. """ if measurements: try: self.measurements.extend(measurements) except TypeError: self.measurements.append(measurements) def clear_measurements(self): self.measurements = [] self.measurements_unloading_data = {} def add_matplotlib_figure(self, fig: Figure, slide: Slide, position: PPTXPosition = None, **kwargs): """ :param fig: :param slide_index: :param position: :param kwargs: e.g. width and height :return: prs.shapes.picture.Picture """ return self.pptx_creator.add_matplotlib_figure(fig, slide, position, **kwargs) def create_summary_slide(self, title: str = None, layout=None): if title is None: title = f"Summary - {self.path}" result = self.pptx_creator.add_slide(title, layout) plotter = PI88Plotter(self.measurements) fig = plotter.get_load_displacement_plot() fig.axes[0].legend(loc="best") self.add_matplotlib_figure(fig, result, PPTXPosition(0.02, 0.15)) self.create_measurements_result_data_table(result) return result def create_modulus_hardness_summary_slide(self, layout=None): title = "Summary - reduced modulus and hardness" result = self.pptx_creator.add_slide(title, layout) plotter = PI88Plotter(self.measurements) fig = plotter.get_reduced_modulus_plot() self.add_matplotlib_figure(fig, result, PPTXPosition(0.02, 0.15)) avg_reduced_modulus = statistics.mean(fig.axes[0].lines[0].get_ydata()) fig = plotter.get_hardness_plot() self.add_matplotlib_figure(fig, result, PPTXPosition(0.52, 0.15)) avg_hardness = statistics.mean(fig.axes[0].lines[0].get_ydata()) text = f"avg. Er = {avg_reduced_modulus} GPa - avg. H = {avg_hardness}" self.pptx_creator.add_text_box(result, text, PPTXPosition(0.05, 0.85)) return result def create_title_slide(self, title=None, layout=None, default_content=False): if title is None: title = f"NI results {self.path}" result = self.pptx_creator.add_title_slide(title, layout) self.create_measurements_meta_table(result) plotter = PI88Plotter(self.measurements) fig = plotter.get_load_displacement_plot() self.add_matplotlib_figure(fig, result, PPTXPosition(0.57, 0.24)) return result def create_measurement_slide(self, measurement: PI88Measurement, layout=None, graph_styler=None): title = measurement.base_name # filename[:-4].split("/")[-1].split("\\")[-1] result = self.pptx_creator.add_slide(title, layout) self.create_measurement_result_table(result, measurement) self.create_measurement_meta_data_table(result, measurement) plotter = PI88Plotter(measurement) if graph_styler is not None: plotter.graph_styler = graph_styler fig = plotter.get_load_displacement_plot() if (measurement, self.poisson_ratio, self.beta) in self.measurements_unloading_data: fit_data = self.measurements_unloading_data[(measurement, self.poisson_ratio, self.beta)] fit_disp, fit_load = get_power_law_fit_curve(**fit_data) fig.axes[0].plot(fit_disp, fit_load, **get_power_law_fit_curve_style().dict, label="power-law-fit") self.add_matplotlib_figure(fig, result, PPTXPosition(0.02, 0.15)) return result def create_measurement_slides(self, measurements: Optional[ List[PI88Measurement]] = None, layout=None) -> list: result = [] if measurements is None: measurements = self.measurements graph_styler = GraphStyler(len(self.measurements)) for measurement in measurements: result.append( self.create_measurement_slide(measurement, layout, graph_styler)) return result def create_measurement_meta_data_table( self, slide, measurement, table_style: PPTXTableStyle = None) -> Shape: table_data = get_measurement_meta_table_data(measurement) result = self.pptx_creator.add_table(slide, table_data, PPTXPosition(0.521, 0.16)) if table_style is None: table_style = style_sheets.table_no_header() table_style.set_width_as_fraction(0.4) table_style.write_shape(result) return result def _get_measurement_result_table_data(self, measurement: PI88Measurement, poisson_ratio: float, beta: float) -> list: if (measurement, poisson_ratio, beta) in self.measurements_unloading_data: data = self.measurements_unloading_data[(measurement, poisson_ratio, beta)] else: data = calc_unloading_data(measurement, beta=self.beta, poisson_ratio=self.poisson_ratio) self.measurements_unloading_data[(measurement, poisson_ratio, beta)] = data return get_measurement_result_table_data(measurement, data) def create_measurement_result_table( self, slide, measurement, table_style: PPTXTableStyle = None) -> Shape: table_data = self._get_measurement_result_table_data( measurement, self.poisson_ratio, self.beta) result = self.pptx_creator.add_table(slide, table_data, PPTXPosition(0.521, 0.56)) if table_style is None: table_style = style_sheets.table_no_header() table_style.set_width_as_fraction(0.4) table_style.write_shape(result) return result def create_measurements_meta_table(self, slide, table_style: PPTXTableStyle = None): table_data = get_measurements_meta_table_data(self.measurements) result = self.pptx_creator.add_table(slide, table_data) if table_style is None: table_style = table_style_measurements_meta() table_style.write_shape(result) return result def create_measurements_result_data_table( self, slide, table_style: PPTXTableStyle = None): for measurement in self.measurements: if measurement not in self.measurements_unloading_data.keys(): self._get_measurement_result_table_data( measurement, self.poisson_ratio, self.beta) # todo: better method (name change?) table_data = get_measurements_result_table_data( self.measurements_unloading_data.values()) result = self.pptx_creator.add_table(slide, table_data) if table_style is None: table_style = table_style_summary() table_style.write_shape(result) return result def get_average_measurements_unloading_data(self): sum_Er = sum_E = sum_hardness = 0 for data in self.measurements_unloading_data.values(): sum_Er += data['Er'] sum_E += data['E'] sum_hardness += data['hardness'] n = len(self.measurements_unloading_data.values()) if n > 0: return sum_Er / n, sum_E / n, sum_hardness / n else: return 0, 0, 0 def save(self, filename="delme.prs"): self.prs.save(filename)
def run(save_dir: str): filename_pptx = os.path.join(save_dir, "font_style_example_01.pptx") pp = PPTXCreator(TemplateExample()) # default language and paragraph-type for all created PPTXFontStyle instances: PPTXFontStyle.lanaguage_id = MSO_LANGUAGE_ID.ENGLISH_UK PPTXFontStyle.name = "Roboto" title_slide = pp.add_title_slide("Font style example presentation") font = font_title( ) # returns a PPTXFontStyle instance with bold paragraph and size = 32 Pt font.write_shape( title_slide.shapes.title ) # change paragraph attributes for all paragraphs in shape text_01 = "This text has four paragraphs. This is the first.\n" \ "Das ist der zweite ...\n" \ "... the third ...\n" \ "... and the last." my_font = PPTXFontStyle() my_font.size = 16 text_shape_01 = pp.add_text_box(title_slide, text_01, PPTXPosition(0.02, 0.24), my_font) my_font.set(size=22, bold=True, language_id=MSO_LANGUAGE_ID.GERMAN, strikethrough=TEXT_STRIKE_VALUES.SingleStrike, caps=TEXT_CAPS_VALUES.All) my_font.write_paragraph(text_shape_01.text_frame.paragraphs[1]) my_font.set(size=18, bold=False, italic=True, name="Vivaldi", language_id=MSO_LANGUAGE_ID.ENGLISH_UK, underline=MSO_TEXT_UNDERLINE_TYPE.WAVY_DOUBLE_LINE, color_rgb=(255, 0, 0), strikethrough=None, caps=None) my_font.write_paragraph(text_shape_01.text_frame.paragraphs[2]) my_font = PPTXFontStyle() my_font.set(size=52, bold=True) my_fill = PPTXFillStyle() my_fill.fill_type = FillType.PATTERNED my_fill.fore_color_rgb = (255, 0, 0) my_fill.back_color_rgb = (0, 0, 255) from pptx.enum.dml import MSO_PATTERN_TYPE my_fill.pattern = MSO_PATTERN_TYPE.PERCENT_50 my_font.fill_style = my_fill my_font.write_paragraph(text_shape_01.text_frame.paragraphs[3]) text_02 = "This text uses copied paragraph." my_copied_font = PPTXFontStyle() my_copied_font.read_font(text_shape_01.text_frame.paragraphs[1].font) text_shape_02 = pp.add_text_box(title_slide, text_02, PPTXPosition(0.42, 0.24), my_copied_font) pp.save(filename_pptx, overwrite=True)