102 lines
2.8 KiB
Python

from typing import Optional
import click
from pyhanko.cli._root import cli_root
from pyhanko.cli.config import CLIConfig
from pyhanko.cli.runtime import DEFAULT_CONFIG_FILE, pyhanko_exception_manager
from pyhanko.cli.utils import _index_page, logger, readable_file
from pyhanko.config.errors import ConfigurationError
from pyhanko.stamp import QRStampStyle, qr_stamp_file, text_stamp_file
__all__ = ['stamp', 'select_style']
_CONFIG_REQUIRED_MSG = (
"Using stamp styles requires a configuration file "
f"({DEFAULT_CONFIG_FILE} by default)."
)
def select_style(ctx: click.Context, style_name: str, url: str):
cli_config: Optional[CLIConfig] = ctx.obj.config
if not cli_config:
if not style_name:
return None
raise click.ClickException(_CONFIG_REQUIRED_MSG)
try:
style = cli_config.get_stamp_style(style_name)
except ConfigurationError as e:
logger.error(e.msg, exc_info=e)
raise click.ClickException(e.msg)
if url and not isinstance(style, QRStampStyle):
raise click.ClickException(
"The --stamp-url parameter is only meaningful for QR stamp styles."
)
elif not url and isinstance(style, QRStampStyle):
raise click.ClickException(
"QR stamp styles require the --stamp-url option."
)
return style
# TODO: text_params support
@cli_root.command(help='stamp PDF files', name='stamp')
@click.argument('infile', type=readable_file)
@click.argument('outfile', type=click.Path(writable=True, dir_okay=False))
@click.argument('x', type=int)
@click.argument('y', type=int)
@click.option(
'--style-name',
help='stamp style name for stamp appearance',
required=False,
type=str,
)
@click.option(
'--page',
help='page on which the stamp should be applied',
required=False,
type=int,
default=1,
show_default=True,
)
@click.option(
'--stamp-url',
help='QR code URL to use in QR stamp style',
required=False,
type=str,
)
@click.pass_context
def stamp(
ctx,
infile: str,
outfile: str,
x: int,
y: int,
style_name: str,
page: int,
stamp_url: str,
):
cli_config: Optional[CLIConfig] = ctx.obj.config
if cli_config is None:
raise click.ClickException(_CONFIG_REQUIRED_MSG)
with pyhanko_exception_manager():
stamp_style = select_style(ctx, style_name, stamp_url)
page_ix = _index_page(page)
if stamp_url:
qr_stamp_file(
infile,
outfile,
stamp_style,
dest_page=page_ix,
x=x,
y=y,
url=stamp_url,
)
else:
text_stamp_file(
infile, outfile, stamp_style, dest_page=page_ix, x=x, y=y
)