self-bound physical books; towards this goal offers various PDF manipulation
options that may also be used indepéndently and for other purposes.
"""
-import argparse
-import io
-import os
-import sys
+from argparse import (
+ ArgumentParser,
+ Namespace as ArgsNamespace,
+ RawDescriptionHelpFormatter
+ )
+from io import BufferedReader, BytesIO
+from os.path import isfile
+from sys import exit as sys_exit
from typing import Any, Optional
) -> None:
'Print msg, then exit(1).'
print(f'ERROR: {msg}')
- sys.exit(1)
+ sys_exit(1)
try:
def parse_args(
- ) -> argparse.Namespace:
+ ) -> ArgsNamespace:
'Collect command line arguments.'
help_epilogue = ('See README.txt for detailed usage instructions, '
'command examples, etc.')
- parser = argparse.ArgumentParser(
+ parser = ArgumentParser(
description=__doc__,
epilog=help_epilogue,
- formatter_class=argparse.RawDescriptionHelpFormatter)
+ formatter_class=RawDescriptionHelpFormatter)
parser.add_argument('-i',
'--input_file',
action='append',
def validate_args_syntax(
- args: argparse.Namespace
+ args: ArgsNamespace
) -> None:
'Check command args against general syntax expectations.'
def args_to_pagelist(
args_input_file: list[str],
args_page_range: list[str]
- ) -> tuple[list[pypdf.PageObject], list[io.BufferedReader]]:
+ ) -> tuple[list[pypdf.PageObject], list[BufferedReader]]:
'Follow args_input_file ranged by args_page_range into pages, open files.'
pages_to_add = []
opened_files = []
new_page_num = 0
for i, filename in enumerate(args_input_file):
- if not os.path.isfile(filename):
+ if not isfile(filename):
raise ArgFail('i', f'{filename} is not a file')
file = open(filename, 'rb')
opened_files += [file]
def validate_ranges(
- args: argparse.Namespace,
+ args: ArgsNamespace,
pages_to_add: list[pypdf.PageObject]
) -> None:
'Check command args\' ranges fit into pages_to_add count.'
'Apply nup4 line guides onto new_page.'
if args_analyze:
# borders
- packet = io.BytesIO()
+ packet = BytesIO()
c = canvas_class(packet, pagesize=A4)
c.setLineWidth(0.1)
c.line(0, A4_HEIGHT, A4_WIDTH, A4_HEIGHT)
x_left_spine_limit = A4_HALF_WIDTH * nup4_geometry.shrink_for_spine
x_right_spine_limit = A4_WIDTH - x_left_spine_limit
if args_analyze or is_front_page:
- packet = io.BytesIO()
+ packet = BytesIO()
c = canvas_class(packet, pagesize=A4)
if args_analyze:
# spine lines