This commit is contained in:
Bertrand Benjamin 2022-07-05 06:51:28 +02:00
parent 2633a9829e
commit ed2c61fd42

View File

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