Compare commits
7 commits
Author | SHA1 | Date | |
---|---|---|---|
e415d0202a | |||
e84aa8d42e | |||
9475574481 | |||
2aa1271aec | |||
fab6925674 | |||
d0e5c1e48d | |||
d4ed39b7d2 |
4 changed files with 45 additions and 19 deletions
|
@ -2,6 +2,11 @@
|
|||
CHANGES
|
||||
=======
|
||||
|
||||
0.5.2 (2024-01-12)
|
||||
------------------
|
||||
|
||||
- support for pymupdf 1.23.0
|
||||
|
||||
0.5.1 (2022-07-23)
|
||||
------------------
|
||||
|
||||
|
|
|
@ -48,9 +48,8 @@ Plakativ is available from pypi: https://pypi.org/project/plakativ/
|
|||
Thus you can just run `pip install plakativ` on your platform of choice.
|
||||
|
||||
For Microsoft Windows users, PyInstaller based .exe files are produced by
|
||||
appveyor. If you don't want to install Python before using plakativ you can
|
||||
head to appveyor and click on "Artifacts" to download the latest version:
|
||||
https://ci.appveyor.com/project/josch/plakativ
|
||||
appveyor. The resulting artifacts are attached to each release:
|
||||
https://gitlab.mister-muffin.de/josch/plakativ/releases
|
||||
|
||||
Complex Layouter
|
||||
================
|
||||
|
|
52
plakativ.py
52
plakativ.py
|
@ -25,6 +25,11 @@ import logging
|
|||
|
||||
have_img2pdf = True
|
||||
try:
|
||||
from PIL import Image
|
||||
|
||||
# ignore PIL limit because this software is meant to create posters which
|
||||
# naturally can be very large in size
|
||||
Image.MAX_IMAGE_PIXELS = None
|
||||
import img2pdf
|
||||
except ImportError:
|
||||
have_img2pdf = False
|
||||
|
@ -46,7 +51,7 @@ except ImportError:
|
|||
tkinter.Menubutton = dummy
|
||||
tkinter.LabelFrame = dummy
|
||||
|
||||
VERSION = "0.5.1"
|
||||
VERSION = "0.5.2"
|
||||
|
||||
PAGE_SIZES = OrderedDict(
|
||||
[
|
||||
|
@ -267,7 +272,7 @@ def complex_cover(n, m, x, y):
|
|||
if X4 > 0 and Y4 > 0:
|
||||
simple_config, (sx, sy) = simple_cover(X4, Y4, x, y)
|
||||
# shift the results such that they are in the center
|
||||
for (cx, cy, p) in simple_config:
|
||||
for cx, cy, p in simple_config:
|
||||
newconfig.append(
|
||||
(
|
||||
w0 * X(r, 0) + (X4 - sx) / 2 + cx,
|
||||
|
@ -281,7 +286,7 @@ def complex_cover(n, m, x, y):
|
|||
if X4 > 0 and Y4 > 0:
|
||||
simple_config, (sx, sy) = simple_cover(X4, Y4, x, y)
|
||||
# shift the results such that they are in the center
|
||||
for (cx, cy, p) in simple_config:
|
||||
for cx, cy, p in simple_config:
|
||||
newconfig.append(
|
||||
(
|
||||
w3 * X(r, 3) + (X4 - sx) / 2 + cx,
|
||||
|
@ -387,6 +392,10 @@ class Plakativ:
|
|||
gdl = self.doc[self.pagenr].get_displaylist
|
||||
else:
|
||||
gdl = self.doc[self.pagenr].getDisplayList
|
||||
# this may fail with "RuntimeError: image is too wide"
|
||||
# from pdf_load_image_imp() in pdf-image.c from mupdf for sizes larger
|
||||
# than 1<<16 pixels:
|
||||
# https://bugs.ghostscript.com/show_bug.cgi?id=703839
|
||||
rect = gdl().rect
|
||||
inpage_width = pt_to_mm(rect.width)
|
||||
inpage_height = pt_to_mm(rect.height)
|
||||
|
@ -589,7 +598,7 @@ class Plakativ:
|
|||
# the computed positions and storing the largest border size in
|
||||
# each dimension
|
||||
poster_top = poster_right = poster_bottom = poster_left = 0
|
||||
for (posx, posy, p) in self.layout["positions"]:
|
||||
for posx, posy, p in self.layout["positions"]:
|
||||
if p:
|
||||
top = posy - border_top
|
||||
if top < 0 and -top > poster_top:
|
||||
|
@ -708,7 +717,11 @@ class Plakativ:
|
|||
shape = page.new_shape()
|
||||
else:
|
||||
shape = page.newShape()
|
||||
shape.drawRect(
|
||||
if hasattr(shape, "draw_rect"):
|
||||
dr = shape.draw_rect
|
||||
else:
|
||||
dr = shape.drawRect
|
||||
dr(
|
||||
fitz.Rect(
|
||||
x0,
|
||||
y0,
|
||||
|
@ -718,7 +731,7 @@ class Plakativ:
|
|||
)
|
||||
shape.finish(color=(0, 0, 1))
|
||||
# outer rectangle
|
||||
shape.drawRect(
|
||||
dr(
|
||||
fitz.Rect(
|
||||
x0 - left,
|
||||
y0 - top,
|
||||
|
@ -812,9 +825,13 @@ class Plakativ:
|
|||
shape = page.new_shape()
|
||||
else:
|
||||
shape = page.newShape()
|
||||
if hasattr(shape, "draw_rect"):
|
||||
dr = shape.draw_rect
|
||||
else:
|
||||
dr = shape.drawRect
|
||||
if guides:
|
||||
if portrait:
|
||||
shape.drawRect(
|
||||
dr(
|
||||
fitz.Rect(
|
||||
mm_to_pt(self.layout["border_left"]),
|
||||
mm_to_pt(self.layout["border_top"]),
|
||||
|
@ -823,7 +840,7 @@ class Plakativ:
|
|||
)
|
||||
)
|
||||
else:
|
||||
shape.drawRect(
|
||||
dr(
|
||||
fitz.Rect(
|
||||
mm_to_pt(self.layout["border_bottom"]),
|
||||
mm_to_pt(self.layout["border_left"]),
|
||||
|
@ -859,7 +876,7 @@ class Plakativ:
|
|||
)
|
||||
if border:
|
||||
if portrait:
|
||||
shape.drawRect(
|
||||
dr(
|
||||
fitz.Rect(
|
||||
mm_to_pt(self.layout["border_left"] - x),
|
||||
mm_to_pt(self.layout["border_top"] - y),
|
||||
|
@ -876,7 +893,7 @@ class Plakativ:
|
|||
)
|
||||
)
|
||||
else:
|
||||
shape.drawRect(
|
||||
dr(
|
||||
fitz.Rect(
|
||||
mm_to_pt(self.layout["border_bottom"] - x),
|
||||
mm_to_pt(self.layout["border_left"] - y),
|
||||
|
@ -1034,7 +1051,10 @@ class Application(tkinter.Frame):
|
|||
top_frame = tkinter.Frame(frame_right)
|
||||
top_frame.pack(fill=tkinter.X)
|
||||
|
||||
tkinter.Button(top_frame, text="Open PDF", command=self.on_open_button).pack(
|
||||
button_text = "Open PDF"
|
||||
if have_img2pdf:
|
||||
button_text = "Open PDF, JPG, PNG, TIF"
|
||||
tkinter.Button(top_frame, text=button_text, command=self.on_open_button).pack(
|
||||
side=tkinter.LEFT, expand=tkinter.TRUE, fill=tkinter.X
|
||||
)
|
||||
tkinter.Button(top_frame, text="Help", state=tkinter.DISABLED).pack(
|
||||
|
@ -1188,10 +1208,13 @@ class Application(tkinter.Frame):
|
|||
self.canvas.delete(tkinter.ALL)
|
||||
|
||||
if not hasattr(self, "plakativ"):
|
||||
button_text = "Open PDF"
|
||||
if have_img2pdf:
|
||||
button_text = "Open PDF, JPG, PNG, TIF"
|
||||
self.canvas.create_text(
|
||||
self.canvas_size[0] / 2,
|
||||
self.canvas_size[1] / 2,
|
||||
text='Click on the "Open PDF" button in the upper right.',
|
||||
text='Click on the "%s" button in the upper right.' % button_text,
|
||||
fill="white",
|
||||
)
|
||||
return
|
||||
|
@ -1247,7 +1270,7 @@ class Application(tkinter.Frame):
|
|||
|
||||
# draw rectangles
|
||||
# TODO: also draw numbers indicating the page number
|
||||
for (x, y, portrait) in self.plakativ.layout["positions"]:
|
||||
for x, y, portrait in self.plakativ.layout["positions"]:
|
||||
x0 = (x + self.plakativ.layout["posterpos"][0]) * zoom_1 + (
|
||||
self.canvas_size[0] - zoom_1 * self.plakativ.layout["overallsize"][0]
|
||||
) / 2
|
||||
|
@ -1335,8 +1358,6 @@ class Application(tkinter.Frame):
|
|||
)
|
||||
# remove alpha channel
|
||||
if remove_alpha:
|
||||
from PIL import Image
|
||||
|
||||
img = Image.open(self.filename).convert("RGBA")
|
||||
background = Image.new("RGBA", img.size, (255, 255, 255))
|
||||
img = Image.alpha_composite(background, img)
|
||||
|
@ -1693,6 +1714,7 @@ class BorderSizeWidget(tkinter.LabelFrame):
|
|||
]
|
||||
):
|
||||
self.variables[n] = tkinter.DoubleVar()
|
||||
|
||||
# need to pass k and v as function arguments so that their value
|
||||
# does not get overwritten each loop iteration
|
||||
def callback(varname, idx, op, k_copy=n, v_copy=self.variables[n]):
|
||||
|
|
2
setup.py
2
setup.py
|
@ -1,6 +1,6 @@
|
|||
from setuptools import setup
|
||||
|
||||
VERSION = "0.5.1"
|
||||
VERSION = "0.5.2"
|
||||
|
||||
setup(
|
||||
name="plakativ",
|
||||
|
|
Loading…
Reference in a new issue