add rudimentary GUI
This commit is contained in:
parent
1bb21f0c85
commit
7a3daec620
1 changed files with 356 additions and 76 deletions
410
src/img2pdf.py
410
src/img2pdf.py
|
@ -2233,6 +2233,12 @@ def gui():
|
||||||
import tkinter
|
import tkinter
|
||||||
import tkinter.filedialog
|
import tkinter.filedialog
|
||||||
|
|
||||||
|
have_fitz = True
|
||||||
|
try:
|
||||||
|
import fitz
|
||||||
|
except ImportError:
|
||||||
|
have_fitz = False
|
||||||
|
|
||||||
# from Python 3.7 Lib/idlelib/configdialog.py
|
# from Python 3.7 Lib/idlelib/configdialog.py
|
||||||
# Copyright 2015-2017 Terry Jan Reedy
|
# Copyright 2015-2017 Terry Jan Reedy
|
||||||
# Python License
|
# Python License
|
||||||
|
@ -2346,12 +2352,59 @@ def gui():
|
||||||
root = tkinter.Tk()
|
root = tkinter.Tk()
|
||||||
app = tkinter.Frame(master=root)
|
app = tkinter.Frame(master=root)
|
||||||
|
|
||||||
filenames = []
|
infiles = []
|
||||||
|
maxpagewidth = 0
|
||||||
|
maxpageheight = 0
|
||||||
|
doc = None
|
||||||
|
|
||||||
|
args = {
|
||||||
|
"without_pdfrw": tkinter.BooleanVar(),
|
||||||
|
"first_frame_only": tkinter.BooleanVar(),
|
||||||
|
"auto_orient": tkinter.BooleanVar(),
|
||||||
|
"fit": tkinter.StringVar(),
|
||||||
|
"title": tkinter.StringVar(),
|
||||||
|
"author": tkinter.StringVar(),
|
||||||
|
"creator": tkinter.StringVar(),
|
||||||
|
"producer": tkinter.StringVar(),
|
||||||
|
"subject": tkinter.StringVar(),
|
||||||
|
"keywords": tkinter.StringVar(),
|
||||||
|
"nodate": tkinter.BooleanVar(),
|
||||||
|
"creationdate": tkinter.StringVar(),
|
||||||
|
"moddate": tkinter.StringVar(),
|
||||||
|
"viewer_panes": tkinter.StringVar(),
|
||||||
|
"viewer_initial_page": tkinter.IntVar(),
|
||||||
|
"viewer_magnification": tkinter.StringVar(),
|
||||||
|
"viewer_page_layout": tkinter.StringVar(),
|
||||||
|
"viewer_fit_window": tkinter.BooleanVar(),
|
||||||
|
"viewer_center_window": tkinter.BooleanVar(),
|
||||||
|
"viewer_fullscreen": tkinter.BooleanVar(),
|
||||||
|
"pagesize_dropdown": tkinter.StringVar(),
|
||||||
|
"pagesize_width": tkinter.DoubleVar(),
|
||||||
|
"pagesize_height": tkinter.DoubleVar(),
|
||||||
|
"imgsize_dropdown": tkinter.StringVar(),
|
||||||
|
"imgsize_width": tkinter.DoubleVar(),
|
||||||
|
"imgsize_height": tkinter.DoubleVar(),
|
||||||
|
"colorspace": tkinter.StringVar(),
|
||||||
|
"first_frame_only": tkinter.BooleanVar(),
|
||||||
|
}
|
||||||
|
args["title"].set("")
|
||||||
|
args["auto_orient"].set(False)
|
||||||
|
args["fit"].set("into")
|
||||||
|
args["colorspace"].set("auto")
|
||||||
|
args["viewer_panes"].set("auto")
|
||||||
|
args["viewer_initial_page"].set(1)
|
||||||
|
args["viewer_magnification"].set("auto")
|
||||||
|
args["viewer_page_layout"].set("auto")
|
||||||
|
args["first_frame_only"].set(False)
|
||||||
|
args["pagesize_dropdown"].set("auto")
|
||||||
|
args["imgsize_dropdown"].set("auto")
|
||||||
|
|
||||||
def on_open_button():
|
def on_open_button():
|
||||||
filenames.clear()
|
nonlocal infiles
|
||||||
filenames.extend(
|
nonlocal doc
|
||||||
tkinter.filedialog.askopenfilenames(
|
nonlocal maxpagewidth
|
||||||
|
nonlocal maxpageheight
|
||||||
|
infiles = tkinter.filedialog.askopenfilenames(
|
||||||
parent=root,
|
parent=root,
|
||||||
title="open image",
|
title="open image",
|
||||||
filetypes=[
|
filetypes=[
|
||||||
|
@ -2364,6 +2417,112 @@ def gui():
|
||||||
# initialdir="/home/josch/git/plakativ",
|
# initialdir="/home/josch/git/plakativ",
|
||||||
# initialfile="test.pdf",
|
# initialfile="test.pdf",
|
||||||
)
|
)
|
||||||
|
if have_fitz:
|
||||||
|
with BytesIO() as f:
|
||||||
|
save_pdf(f)
|
||||||
|
f.seek(0)
|
||||||
|
doc = fitz.open(stream=f, filetype="pdf")
|
||||||
|
for page in doc:
|
||||||
|
if page.getDisplayList().rect.width > maxpagewidth:
|
||||||
|
maxpagewidth = page.getDisplayList().rect.width
|
||||||
|
if page.getDisplayList().rect.height > maxpageheight:
|
||||||
|
maxpageheight = page.getDisplayList().rect.height
|
||||||
|
draw()
|
||||||
|
|
||||||
|
def save_pdf(stream):
|
||||||
|
pagesizearg = None
|
||||||
|
if args["pagesize_dropdown"].get() == "auto":
|
||||||
|
# nothing to do
|
||||||
|
pass
|
||||||
|
elif args["pagesize_dropdown"].get() == "custom":
|
||||||
|
pagesizearg = args["pagesize_width"].get(), args["pagesize_height"].get()
|
||||||
|
elif args["pagesize_dropdown"].get() in papernames.values():
|
||||||
|
raise NotImplemented()
|
||||||
|
else:
|
||||||
|
raise Exception("no such pagesize: %s" % args["pagesize_dropdown"].get())
|
||||||
|
imgsizearg = None
|
||||||
|
if args["imgsize_dropdown"].get() == "auto":
|
||||||
|
# nothing to do
|
||||||
|
pass
|
||||||
|
elif args["imgsize_dropdown"].get() == "custom":
|
||||||
|
imgsizearg = args["imgsize_width"].get(), args["imgsize_height"].get()
|
||||||
|
elif args["imgsize_dropdown"].get() in papernames.values():
|
||||||
|
raise NotImplemented()
|
||||||
|
else:
|
||||||
|
raise Exception("no such imgsize: %s" % args["imgsize_dropdown"].get())
|
||||||
|
borderarg = None
|
||||||
|
layout_fun = get_layout_fun(
|
||||||
|
pagesizearg,
|
||||||
|
imgsizearg,
|
||||||
|
borderarg,
|
||||||
|
args["fit"].get(),
|
||||||
|
args["auto_orient"].get(),
|
||||||
|
)
|
||||||
|
viewer_panesarg = None
|
||||||
|
if args["viewer_panes"].get() == "auto":
|
||||||
|
# nothing to do
|
||||||
|
pass
|
||||||
|
elif args["viewer_panes"].get() in PageMode:
|
||||||
|
viewer_panesarg = args["viewer_panes"].get()
|
||||||
|
else:
|
||||||
|
raise Exception("no such viewer_panes: %s" % args["viewer_panes"].get())
|
||||||
|
viewer_magnificationarg = None
|
||||||
|
if args["viewer_magnification"].get() == "auto":
|
||||||
|
# nothing to do
|
||||||
|
pass
|
||||||
|
elif args["viewer_magnification"].get() in Magnification:
|
||||||
|
viewer_magnificationarg = args["viewer_magnification"].get()
|
||||||
|
else:
|
||||||
|
raise Exception(
|
||||||
|
"no such viewer_magnification: %s" % args["viewer_magnification"].get()
|
||||||
|
)
|
||||||
|
viewer_page_layoutarg = None
|
||||||
|
if args["viewer_page_layout"].get() == "auto":
|
||||||
|
# nothing to do
|
||||||
|
pass
|
||||||
|
elif args["viewer_page_layout"].get() in PageLayout:
|
||||||
|
viewer_page_layoutarg = args["viewer_page_layout"].get()
|
||||||
|
else:
|
||||||
|
raise Exception(
|
||||||
|
"no such viewer_page_layout: %s" % args["viewer_page_layout"].get()
|
||||||
|
)
|
||||||
|
colorspacearg = None
|
||||||
|
if args["colorspace"].get() != "auto":
|
||||||
|
colorspacearg = next(
|
||||||
|
v for v in Colorspace if v.name == args["colorspace"].get()
|
||||||
|
)
|
||||||
|
|
||||||
|
convert(
|
||||||
|
*infiles,
|
||||||
|
title=args["title"].get() if args["title"].get() else None,
|
||||||
|
author=args["author"].get() if args["author"].get() else None,
|
||||||
|
creator=args["creator"].get() if args["creator"].get() else None,
|
||||||
|
producer=args["producer"].get() if args["producer"].get() else None,
|
||||||
|
creationdate=args["creationdate"].get()
|
||||||
|
if args["creationdate"].get()
|
||||||
|
else None,
|
||||||
|
moddate=args["moddate"].get() if args["moddate"].get() else None,
|
||||||
|
subject=args["subject"].get() if args["subject"].get() else None,
|
||||||
|
keywords=args["keywords"].get() if args["keywords"].get() else None,
|
||||||
|
colorspace=colorspacearg,
|
||||||
|
nodate=args["nodate"].get(),
|
||||||
|
layout_fun=layout_fun,
|
||||||
|
viewer_panes=viewer_panesarg,
|
||||||
|
viewer_initial_page=args["viewer_initial_page"].get()
|
||||||
|
if args["viewer_initial_page"].get() > 1
|
||||||
|
else None,
|
||||||
|
viewer_magnification=viewer_magnificationarg,
|
||||||
|
viewer_page_layout=viewer_page_layoutarg,
|
||||||
|
viewer_fit_window=(args["viewer_fit_window"].get() or None),
|
||||||
|
viewer_center_window=(args["viewer_center_window"].get() or None),
|
||||||
|
viewer_fullscreen=(args["viewer_fullscreen"].get() or None),
|
||||||
|
with_pdfrw=not args["without_pdfrw"].get(),
|
||||||
|
outputstream=stream,
|
||||||
|
first_frame_only=args["first_frame_only"].get(),
|
||||||
|
cropborder=None,
|
||||||
|
bleedborder=None,
|
||||||
|
trimborder=None,
|
||||||
|
artborder=None,
|
||||||
)
|
)
|
||||||
|
|
||||||
def on_save_button():
|
def on_save_button():
|
||||||
|
@ -2376,41 +2535,125 @@ def gui():
|
||||||
# initialfile=base + "_poster" + ext,
|
# initialfile=base + "_poster" + ext,
|
||||||
)
|
)
|
||||||
with open(filename, "wb") as f:
|
with open(filename, "wb") as f:
|
||||||
convert(*filenames, outputstream=f)
|
save_pdf(f)
|
||||||
|
|
||||||
root.title("img2pdf")
|
root.title("img2pdf")
|
||||||
app.pack(fill=tkinter.BOTH, expand=tkinter.TRUE)
|
app.pack(fill=tkinter.BOTH, expand=tkinter.TRUE)
|
||||||
tkinter.Button(app, text="Open Image", command=on_open_button).pack(
|
|
||||||
side=tkinter.TOP, expand=tkinter.FALSE, fill=tkinter.X
|
canvas = tkinter.Canvas(app, bg="black")
|
||||||
|
|
||||||
|
def draw():
|
||||||
|
canvas.delete(tkinter.ALL)
|
||||||
|
if not infiles:
|
||||||
|
canvas.create_text(
|
||||||
|
canvas.size[0] / 2,
|
||||||
|
canvas.size[1] / 2,
|
||||||
|
text='Click on the "Open Image(s)" button in the upper right.',
|
||||||
|
fill="white",
|
||||||
)
|
)
|
||||||
frame1 = VerticalScrolledFrame(app)
|
return
|
||||||
frame1.pack(side=tkinter.TOP, expand=tkinter.TRUE, fill=tkinter.BOTH)
|
|
||||||
|
if not doc:
|
||||||
|
canvas.create_text(
|
||||||
|
canvas.size[0] / 2,
|
||||||
|
canvas.size[1] / 2,
|
||||||
|
text="PyMuPDF not available. Install the Python fitz module\n"
|
||||||
|
+ "for preview functionality.",
|
||||||
|
fill="white",
|
||||||
|
)
|
||||||
|
return
|
||||||
|
|
||||||
|
canvas_padding = 10
|
||||||
|
# factor to convert from pdf dimensions (given in pt) into canvas
|
||||||
|
# dimensions (given in pixels)
|
||||||
|
zoom = min(
|
||||||
|
(canvas.size[0] - canvas_padding) / maxpagewidth,
|
||||||
|
(canvas.size[1] - canvas_padding) / maxpageheight,
|
||||||
|
)
|
||||||
|
|
||||||
|
pagenum = 0
|
||||||
|
mat_0 = fitz.Matrix(zoom, zoom)
|
||||||
|
canvas.image = tkinter.PhotoImage(
|
||||||
|
data=doc[pagenum]
|
||||||
|
.getDisplayList()
|
||||||
|
.getPixmap(matrix=mat_0, alpha=False)
|
||||||
|
.getImageData("ppm")
|
||||||
|
)
|
||||||
|
canvas.create_image(
|
||||||
|
(canvas.size[0] - maxpagewidth * zoom) / 2,
|
||||||
|
(canvas.size[1] - maxpageheight * zoom) / 2,
|
||||||
|
anchor=tkinter.NW,
|
||||||
|
image=canvas.image,
|
||||||
|
)
|
||||||
|
|
||||||
|
canvas.create_rectangle(
|
||||||
|
(canvas.size[0] - maxpagewidth * zoom) / 2,
|
||||||
|
(canvas.size[1] - maxpageheight * zoom) / 2,
|
||||||
|
(canvas.size[0] - maxpagewidth * zoom) / 2 + canvas.image.width(),
|
||||||
|
(canvas.size[1] - maxpageheight * zoom) / 2 + canvas.image.height(),
|
||||||
|
outline="red",
|
||||||
|
)
|
||||||
|
|
||||||
|
def on_resize(event):
|
||||||
|
canvas.size = (event.width, event.height)
|
||||||
|
draw()
|
||||||
|
|
||||||
|
canvas.pack(fill=tkinter.BOTH, side=tkinter.LEFT, expand=tkinter.TRUE)
|
||||||
|
canvas.bind("<Configure>", on_resize)
|
||||||
|
|
||||||
|
frame_right = tkinter.Frame(app)
|
||||||
|
frame_right.pack(side=tkinter.TOP, expand=tkinter.TRUE, fill=tkinter.Y)
|
||||||
|
|
||||||
|
top_frame = tkinter.Frame(frame_right)
|
||||||
|
top_frame.pack(fill=tkinter.X)
|
||||||
|
|
||||||
|
tkinter.Button(top_frame, text="Open Image(s)", command=on_open_button).pack(
|
||||||
|
side=tkinter.LEFT, expand=tkinter.TRUE, fill=tkinter.X
|
||||||
|
)
|
||||||
|
tkinter.Button(top_frame, text="Help", state=tkinter.DISABLED).pack(
|
||||||
|
side=tkinter.RIGHT, expand=tkinter.TRUE, fill=tkinter.X
|
||||||
|
)
|
||||||
|
|
||||||
|
frame1 = VerticalScrolledFrame(frame_right)
|
||||||
|
frame1.pack(side=tkinter.TOP, expand=tkinter.TRUE, fill=tkinter.Y)
|
||||||
|
|
||||||
output_options = tkinter.LabelFrame(frame1.interior, text="Output Options")
|
output_options = tkinter.LabelFrame(frame1.interior, text="Output Options")
|
||||||
output_options.pack(side=tkinter.TOP, expand=tkinter.TRUE, fill=tkinter.X)
|
output_options.pack(side=tkinter.TOP, expand=tkinter.TRUE, fill=tkinter.X)
|
||||||
tkinter.Label(output_options, text="colorspace", state=tkinter.DISABLED).grid(
|
tkinter.Label(output_options, text="colorspace").grid(
|
||||||
row=0, column=0, sticky=tkinter.W
|
row=0, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
OptionMenu(output_options, tkinter.StringVar(), ["foo", "bar"]).grid(
|
OptionMenu(output_options, args["colorspace"], "auto", state=tkinter.DISABLED).grid(
|
||||||
row=0, column=1, sticky=tkinter.W
|
row=0, column=1, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
tkinter.Checkbutton(
|
tkinter.Checkbutton(
|
||||||
output_options, text="Suppress timestamp", state=tkinter.DISABLED
|
output_options,
|
||||||
|
text="Suppress timestamp",
|
||||||
|
variable=args["nodate"],
|
||||||
|
state=tkinter.DISABLED,
|
||||||
).grid(row=1, column=0, columnspan=2, sticky=tkinter.W)
|
).grid(row=1, column=0, columnspan=2, sticky=tkinter.W)
|
||||||
tkinter.Checkbutton(
|
tkinter.Checkbutton(
|
||||||
output_options, text="without pdfrw", state=tkinter.DISABLED
|
output_options,
|
||||||
|
text="without pdfrw",
|
||||||
|
variable=args["without_pdfrw"],
|
||||||
|
state=tkinter.DISABLED,
|
||||||
).grid(row=2, column=0, columnspan=2, sticky=tkinter.W)
|
).grid(row=2, column=0, columnspan=2, sticky=tkinter.W)
|
||||||
tkinter.Checkbutton(
|
tkinter.Checkbutton(
|
||||||
output_options, text="only first frame", state=tkinter.DISABLED
|
output_options,
|
||||||
|
text="only first frame",
|
||||||
|
variable=args["first_frame_only"],
|
||||||
|
state=tkinter.DISABLED,
|
||||||
).grid(row=3, column=0, columnspan=2, sticky=tkinter.W)
|
).grid(row=3, column=0, columnspan=2, sticky=tkinter.W)
|
||||||
tkinter.Checkbutton(
|
tkinter.Checkbutton(
|
||||||
output_options, text="force large input", state=tkinter.DISABLED
|
output_options, text="force large input", state=tkinter.DISABLED
|
||||||
).grid(row=4, column=0, columnspan=2, sticky=tkinter.W)
|
).grid(row=4, column=0, columnspan=2, sticky=tkinter.W)
|
||||||
image_size_frame = tkinter.LabelFrame(frame1.interior, text="Image size")
|
image_size_frame = tkinter.LabelFrame(frame1.interior, text="Image size")
|
||||||
image_size_frame.pack(side=tkinter.TOP, expand=tkinter.TRUE, fill=tkinter.X)
|
image_size_frame.pack(side=tkinter.TOP, expand=tkinter.TRUE, fill=tkinter.X)
|
||||||
OptionMenu(image_size_frame, tkinter.StringVar(), [""]).grid(
|
OptionMenu(
|
||||||
row=1, column=0, columnspan=3, sticky=tkinter.W
|
image_size_frame,
|
||||||
)
|
args["imgsize_dropdown"],
|
||||||
|
*(["auto", "custom"] + sorted(papernames.values())),
|
||||||
|
state=tkinter.DISABLED,
|
||||||
|
).grid(row=1, column=0, columnspan=3, sticky=tkinter.W)
|
||||||
|
|
||||||
tkinter.Label(
|
tkinter.Label(
|
||||||
image_size_frame, text="Width:", state=tkinter.DISABLED, name="size_label_width"
|
image_size_frame, text="Width:", state=tkinter.DISABLED, name="size_label_width"
|
||||||
|
@ -2451,9 +2694,12 @@ def gui():
|
||||||
|
|
||||||
page_size_frame = tkinter.LabelFrame(frame1.interior, text="Page size")
|
page_size_frame = tkinter.LabelFrame(frame1.interior, text="Page size")
|
||||||
page_size_frame.pack(side=tkinter.TOP, expand=tkinter.TRUE, fill=tkinter.X)
|
page_size_frame.pack(side=tkinter.TOP, expand=tkinter.TRUE, fill=tkinter.X)
|
||||||
OptionMenu(page_size_frame, tkinter.StringVar(), [""]).grid(
|
OptionMenu(
|
||||||
row=1, column=0, columnspan=3, sticky=tkinter.W
|
page_size_frame,
|
||||||
)
|
args["pagesize_dropdown"],
|
||||||
|
*(["auto", "custom"] + sorted(papernames.values())),
|
||||||
|
state=tkinter.DISABLED,
|
||||||
|
).grid(row=1, column=0, columnspan=3, sticky=tkinter.W)
|
||||||
|
|
||||||
tkinter.Label(
|
tkinter.Label(
|
||||||
page_size_frame, text="Width:", state=tkinter.DISABLED, name="size_label_width"
|
page_size_frame, text="Width:", state=tkinter.DISABLED, name="size_label_width"
|
||||||
|
@ -2502,12 +2748,15 @@ def gui():
|
||||||
tkinter.Label(layout_frame, text="fit", state=tkinter.DISABLED).grid(
|
tkinter.Label(layout_frame, text="fit", state=tkinter.DISABLED).grid(
|
||||||
row=1, column=0, sticky=tkinter.W
|
row=1, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
OptionMenu(layout_frame, tkinter.StringVar(), [""]).grid(
|
OptionMenu(
|
||||||
row=1, column=1, sticky=tkinter.W
|
layout_frame, args["fit"], *[v.name for v in FitMode], state=tkinter.DISABLED
|
||||||
)
|
).grid(row=1, column=1, sticky=tkinter.W)
|
||||||
tkinter.Checkbutton(layout_frame, text="auto orient", state=tkinter.DISABLED).grid(
|
tkinter.Checkbutton(
|
||||||
row=2, column=0, columnspan=2, sticky=tkinter.W
|
layout_frame,
|
||||||
)
|
text="auto orient",
|
||||||
|
state=tkinter.DISABLED,
|
||||||
|
variable=args["auto_orient"],
|
||||||
|
).grid(row=2, column=0, columnspan=2, sticky=tkinter.W)
|
||||||
tkinter.Label(layout_frame, text="crop border", state=tkinter.DISABLED).grid(
|
tkinter.Label(layout_frame, text="crop border", state=tkinter.DISABLED).grid(
|
||||||
row=3, column=0, sticky=tkinter.W
|
row=3, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
|
@ -2537,39 +2786,39 @@ def gui():
|
||||||
tkinter.Label(metadata_frame, text="title", state=tkinter.DISABLED).grid(
|
tkinter.Label(metadata_frame, text="title", state=tkinter.DISABLED).grid(
|
||||||
row=0, column=0, sticky=tkinter.W
|
row=0, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
tkinter.Entry(metadata_frame, state=tkinter.DISABLED).grid(
|
tkinter.Entry(
|
||||||
row=0, column=1, sticky=tkinter.W
|
metadata_frame, textvariable=args["title"], state=tkinter.DISABLED
|
||||||
)
|
).grid(row=0, column=1, sticky=tkinter.W)
|
||||||
tkinter.Label(metadata_frame, text="author", state=tkinter.DISABLED).grid(
|
tkinter.Label(metadata_frame, text="author", state=tkinter.DISABLED).grid(
|
||||||
row=1, column=0, sticky=tkinter.W
|
row=1, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
tkinter.Entry(metadata_frame, state=tkinter.DISABLED).grid(
|
tkinter.Entry(
|
||||||
row=1, column=1, sticky=tkinter.W
|
metadata_frame, textvariable=args["author"], state=tkinter.DISABLED
|
||||||
)
|
).grid(row=1, column=1, sticky=tkinter.W)
|
||||||
tkinter.Label(metadata_frame, text="creator", state=tkinter.DISABLED).grid(
|
tkinter.Label(metadata_frame, text="creator", state=tkinter.DISABLED).grid(
|
||||||
row=2, column=0, sticky=tkinter.W
|
row=2, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
tkinter.Entry(metadata_frame, state=tkinter.DISABLED).grid(
|
tkinter.Entry(
|
||||||
row=2, column=1, sticky=tkinter.W
|
metadata_frame, textvariable=args["creator"], state=tkinter.DISABLED
|
||||||
)
|
).grid(row=2, column=1, sticky=tkinter.W)
|
||||||
tkinter.Label(metadata_frame, text="producer", state=tkinter.DISABLED).grid(
|
tkinter.Label(metadata_frame, text="producer", state=tkinter.DISABLED).grid(
|
||||||
row=3, column=0, sticky=tkinter.W
|
row=3, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
tkinter.Entry(metadata_frame, state=tkinter.DISABLED).grid(
|
tkinter.Entry(
|
||||||
row=3, column=1, sticky=tkinter.W
|
metadata_frame, textvariable=args["producer"], state=tkinter.DISABLED
|
||||||
)
|
).grid(row=3, column=1, sticky=tkinter.W)
|
||||||
tkinter.Label(metadata_frame, text="creation date", state=tkinter.DISABLED).grid(
|
tkinter.Label(metadata_frame, text="creation date", state=tkinter.DISABLED).grid(
|
||||||
row=4, column=0, sticky=tkinter.W
|
row=4, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
tkinter.Entry(metadata_frame, state=tkinter.DISABLED).grid(
|
tkinter.Entry(
|
||||||
row=4, column=1, sticky=tkinter.W
|
metadata_frame, textvariable=args["creationdate"], state=tkinter.DISABLED
|
||||||
)
|
).grid(row=4, column=1, sticky=tkinter.W)
|
||||||
tkinter.Label(
|
tkinter.Label(
|
||||||
metadata_frame, text="modification date", state=tkinter.DISABLED
|
metadata_frame, text="modification date", state=tkinter.DISABLED
|
||||||
).grid(row=5, column=0, sticky=tkinter.W)
|
).grid(row=5, column=0, sticky=tkinter.W)
|
||||||
tkinter.Entry(metadata_frame, state=tkinter.DISABLED).grid(
|
tkinter.Entry(
|
||||||
row=5, column=1, sticky=tkinter.W
|
metadata_frame, textvariable=args["moddate"], state=tkinter.DISABLED
|
||||||
)
|
).grid(row=5, column=1, sticky=tkinter.W)
|
||||||
tkinter.Label(metadata_frame, text="subject", state=tkinter.DISABLED).grid(
|
tkinter.Label(metadata_frame, text="subject", state=tkinter.DISABLED).grid(
|
||||||
row=6, column=0, sticky=tkinter.W
|
row=6, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
|
@ -2587,35 +2836,60 @@ def gui():
|
||||||
tkinter.Label(viewer_frame, text="panes", state=tkinter.DISABLED).grid(
|
tkinter.Label(viewer_frame, text="panes", state=tkinter.DISABLED).grid(
|
||||||
row=0, column=0, sticky=tkinter.W
|
row=0, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
OptionMenu(viewer_frame, tkinter.StringVar(), [""]).grid(
|
OptionMenu(
|
||||||
row=0, column=1, sticky=tkinter.W
|
viewer_frame,
|
||||||
)
|
args["viewer_panes"],
|
||||||
|
*(["auto"] + [v.name for v in PageMode]),
|
||||||
|
state=tkinter.DISABLED,
|
||||||
|
).grid(row=0, column=1, sticky=tkinter.W)
|
||||||
tkinter.Label(viewer_frame, text="initial page", state=tkinter.DISABLED).grid(
|
tkinter.Label(viewer_frame, text="initial page", state=tkinter.DISABLED).grid(
|
||||||
row=1, column=0, sticky=tkinter.W
|
row=1, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
OptionMenu(viewer_frame, tkinter.StringVar(), ["1"]).grid(
|
tkinter.Spinbox(
|
||||||
row=1, column=1, sticky=tkinter.W
|
viewer_frame,
|
||||||
)
|
increment=1,
|
||||||
|
from_=1,
|
||||||
|
to=10000,
|
||||||
|
width=6,
|
||||||
|
textvariable=args["viewer_initial_page"],
|
||||||
|
state=tkinter.DISABLED,
|
||||||
|
name="viewer_initial_page_spinbox",
|
||||||
|
).grid(row=1, column=1, sticky=tkinter.W)
|
||||||
tkinter.Label(viewer_frame, text="magnification", state=tkinter.DISABLED).grid(
|
tkinter.Label(viewer_frame, text="magnification", state=tkinter.DISABLED).grid(
|
||||||
row=2, column=0, sticky=tkinter.W
|
row=2, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
OptionMenu(viewer_frame, tkinter.StringVar(), [""]).grid(
|
OptionMenu(
|
||||||
row=2, column=1, sticky=tkinter.W
|
viewer_frame,
|
||||||
)
|
args["viewer_magnification"],
|
||||||
|
*(["auto", "custom"] + [v.name for v in Magnification]),
|
||||||
|
state=tkinter.DISABLED,
|
||||||
|
).grid(row=2, column=1, sticky=tkinter.W)
|
||||||
tkinter.Label(viewer_frame, text="page layout", state=tkinter.DISABLED).grid(
|
tkinter.Label(viewer_frame, text="page layout", state=tkinter.DISABLED).grid(
|
||||||
row=3, column=0, sticky=tkinter.W
|
row=3, column=0, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
OptionMenu(viewer_frame, tkinter.StringVar(), [""]).grid(
|
OptionMenu(
|
||||||
row=3, column=1, sticky=tkinter.W
|
viewer_frame,
|
||||||
)
|
args["viewer_page_layout"],
|
||||||
|
*(["auto"] + [v.name for v in PageLayout]),
|
||||||
|
state=tkinter.DISABLED,
|
||||||
|
).grid(row=3, column=1, sticky=tkinter.W)
|
||||||
tkinter.Checkbutton(
|
tkinter.Checkbutton(
|
||||||
viewer_frame, text="fit window to page size", state=tkinter.DISABLED
|
viewer_frame,
|
||||||
|
text="fit window to page size",
|
||||||
|
variable=args["viewer_fit_window"],
|
||||||
|
state=tkinter.DISABLED,
|
||||||
).grid(row=4, column=0, columnspan=2, sticky=tkinter.W)
|
).grid(row=4, column=0, columnspan=2, sticky=tkinter.W)
|
||||||
tkinter.Checkbutton(
|
tkinter.Checkbutton(
|
||||||
viewer_frame, text="center window", state=tkinter.DISABLED
|
viewer_frame,
|
||||||
|
text="center window",
|
||||||
|
variable=args["viewer_center_window"],
|
||||||
|
state=tkinter.DISABLED,
|
||||||
).grid(row=5, column=0, columnspan=2, sticky=tkinter.W)
|
).grid(row=5, column=0, columnspan=2, sticky=tkinter.W)
|
||||||
tkinter.Checkbutton(
|
tkinter.Checkbutton(
|
||||||
viewer_frame, text="open in fullscreen", state=tkinter.DISABLED
|
viewer_frame,
|
||||||
|
text="open in fullscreen",
|
||||||
|
variable=args["viewer_fullscreen"],
|
||||||
|
state=tkinter.DISABLED,
|
||||||
).grid(row=6, column=0, columnspan=2, sticky=tkinter.W)
|
).grid(row=6, column=0, columnspan=2, sticky=tkinter.W)
|
||||||
|
|
||||||
option_frame = tkinter.LabelFrame(frame1.interior, text="Program options")
|
option_frame = tkinter.LabelFrame(frame1.interior, text="Program options")
|
||||||
|
@ -2639,8 +2913,14 @@ def gui():
|
||||||
row=1, column=1, sticky=tkinter.W
|
row=1, column=1, sticky=tkinter.W
|
||||||
)
|
)
|
||||||
|
|
||||||
tkinter.Button(app, text="Save PDF", command=on_save_button).pack(
|
bottom_frame = tkinter.Frame(frame_right)
|
||||||
side=tkinter.TOP, expand=tkinter.FALSE, fill=tkinter.X
|
bottom_frame.pack(fill=tkinter.X)
|
||||||
|
|
||||||
|
tkinter.Button(bottom_frame, text="Save PDF", command=on_save_button).pack(
|
||||||
|
side=tkinter.LEFT, expand=tkinter.TRUE, fill=tkinter.X
|
||||||
|
)
|
||||||
|
tkinter.Button(bottom_frame, text="Exit", command=root.destroy).pack(
|
||||||
|
side=tkinter.RIGHT, expand=tkinter.TRUE, fill=tkinter.X
|
||||||
)
|
)
|
||||||
|
|
||||||
app.mainloop()
|
app.mainloop()
|
||||||
|
@ -3172,14 +3452,14 @@ and left/right, respectively. It is not possible to specify asymmetric borders.
|
||||||
if args.pillow_limit_break:
|
if args.pillow_limit_break:
|
||||||
Image.MAX_IMAGE_PIXELS = None
|
Image.MAX_IMAGE_PIXELS = None
|
||||||
|
|
||||||
layout_fun = get_layout_fun(
|
|
||||||
args.pagesize, args.imgsize, args.border, args.fit, args.auto_orient
|
|
||||||
)
|
|
||||||
|
|
||||||
if args.gui:
|
if args.gui:
|
||||||
gui()
|
gui()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
|
layout_fun = get_layout_fun(
|
||||||
|
args.pagesize, args.imgsize, args.border, args.fit, args.auto_orient
|
||||||
|
)
|
||||||
|
|
||||||
# if no positional arguments were supplied, read a single image from
|
# if no positional arguments were supplied, read a single image from
|
||||||
# standard input
|
# standard input
|
||||||
if len(args.images) == 0:
|
if len(args.images) == 0:
|
||||||
|
|
Loading…
Reference in a new issue