Exemplos completos
Exemplo completo com posicionamento automático
Criaremos um posicionamento automático customizado que será aplicado na última página do documento.
O container de inclusão, região na qual as representações visuais das assinaturas serão organizadas automaticamente, será definido seguindo o modelo representado na imagem abaixo.

O código abaixo exemplifica como definir estes parâmetros em um container.
container = {
'left': 3.00,
'right': 3.00,
'bottom': 2.00,
'top': 8.00
}
Para mais informações de como definir um Container, veja o artigo Definindo um container
Cada assinatura incluída terá sua representação visual seguindo os parâmetros do retângulo de assinatura, texto e imagem seguindo o modelo representado pela imagem abaixo.

O retângulo externo da assinatura tera 3cm x 7cm. Será incluído um brasão de imagem de fundo alinhada à direita no retângulo de assinatura. O container do texto terá uma margem direita de 1.50cm em relação ao retângulo externo, impedindo, para este exemplo, que o texto fique por cima da imagem. O código abaixo demonstra como definir estes parâmetros.
# Definindo retângulo de assinatura
signature = {
'height': 3.0,
'width': 7.0
}
# Definindo o container do Texto
textContainer = {
'left': 0,
'right': 1.5,
'bottom': 0,
'top': 0
}
# Definindo imagem de fundo
image = {
'resource': {
# Bytes da imagem a ser inserida
'content': getPdfStampContent()
},
# Define imagem alinhada à direita no retângulo da
# representação visual. Valores possíveis: 'right',
# 'center' e 'left'.
'horizontalAlign': = 'right',
# Define imagem alinhada verticalmente centralizada no # retângulo da representação visual. Valores
# possíveis: 'top', 'center' e 'bottom'.
'verticalAlign': 'center',
}
À medida que as assinaturas forem sendo realizadas, o resultado esperado para as representações visuais incluídas automaticamente é o apresentado na imagem abaixo.

Exemplo completo com posicionamento automático
signer = PadesSigner()
signer.set_pkcs12_from_path(cert_path)
signer.cert_password = 'password'
signer.set_pdf_to_sign_from_raw(pdf_bytes)
signer.signature_policy = standard_signature_policies.PADES_BASIC_WITH_LTV
# Cria uma referencia para o arquivo stamp. E posteriormente esse arquivo pode ser
# referenciado como "fref://{alias}" no campo "url" da representação visual
signer.add_file_reference('stamp', get_pdf_stamp_path())
# Criando objeto de representação visual
visual = {
'position': {
'pageNumber': -1,
# Define a unidade das medidas fornecidas como
# centímetros (unidade padrão). Valores possíveis:
# 'centimeters' e 'pdfPoints'.
'measurementUnits': 'centimeters',
# Define posicionamento automático
'auto': {
# Define o container para posicionamento das
# representações visuais
'container': {
'left': 3.00,
'right': 3.00,
'bottom': 2.00,
'top': 8.00
},
# Define o retângulo da representação visual
'signatureRectangleSize': {
'height': 3.0,
'width': 7.0,
},
# Define o espaçamento entre linhas de
# representações visuais
'rowSpacing': 1.0,
# Define que as representações serão
# posicionadas da esquerda para direita
# (comportamento padrão). Valores possíveis:
# 'leftToRight' e 'rightToLeft'.
'horizontalDirection': 'leftToRight',
# Define que as representações serão
# posicionadas de cima para baixo
# (comportamento padrão). Valores possíveis:
# 'topDown' e 'BottomUp'.
'verticalDirection': 'topDown',
},
},
'text': { # Texto da representação visual
# Define o texto a ser inserido. Para ver a lista
# completa de tags suportadas, veja:
# https://docs.lacunasoftware.com/articles/pki-express/python/visual-rep/index.html#pades-tags
'text': 'Signed by {{name}} ({{national_id}})',
# Define o tamanho da fonte do texto.
'fontSize': 13.0,
# Define que o horário da assinatura também seja
# renderizado.
'includeSigningTime': True,
# Define texto alinhado à direita no container.
'horizontalAlign': 'right',
# Opicional. Define o container retangular dentro
# da representação da assinatura onde o texto será
# inserido. Por padrão, o texto pode ocupar todo o
# retângulo da representação (o quanto será de
# fato preenchido depende do comprimento do texto
# e do tamanho da fonte).
'container': {
'left': 0,
'top': 0,
'right': 1.5,
'bottom': 0,
},
},
'image': { # Imagem da representação visual
'resource': {
# Referência para a imagem a ser inserida.
'url': 'fref://stamp',
},
# Define imagem alinhada à direita no retângulo da
# representação visual. Valores possíveis:
# 'right', 'center' e 'left'
'horizontalAlign': 'right',
# Define imagem centralizada verticalmente no
# retângulo da representação visual. Valores
# possíveis: 'top', 'center' e 'bottom'
'verticalAlign': 'center',
}
}
# Define representação visual na assinatura
signer.set_visual_representation(visual)
# Gera o nome do arquivo PDF assinado com representação
# visual
signed_pdf = '%s.pdf' % (str(uuid.uuid4()))
signer.output_file = signed_pdf
# Assina o documento e insere a representação visual
signer.sign(False)
A execução do exemplo acima produz o seguinte resultado na assinatura de um PDF':
