Show / Hide Table of Contents
Editar no GitHub

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.

PAdES auto positioning container

O código abaixo exemplifica como definir estes parâmetros em um container.

const 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.

PAdES auto positioning rectangle

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
const signature = {
    height: 3.0,
    width: 7.0
};

// Definindo o container do Texto
const textContainer = {
    left: 0,
    right: 1.5,
    bottom: 0,
    top: 0
};

// Definindo imagem de fundo
const 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', 'left'
    horizontalAlign: 'right',
    // Define imagem alinhada verticalmente centralizada no
    // retângulo da representação visual. Valores 
    // possíveis: 'top', 'center', '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.

PAdES auto positioning result

Exemplo completo com posicionamento automático

const signer = new PadesSigner();
await signer.setPkcs12FromRaw(cert);
await signer.certPassword = 'password';
await signer.setPdfToSignFromRaw(pdfBytes);
signer.signaturePolicy = StandardSignaturePolicies.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
await signer.addFileReference('stamp', getPdfStampPath());

// Criando objeto de representação visual
const 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/nodejs/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.
        // Valores possíveis: 'right' e 'left'
        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
await signer.setVisualRepresentation(visual);

// Gera o nome do arquivo PDF assinado com representação
// visual
const signedPdf = `${uuidv4()}.pdf`;
signer.outputFile = signedPdf;
// Assina o documento e insere a representação visual
await signer.sign(false);

A execução do exemplo acima produz o seguinte resultado na assinatura de um PDF:

PAdES auto positioning sample

Back to top Copyright © 2015-2020 Lacuna Software