Compare commits
6 Commits
2633a9829e
...
1dbec31687
Author | SHA1 | Date | |
---|---|---|---|
1dbec31687 | |||
58edb87ebc | |||
27e5c52548 | |||
fb8cc804f3 | |||
81cc461746 | |||
ed2c61fd42 |
29
.gitignore
vendored
Normal 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
@ -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
After Width: | Height: | Size: 125 KiB |
BIN
example/fig/food/glass.jpg
Normal file
After Width: | Height: | Size: 76 KiB |
BIN
example/fig/food/muffle.jpg
Normal file
After Width: | Height: | Size: 97 KiB |
BIN
example/fig/textures/eugene.jpg
Normal file
After Width: | Height: | Size: 149 KiB |
BIN
example/fig/textures/hiroyuki.jpg
Normal file
After Width: | Height: | Size: 83 KiB |
BIN
example/fig/textures/marek.jpg
Normal file
After Width: | Height: | Size: 88 KiB |
BIN
example/fig/textures/saqib.jpg
Normal file
After Width: | Height: | Size: 170 KiB |
@ -2,11 +2,14 @@ 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,
|
||||
def __init__(
|
||||
self,
|
||||
name,
|
||||
bg_color=(0, 0, 0),
|
||||
txt_color=(255, 255, 255),
|
||||
sep=3,
|
||||
@ -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
|
||||
@ -83,7 +86,7 @@ class Photobook(FPDF):
|
||||
"""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")
|
||||
|
||||
@ -96,20 +99,27 @@ 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)
|
||||
@ -117,31 +127,41 @@ class Photobook(FPDF):
|
||||
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)
|
||||
|
||||
def one_side(self, img, txt=""):
|
||||
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.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.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])
|
||||
@ -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)
|
||||
@ -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
|
||||
@ -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)
|
||||
|