Browse Source

Fix(Assinatura): Usar stamp_style customizado nas assinaturas subsequentes

Assinaturas após a primeira usavam a aparência padrão do pyhanko
em vez do template customizado da página de autenticação. Agora
usa PdfSigner com TextStampStyle para manter o visual consistente.
pull/3858/head
rangelbruno 6 months ago
parent
commit
bd22cd7620
  1. 56
      sapl/materia/views_assinatura.py

56
sapl/materia/views_assinatura.py

@ -266,6 +266,34 @@ def _gerar_pagina_autenticacao(assinaturas_info, codigo, url_verificacao,
return buf.read() return buf.read()
def _criar_stamp_style(nome_assinante, cargo):
"""
Cria um TextStampStyle customizado para assinaturas subsequentes,
mantendo visual consistente com a página de autenticação gerada
na primeira assinatura.
"""
from pyhanko.stamp import TextStampStyle, TextBoxStyle
# Monta texto do carimbo com cargo (se houver)
linhas = ['Assinado digitalmente por', '%(signer)s']
if cargo:
linhas.append(cargo)
linhas.append('Data: %(ts)s')
return TextStampStyle(
stamp_text='\n'.join(linhas),
text_box_style=TextBoxStyle(
font_size=7,
leading=10,
border_width=1,
),
border_width=1,
background=None,
background_opacity=0,
timestamp_format='%d/%m/%Y %H:%M',
)
def _obter_info_assinante(request, cert_info): def _obter_info_assinante(request, cert_info):
""" """
Obtém informações do assinante (nome, cargo, tipo_cert). Obtém informações do assinante (nome, cargo, tipo_cert).
@ -674,6 +702,7 @@ def materia_assinar_a1(request, pk):
# Determina a última página # Determina a última página
from pyhanko.pdf_utils.reader import PdfFileReader as PyhankoReader from pyhanko.pdf_utils.reader import PdfFileReader as PyhankoReader
from pyhanko.sign.signers.pdf_signer import PdfSigner
temp_reader = PyhankoReader(io.BytesIO(existing_pdf_bytes)) temp_reader = PyhankoReader(io.BytesIO(existing_pdf_bytes))
last_page_idx = temp_reader.root['/Pages']['/Count'] - 1 last_page_idx = temp_reader.root['/Pages']['/Count'] - 1
@ -692,12 +721,19 @@ def materia_assinar_a1(request, pk):
name=nome_assinante name=nome_assinante
) )
signers.sign_pdf( # Usa PdfSigner com stamp_style customizado para
w, # manter visual consistente com a página de autenticação
stamp_style = _criar_stamp_style(nome_assinante, cargo)
pdf_signer = PdfSigner(
meta, meta,
signer=signer, signer=signer,
stamp_style=stamp_style,
)
pdf_signer.sign_pdf(
w,
existing_fields_only=True,
appearance_text_params={'signer': nome_assinante},
output=signed_buffer, output=signed_buffer,
existing_fields_only=True
) )
signed_buffer.seek(0) signed_buffer.seek(0)
@ -1279,6 +1315,7 @@ def docacessorio_assinar_a1(request, pk):
w = IncrementalPdfFileWriter(inf) w = IncrementalPdfFileWriter(inf)
from pyhanko.pdf_utils.reader import PdfFileReader as PyhankoReader from pyhanko.pdf_utils.reader import PdfFileReader as PyhankoReader
from pyhanko.sign.signers.pdf_signer import PdfSigner
temp_reader = PyhankoReader(io.BytesIO(existing_pdf_bytes)) temp_reader = PyhankoReader(io.BytesIO(existing_pdf_bytes))
last_page_idx = temp_reader.root['/Pages']['/Count'] - 1 last_page_idx = temp_reader.root['/Pages']['/Count'] - 1
@ -1296,12 +1333,19 @@ def docacessorio_assinar_a1(request, pk):
name=nome_assinante name=nome_assinante
) )
signers.sign_pdf( # Usa PdfSigner com stamp_style customizado para
w, # manter visual consistente com a página de autenticação
stamp_style = _criar_stamp_style(nome_assinante, cargo)
pdf_signer = PdfSigner(
meta, meta,
signer=signer, signer=signer,
stamp_style=stamp_style,
)
pdf_signer.sign_pdf(
w,
existing_fields_only=True,
appearance_text_params={'signer': nome_assinante},
output=signed_buffer, output=signed_buffer,
existing_fields_only=True
) )
signed_buffer.seek(0) signed_buffer.seek(0)

Loading…
Cancel
Save