Compare commits

..

No commits in common. "master" and "V0.9" have entirely different histories.
master ... V0.9

10 changed files with 118 additions and 257 deletions

29
.gitignore vendored
View File

@ -1,29 +0,0 @@
example/build
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
share/python-wheels/
*.egg-info/
.installed.cfg
*.egg
MANIFEST

View File

@ -1,104 +0,0 @@
from photobook import Photobook
from pathlib import Path
name = "album"
pagesize = (250, 200)
src_fig = Path("./fig/")
output = Path("./build/")
dest = output / (name + ".pdf")
out_fig = output / "fig"
photobook = Photobook(name, pdf_size=pagesize, base_fig=src_fig, margin=5, img_px=2)
photobook.set_font("Arial", "B", 20)
photobook.set_auto_page_break(False)
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
)
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
)
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",
"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)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 125 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 170 KiB

View File

@ -1,26 +1,21 @@
from pathlib import Path
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,
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)
@ -41,7 +36,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
@ -72,7 +67,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):
@ -80,20 +75,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)
@ -101,86 +96,65 @@ class Photobook(FPDF):
return img_dest
def one_fullpage(self, img):
"""Display the picture fullpage with no margin around"""
""" Display the picture fullpage """
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="",
img_ratio=5,
text_ratio=1,
):
"""Display the picture centered with text below"""
def one_centered(self, img, text=""):
""" Display the picture centered with text """
self.add_page()
total_ratio = img_ratio + text_ratio
text_size = (
self.epw,
(self.eph - self.sep) * text_ratio / total_ratio - self.sep,
)
if text == "":
text_size = (0, 0)
else:
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="",
img_ratio=5,
text_ratio=1,
):
"""Display the image on the outside of the page
def one_side(self, img, txt=""):
""" Display the image on the outside of the page
along with text on the other side
"""
self.add_page()
p_no = self.page_no()
total_ratio = img_ratio + text_ratio
win_dim = (self.size[0] * img_ratio / total_ratio, 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] * text_ratio / total_ratio, 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] * text_ratio / total_ratio, self.font_size, txt, align="C"
)
self.image(img_dest, self.size[0] * text_ratio / total_ratio, 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:
@ -198,7 +172,8 @@ 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)
@ -206,12 +181,11 @@ class Photobook(FPDF):
# self.image(img_dest, left, top, *win_dim)
top += win_dim[1] + sep
def grid_row(self, content, layout=[], ratios=[], with_margin=True, with_sep=True):
"""Custom layout define by rows
def grid_row(self, content, layout=[], 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
"""
@ -236,43 +210,30 @@ 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)
raise ValueError(f"Content and Layout need to have same number of columns at row {r}")
top = ori_top
left = ori_left
height_unit = (pg_size[1] - (len(layout) - 1) * sep) / total_ratio
height_unit = (pg_size[1] - (len(layout) - 1) * sep) / len(layout)
for r, row in enumerate(layout):
width_unit = (pg_size[0] - (sum(row) - 1) * sep) / sum(row)
row_height = height_unit * ratios[r]
for (r, row) in enumerate(layout):
width_unit = (pg_size[0] - (len(row) - 1) * sep) / sum(row)
for c, weight in enumerate(row):
dim = (width_unit * weight + sep * (weight - 1), row_height)
for (c, weight) in enumerate(row):
dim = (width_unit * weight, height_unit)
self.append_content(content[r][c], left, top, *dim)
left += dim[0] + sep
top += row_height + sep
top += height_unit + sep
left = ori_left
def grid_column(
self, content, layout=[], ratios=[], with_margin=True, with_sep=True
):
"""Custom layout define by column
def grid_column(self, content, layout=[], 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
"""
@ -296,38 +257,24 @@ 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"
)
for r, column in enumerate(content):
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}"
)
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)
raise ValueError(f"Content and Layout need to have same number of columns at column {r}")
top = ori_top
left = ori_left
width_unit = (pg_size[0] - (len(layout) - 1) * sep) / total_ratio
width_unit = (pg_size[0] - (len(layout) - 1) * sep) / len(layout)
for c, column in enumerate(layout):
height_unit = (pg_size[1] - (sum(column) - 1) * sep) / sum(column)
column_width = width_unit * ratios[c]
for (c, column) in enumerate(layout):
height_unit = (pg_size[1] - (len(column) - 1) * sep) / sum(column)
for r, weight in enumerate(column):
dim = (column_width, height_unit * weight + sep * (weight - 1))
for (r, weight) in enumerate(column):
dim = (width_unit, height_unit * weight)
self.append_content(content[c][r], left, top, *dim)
top += dim[1] + sep
left += column_width + sep
left += width_unit + sep
top = ori_top
def append_content(self, content, left, top, width, height):
@ -336,7 +283,54 @@ 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"
pagesize = (250, 200)
src_fig = Path("./fig/")
output = Path("./build/")
dest = output / (name + ".pdf")
out_fig = output / "fig"
photobook = Photobook(name, pdf_size=pagesize)
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.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.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.output(dest)