Compare commits

...

6 Commits

10 changed files with 149 additions and 102 deletions

29
.gitignore vendored Normal file
View File

@ -0,0 +1,29 @@
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

40
example/album.py Normal file
View File

@ -0,0 +1,40 @@
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.output(dest)

BIN
example/fig/food/crepe.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

BIN
example/fig/food/glass.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

BIN
example/fig/food/muffle.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 KiB

View File

@ -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,82 @@ 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="",
img_ratio=5,
text_ratio=1,
):
"""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)
total_ratio = img_ratio + text_ratio
text_size = (
self.epw,
(self.eph - self.sep) * text_ratio / total_ratio - 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)
else:
self.cell(text_size[0], text_size[1]-self.sep, text, align='C', border=1)
self.set_xy(self.l_margin, self.t_margin + img_size[1] + self.sep)
def one_side(self, img, txt=""):
""" Display the image on the outside of the page
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)
def one_side(
self,
img,
txt="",
img_ratio=5,
text_ratio=1,
):
"""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])
total_ratio = img_ratio + text_ratio
win_dim = (self.size[0] * img_ratio / total_ratio, 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] * 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]/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] * 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=""):
""" 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 +192,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 +201,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 +231,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 +251,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 +278,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,54 +308,7 @@ 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)
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)
self.cell(width, height, content, align="C", border=1)