diff --git a/photobook/photobook.py b/photobook/photobook.py index 33e8029..862c6a0 100644 --- a/photobook/photobook.py +++ b/photobook/photobook.py @@ -2,22 +2,25 @@ from fpdf import FPDF from .cropping import cut_save from pathlib import Path + class Photobook(FPDF): FIG = Path("./fig/") OUT = Path("./build/") - def __init__(self, name, - bg_color = (0, 0, 0), - txt_color = (255, 255, 255), - sep = 3, - pdf_size= (24.447, 20.955), - page_size = (24.13, 20.32), - security_margin_out = 0.635, - security_margin_binding = 1.27, - base_fig = "./fig/", - margin = -1, - img_px=1, - ): + def __init__( + self, + name, + bg_color=(0, 0, 0), + txt_color=(255, 255, 255), + sep=3, + pdf_size=(24.447, 20.955), + page_size=(24.13, 20.32), + security_margin_out=0.635, + security_margin_binding=1.27, + base_fig="./fig/", + margin=-1, + img_px=1, + ): super().__init__("P", "mm", pdf_size) self.name = name self.bg_color = bg_color @@ -36,7 +39,7 @@ class Photobook(FPDF): self.l_margin_ori = self.l_margin self.r_margin_ori = self.r_margin - self._fig_folder = Path('') + self._fig_folder = Path("") self._base_fig = Path(base_fig) self.img_px = img_px @@ -67,7 +70,7 @@ class Photobook(FPDF): @property def fig_src(self): return self._base_fig / self._fig_folder - #return self.FIG + # return self.FIG @property def size(self): @@ -75,20 +78,20 @@ class Photobook(FPDF): @property def epw(self): - """ Effective page width """ + """Effective page width""" return self.w - self.r_margin - self.l_margin @property def eph(self): - """ Effective page height """ + """Effective page height""" return self.h - 2 * self.t_margin - def add_page(self, orientation='P'): + def add_page(self, orientation="P"): super().add_page(orientation) self.rect(0, 0, self.w, self.h, style="F") def img_process(self, img, ratio=0): - """ Process the image. + """Process the image. if no ratio is given, the image is not cropped """ img_src = self.fig_src / Path(img) @@ -96,65 +99,69 @@ class Photobook(FPDF): return img_dest def one_fullpage(self, img): - """ Display the picture fullpage """ + """Display the picture fullpage with no margin around""" self.add_page() self.append_content(img, 0, 0, *self.size) # img_dest = self.img_process(img, self.size) # self.image(img_dest, 0, 0, *self.size) - def one_centered(self, img, text=""): - """ Display the picture centered with text """ + def one_centered( + self, + img, + text="", + ): + """Display the picture centered with text below""" self.add_page() if text == "": text_size = (0, 0) else: - text_size = (self.epw, (self.eph-self.sep)/6-self.sep) + text_size = (self.epw, (self.eph - self.sep) / 6 - self.sep) img_size = (self.epw, self.eph - text_size[1]) img_dest = self.img_process(img, img_size) self.image(img_dest, self.l_margin, self.t_margin, *img_size) - self.set_xy(self.l_margin, self.t_margin+img_size[1]+self.sep) - if '\n' in text: - self.multi_cell(text_size[0], self.font_size, text, align='J', border=1) + self.set_xy(self.l_margin, self.t_margin + img_size[1] + self.sep) + + if "\n" in text: + self.multi_cell(text_size[0], self.font_size, text, align="J", border=1) else: - self.cell(text_size[0], text_size[1]-self.sep, text, align='C', border=1) + self.cell(text_size[0], text_size[1] - self.sep, text, align="C", border=1) def one_side(self, img, txt=""): - """ Display the image on the outside of the page + """Display the image on the outside of the page along with text on the other side """ self.add_page() p_no = self.page_no() - win_dim = (self.size[0]*2/3, self.size[1]) + win_dim = (self.size[0] * 2 / 3, self.size[1]) img_dest = self.img_process(img, win_dim) if p_no % 2 == 1: - self.set_xy(win_dim[0], self.size[1]/2) - self.multi_cell(self.size[0]/3, self.font_size, txt, align="C") + self.set_xy(win_dim[0], self.size[1] / 2) + self.multi_cell(self.size[0] / 3, self.font_size, txt, align="C") self.image(img_dest, 0, 0, *win_dim) else: - self.set_xy(0, self.size[1]/2) - self.multi_cell(self.size[0]/3, self.font_size, txt, align="C") - self.image(img_dest, self.size[0]/3, 0, *win_dim) + self.set_xy(0, self.size[1] / 2) + self.multi_cell(self.size[0] / 3, self.font_size, txt, align="C") + self.image(img_dest, self.size[0] / 3, 0, *win_dim) def one_side_nocut(self, img, txt=""): - """ Display the image on the outside of the page without resize it - """ + """Display the image on the outside of the page without resize it""" self.add_page() p_no = self.page_no() win_dim = (self.size[0], self.size[1]) img_dest = self.img_process(img, win_dim) if p_no % 2 == 1: - self.set_xy(win_dim[0], self.size[1]/2) + self.set_xy(win_dim[0], self.size[1] / 2) self.image(img_dest, 0, 0, *win_dim) else: - self.set_xy(0, self.size[1]/2) - self.image(img_dest, self.size[0]/3, 0, *win_dim) + self.set_xy(0, self.size[1] / 2) + self.image(img_dest, self.size[0] / 3, 0, *win_dim) def rows(self, imgs, with_margin=True, with_sep=True): - """ Pictures in rows """ + """Pictures in rows""" self.add_page() if with_margin: @@ -172,8 +179,7 @@ class Photobook(FPDF): sep = 0 img_number = len(imgs) - win_dim = (pg_size[0], - (pg_size[1] - (img_number - 1) * sep) / img_number) + win_dim = (pg_size[0], (pg_size[1] - (img_number - 1) * sep) / img_number) for img in imgs: self.append_content(img, left, top, *win_dim) @@ -182,7 +188,7 @@ class Photobook(FPDF): top += win_dim[1] + sep def grid_row(self, content, layout=[], with_margin=True, with_sep=True): - """ Custom layout define by rows + """Custom layout define by rows :param content: img or text to display in layout's cells :param layout: cell layout with weight (need same shape than content) @@ -212,7 +218,9 @@ class Photobook(FPDF): raise ValueError("Content and Layout need to have same number of rows") for (r, row) in enumerate(content): if len(row) != len(layout[r]): - raise ValueError(f"Content and Layout need to have same number of columns at row {r}") + raise ValueError( + f"Content and Layout need to have same number of columns at row {r}" + ) top = ori_top left = ori_left @@ -230,9 +238,9 @@ class Photobook(FPDF): left = ori_left def grid_column(self, content, layout=[], with_margin=True, with_sep=True): - """ Custom layout define by column + """Custom layout define by column - :param content: img or text to display in layout's cells + :param content: img or text to display in layout's cells :param layout: cell layout with weight (need same shape than content) :param with_margin: Put margins around pictures :param with_sep: Put separation between pictures @@ -257,10 +265,14 @@ class Photobook(FPDF): layout = [[1 for r in column] for column in content] else: if len(content) != len(layout): - raise ValueError("Content and Layout need to have same number of columns") + raise ValueError( + "Content and Layout need to have same number of columns" + ) for (r, column) in enumerate(content): if len(column) != len(layout[r]): - raise ValueError(f"Content and Layout need to have same number of columns at column {r}") + raise ValueError( + f"Content and Layout need to have same number of columns at column {r}" + ) top = ori_top left = ori_left @@ -283,10 +295,11 @@ class Photobook(FPDF): self.image(img_dest, left, top, width, height) except (FileNotFoundError, IsADirectoryError): self.set_xy(left, top) - if '\n' in content: - self.multi_cell(width, self.font_size, content, align='J', border=1) + if "\n" in content: + self.multi_cell(width, self.font_size, content, align="J", border=1) else: - self.cell(width, height, content, align='C', border=1) + self.cell(width, height, content, align="C", border=1) + if __name__ == "__main__": name = "annee3" @@ -297,40 +310,73 @@ if __name__ == "__main__": out_fig = output / "fig" photobook = Photobook(name, pdf_size=pagesize) - photobook.set_font('Arial', 'B', 20) + photobook.set_font("Arial", "B", 20) photobook.set_auto_page_break(False) photobook.rows(["chronologie/annee3/1-DD/DD-01.jpg"]) - photobook.rows(["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"]) - photobook.rows(["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], with_margin=False) - photobook.rows(["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], with_sep=False) - photobook.rows(["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], with_margin=False, with_sep=False) - photobook.rows(["chronologie/annee3/1-DD/DD-01.jpg", - "Tralalala", - "chronologie/annee3/1-DD/DD-02.jpg", - "chronologie/annee3/1-DD/DD-02.jpg"]) + photobook.rows( + ["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"] + ) + photobook.rows( + ["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], + with_margin=False, + ) + photobook.rows( + ["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], + with_sep=False, + ) + photobook.rows( + ["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], + with_margin=False, + with_sep=False, + ) + photobook.rows( + [ + "chronologie/annee3/1-DD/DD-01.jpg", + "Tralalala", + "chronologie/annee3/1-DD/DD-02.jpg", + "chronologie/annee3/1-DD/DD-02.jpg", + ] + ) - photobook.grid_row([["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], - ["Coucou c'est moi!!", "chronologie/annee3/1-DD/DD-04.jpg"]], - [[1, 2], [3, 1]], - ) - photobook.grid_row([["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], - ["Coucou c'est moi!! \ncjfkldsq", "chronologie/annee3/1-DD/DD-04.jpg"]], - [[1, 2], [3, 1]]) - photobook.grid_row([["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], - ["chronologie/annee3/1-DD/DD-03.jpg", "chronologie/annee3/1-DD/DD-04.jpg"]], - [[1, 2], [3, 1]]) + photobook.grid_row( + [ + ["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], + ["Coucou c'est moi!!", "chronologie/annee3/1-DD/DD-04.jpg"], + ], + [[1, 2], [3, 1]], + ) + photobook.grid_row( + [ + ["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], + ["Coucou c'est moi!! \ncjfkldsq", "chronologie/annee3/1-DD/DD-04.jpg"], + ], + [[1, 2], [3, 1]], + ) + photobook.grid_row( + [ + ["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], + ["chronologie/annee3/1-DD/DD-03.jpg", "chronologie/annee3/1-DD/DD-04.jpg"], + ], + [[1, 2], [3, 1]], + ) photobook.set_top_margin(40) - photobook.grid_row([["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], - ["chronologie/annee3/1-DD/DD-03.jpg", "chronologie/annee3/1-DD/DD-04.jpg"]], - [[1, 2], [3, 1]],) + photobook.grid_row( + [ + ["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], + ["chronologie/annee3/1-DD/DD-03.jpg", "chronologie/annee3/1-DD/DD-04.jpg"], + ], + [[1, 2], [3, 1]], + ) photobook.restore_margin() - photobook.grid_row([["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], - ["chronologie/annee3/1-DD/DD-03.jpg", "chronologie/annee3/1-DD/DD-04.jpg"]], - [[1, 1], [1, 1]], - with_margin=False, with_sep=False - ) - + photobook.grid_row( + [ + ["chronologie/annee3/1-DD/DD-01.jpg", "chronologie/annee3/1-DD/DD-02.jpg"], + ["chronologie/annee3/1-DD/DD-03.jpg", "chronologie/annee3/1-DD/DD-04.jpg"], + ], + [[1, 1], [1, 1]], + with_margin=False, + with_sep=False, + ) photobook.output(dest) -