68 lines
2.1 KiB
Python

import click
from pyhanko.cli.commands.signing import signing
from pyhanko.cli.runtime import pyhanko_exception_manager
from pyhanko.cli.utils import parse_field_location_spec
from pyhanko.pdf_utils.incremental_writer import IncrementalPdfFileWriter
from pyhanko.pdf_utils.reader import PdfFileReader
from pyhanko.pdf_utils.writer import copy_into_new_writer
from pyhanko.sign import fields
__all__ = ['list_sigfields', 'add_sig_field']
@signing.command(name='list', help='list signature fields')
@click.argument('infile', type=click.File('rb'))
@click.option(
'--skip-status',
help='do not print status',
required=False,
type=bool,
is_flag=True,
default=False,
show_default=True,
)
def list_sigfields(infile, skip_status):
with pyhanko_exception_manager():
r = PdfFileReader(infile, strict=False)
field_info = fields.enumerate_sig_fields(r)
for ix, (name, value, field_ref) in enumerate(field_info):
if skip_status:
click.echo(name)
continue
click.echo(f"{name}:{'EMPTY' if value is None else 'FILLED'}")
@signing.command(
name='addfields', help='add empty signature fields to a PDF field'
)
@click.argument('infile', type=click.File('rb'))
@click.argument('outfile', type=click.File('wb'))
@click.option(
'--field',
metavar='PAGE/X1,Y1,X2,Y2/NAME',
multiple=True,
required=True,
help="Field specification (multiple allowed)",
)
@click.option(
'--resave',
is_flag=True,
help="Resave the PDF document instead of creating an incremental update",
)
def add_sig_field(infile, outfile, field, resave):
with pyhanko_exception_manager():
if resave:
writer = copy_into_new_writer(PdfFileReader(infile, strict=False))
else:
writer = IncrementalPdfFileWriter(infile, strict=False)
for s in field:
name, spec = parse_field_location_spec(s)
assert spec is not None
fields.append_signature_field(writer, spec)
writer.write(outfile)
infile.close()
outfile.close()