Compare commits

...

4 Commits

2 changed files with 124 additions and 32 deletions

View File

@@ -17,24 +17,88 @@ photobook.set_fig_folder("textures")
photobook.one_centered("eugene.jpg", "one_centered default")
photobook.one_centered("eugene.jpg", "")
photobook.one_centered(
"eugene.jpg",
"one_centered text_ratio=1, img_ratio=1",
text_ratio=1,
img_ratio=1
"eugene.jpg", "one_centered text_ratio=1, img_ratio=1", text_ratio=1, img_ratio=1
)
photobook.one_side("eugene.jpg", "one_side default")
photobook.one_side(
"eugene.jpg",
"one_side text_ratio=1, img_ratio=1",
text_ratio=1,
img_ratio=1
"eugene.jpg", "one_side text_ratio=1, img_ratio=1", text_ratio=1, img_ratio=1
)
photobook.one_side(
"eugene.jpg", "one_side text_ratio=1, img_ratio=1", text_ratio=1, img_ratio=1
)
photobook.grid_row(
[
["eugene.jpg", "eugene.jpg", "eugene.jpg"],
["eugene.jpg", "grid_row default", "eugene.jpg"],
["eugene.jpg", "eugene.jpg", "eugene.jpg"],
],
)
photobook.grid_row(
[
["eugene.jpg", "eugene.jpg"],
[
"eugene.jpg",
"one_side text_ratio=1, img_ratio=1",
text_ratio=1,
img_ratio=1
"grid_row\nlayout = \n[[1, 2], [1, 1, 1], [2, 1]]",
"eugene.jpg",
],
["eugene.jpg", "eugene.jpg"],
],
layout=[[1, 2], [1, 1, 1], [2, 1]],
)
photobook.grid_row(
[
["eugene.jpg", "eugene.jpg", "eugene.jpg"],
["eugene.jpg", "grid_row ratios=[1, 3, 1]", "eugene.jpg"],
["eugene.jpg", "eugene.jpg", "eugene.jpg"],
],
ratios=[1, 3, 1],
)
photobook.grid_row(
[
["eugene.jpg"],
["eugene.jpg", "grid_row ratios=[1, 3, 1]", "eugene.jpg"],
["eugene.jpg", "eugene.jpg"],
],
ratios=[1, 3, 1],
)
photobook.grid_column(
[
["eugene.jpg", "eugene.jpg", "eugene.jpg"],
["eugene.jpg", "grid_column default", "eugene.jpg"],
["eugene.jpg", "eugene.jpg", "eugene.jpg"],
],
)
photobook.grid_column(
[
["eugene.jpg", "eugene.jpg"],
[
"eugene.jpg",
"grid_column\nlayout = \n[[1, 2], [1, 1, 1], [2, 1]]",
"eugene.jpg",
],
["eugene.jpg", "eugene.jpg"],
],
layout=[[1, 2], [1, 1, 1], [2, 1]],
)
photobook.grid_column(
[
["eugene.jpg", "eugene.jpg", "eugene.jpg"],
["eugene.jpg", "grid_column ratios=[1, 3, 1]", "eugene.jpg"],
["eugene.jpg", "eugene.jpg", "eugene.jpg"],
],
ratios=[1, 3, 1],
)
photobook.grid_column(
[
["eugene.jpg"],
["eugene.jpg", "grid_column ratios=[1, 3, 1]", "eugene.jpg"],
["eugene.jpg", "eugene.jpg"],
],
ratios=[1, 3, 1],
)
photobook.output(dest)

View File

@@ -1,7 +1,9 @@
from fpdf import FPDF
from .cropping import cut_save
from pathlib import Path
from fpdf import FPDF
from .cropping import cut_save
class Photobook(FPDF):
FIG = Path("./fig/")
@@ -153,11 +155,15 @@ class Photobook(FPDF):
if p_no % 2 == 1:
self.set_xy(win_dim[0], self.size[1] / 2)
self.multi_cell(self.size[0] * text_ratio/ total_ratio, self.font_size, txt, align="C")
self.multi_cell(
self.size[0] * text_ratio / total_ratio, 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] * text_ratio / total_ratio, self.font_size, txt, align="C")
self.multi_cell(
self.size[0] * text_ratio / total_ratio, self.font_size, txt, align="C"
)
self.image(img_dest, self.size[0] * text_ratio / total_ratio, 0, *win_dim)
def one_side_nocut(self, img, txt=""):
@@ -200,11 +206,12 @@ class Photobook(FPDF):
# self.image(img_dest, left, top, *win_dim)
top += win_dim[1] + sep
def grid_row(self, content, layout=[], with_margin=True, with_sep=True):
def grid_row(self, content, layout=[], ratios=[], with_margin=True, with_sep=True):
"""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)
:param ratios: row's ratio
:param with_margin: Put margins around pictures
:param with_sep: Put separation between pictures
"""
@@ -229,32 +236,43 @@ class Photobook(FPDF):
else:
if len(content) != len(layout):
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]):
raise ValueError(
f"Content and Layout need to have same number of columns at row {r}"
)
if ratios == []:
ratios = [1 for row in content]
else:
if len(content) != len(ratios):
raise ValueError("Content and ratios need to have same number of rows")
total_ratio = sum(ratios)
top = ori_top
left = ori_left
height_unit = (pg_size[1] - (len(layout) - 1) * sep) / len(layout)
height_unit = (pg_size[1] - (len(layout) - 1) * sep) / total_ratio
for (r, row) in enumerate(layout):
width_unit = (pg_size[0] - (len(row) - 1) * sep) / sum(row)
for r, row in enumerate(layout):
width_unit = (pg_size[0] - (sum(row) - 1) * sep) / sum(row)
row_height = height_unit * ratios[r]
for (c, weight) in enumerate(row):
dim = (width_unit * weight, height_unit)
for c, weight in enumerate(row):
dim = (width_unit * weight + sep * (weight - 1), row_height)
self.append_content(content[r][c], left, top, *dim)
left += dim[0] + sep
top += height_unit + sep
top += row_height + sep
left = ori_left
def grid_column(self, content, layout=[], with_margin=True, with_sep=True):
def grid_column(
self, content, layout=[], ratios=[], with_margin=True, with_sep=True
):
"""Custom layout define by column
:param content: img or text to display in layout's cells
:param layout: cell layout with weight (need same shape than content)
:param ratios: column's ratio
:param with_margin: Put margins around pictures
:param with_sep: Put separation between pictures
"""
@@ -281,25 +299,35 @@ class Photobook(FPDF):
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]):
raise ValueError(
f"Content and Layout need to have same number of columns at column {r}"
)
if ratios == []:
ratios = [1 for c in content]
else:
if len(content) != len(ratios):
raise ValueError(
"Content and ratios need to have same number of columns"
)
total_ratio = sum(ratios)
top = ori_top
left = ori_left
width_unit = (pg_size[0] - (len(layout) - 1) * sep) / len(layout)
width_unit = (pg_size[0] - (len(layout) - 1) * sep) / total_ratio
for (c, column) in enumerate(layout):
height_unit = (pg_size[1] - (len(column) - 1) * sep) / sum(column)
for c, column in enumerate(layout):
height_unit = (pg_size[1] - (sum(column) - 1) * sep) / sum(column)
column_width = width_unit * ratios[c]
for (r, weight) in enumerate(column):
dim = (width_unit, height_unit * weight)
for r, weight in enumerate(column):
dim = (column_width, height_unit * weight + sep * (weight - 1))
self.append_content(content[c][r], left, top, *dim)
top += dim[1] + sep
left += width_unit + sep
left += column_width + sep
top = ori_top
def append_content(self, content, left, top, width, height):