UNPKG

gerar-boletos-pdfkit

Version:
1,578 lines (1,405 loc) 74.5 kB
'use strict'; const path = require('path'); const Pdf = require('pdfkit'); const { Base64Encode } = require('base64-stream'); const QRCode = require('qrcode'); const utils = require('../utils/utils'); const gerarLinhaDigitavel = require('./gerador-de-linha-digitavel'); const diretorioDeFontes = path.join(__dirname, '/fontes'); const timesNewRoman = path.join(diretorioDeFontes, 'Times New Roman.ttf'); const timesNewRomanNegrito = path.join( diretorioDeFontes, 'Times New Roman Bold.ttf' ); const timesNewRomanItalico = path.join( diretorioDeFontes, 'Times New Roman Italic.ttf' ); const timesNewRomanNegritoItalico = path.join( diretorioDeFontes, 'Times New Roman Bold Italic.ttf' ); const code25I = path.join(diretorioDeFontes, 'Code25I.ttf'); const pdfDefaults = { ajusteY: -80, ajusteX: 0, autor: '', titulo: '', criador: '', tamanhoDaFonteDoTitulo: 8, tamanhoDaFonte: 10, tamanhoDaLinhaDigitavel: 14, tamanhoDoCodigoDeBarras: 32, imprimirSequenciaDoBoleto: true, corDoLayout: 'black', alturaDaPagina: 600, larguraDaPagina: 844.68, exibirCampoUnidadeBeneficiaria: false, template: path.join(__dirname, '/templates/template.pdf'), informacoesPersonalizadas: function (pdf, x, y) {}, }; async function generateQRCode(text) { try { return await QRCode.toDataURL(text); // Gera o QR Code em base64 } catch (err) { console.error('Erro ao gerar o QR Code:', err); } } function formatCpfCnpj(cpfCnpj) { if (cpfCnpj.length === 11) { return cpfCnpj.replace(/(\d{3})(\d{3})(\d{3})(\d{2})/, '$1.$2.$3-$4'); } else return false; } class GeradorDeBoleto { constructor(boletos) { if (!Array.isArray(boletos)) { boletos = [boletos]; } this._boletos = boletos; } gerarPDF(args) { return new Promise(async (resolve) => { if (typeof args === 'function') { args = pdfDefaults; } args = utils.merge(pdfDefaults, args); const boletos = this._boletos; const informacoesPersonalizadas = args.informacoesPersonalizadas; const pdf = new Pdf({ size: [args.alturaDaPagina, args.larguraDaPagina], info: { Author: args.autor, Title: args.titulo, Creator: args.criador, }, }); if (args.stream) { pdf.pipe(args.stream); } pdf.registerFont('normal', timesNewRoman); pdf.registerFont('negrito', timesNewRomanNegrito); pdf.registerFont('italico', timesNewRomanItalico); pdf.registerFont('negrito-italico', timesNewRomanNegritoItalico); pdf.registerFont('codigoDeBarras', code25I); for (const [indice, boleto] of boletos.entries()) { // DESENHAR LAYOUT const banco = boleto.getBanco(); const pagador = boleto.getPagador(); const beneficiario = boleto.getBeneficiario(); //var enderecoDoBeneficiario = beneficiario.getEndereco(); const datas = boleto.getDatas(); const ESPACO_ENTRE_LINHAS = 23; if (boleto._qrCode) { //var zeroLinha = 220; var zeroLinha = 190; } else { zeroLinha = 120; } var linha1 = zeroLinha + 45; pdf .moveTo(args.ajusteX + 27, args.ajusteY + linha1) .lineTo(args.ajusteX + 572, args.ajusteY + linha1) .stroke(args.corDoLayout); var linha2 = linha1 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + 27, args.ajusteY + linha2) .lineTo(args.ajusteX + 572, args.ajusteY + linha2) .stroke(args.corDoLayout); var linha3 = linha2 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + 27, args.ajusteY + linha3) .lineTo( args.ajusteX + (banco.exibirReciboDoPagadorCompleto ? 572 : 329), args.ajusteY + linha3 ) .stroke(args.corDoLayout); if (banco.exibirReciboDoPagadorCompleto) { var linha4Opcional = linha3 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + 27, args.ajusteY + linha4Opcional) .lineTo(args.ajusteX + 572, args.ajusteY + linha4Opcional) .stroke(args.corDoLayout); } var linha5 = linha4Opcional + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + 27, args.ajusteY + linha5) .lineTo( args.ajusteX + (banco.exibirReciboDoPagadorCompleto ? 572 : 329), args.ajusteY + linha5 ) .stroke(args.corDoLayout); var linhaTeste = linha5 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + 434, args.ajusteY + linhaTeste) .lineTo(args.ajusteX + 572, args.ajusteY + linhaTeste) .stroke(args.corDoLayout); var linha6 = linhaTeste + 90; pdf .moveTo(args.ajusteX + 27, args.ajusteY + linha6) .lineTo(args.ajusteX + 572, args.ajusteY + linha6) .stroke(args.corDoLayout); var linha7 = linha6 + 50; pdf .moveTo(args.ajusteX + 27, args.ajusteY + linha7) .lineTo(args.ajusteX + 572, args.ajusteY + linha7) .stroke(args.corDoLayout); var linhaLateral1 = linhaTeste + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + 434, args.ajusteY + linhaLateral1) .lineTo(args.ajusteX + 571, args.ajusteY + linhaLateral1) .stroke(args.corDoLayout); var linhaLateral2 = linhaLateral1 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + 434, args.ajusteY + linhaLateral2) .lineTo(args.ajusteX + 571, args.ajusteY + linhaLateral2) .stroke(args.corDoLayout); var linhaLateral3 = linhaLateral2 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + 434, args.ajusteY + linhaLateral3) .lineTo(args.ajusteX + 571, args.ajusteY + linhaLateral3) .stroke(args.corDoLayout); var coluna1 = 27; pdf .moveTo(args.ajusteX + coluna1, args.ajusteY + linha1 - 0.5) .lineTo(args.ajusteX + coluna1, args.ajusteY + linha7) .stroke(args.corDoLayout); var coluna5 = 572; pdf .moveTo(args.ajusteX + coluna5, args.ajusteY + linha1 - 0.5) .lineTo(args.ajusteX + coluna5, args.ajusteY + linha7) .stroke(args.corDoLayout); var colunaLateralLayout1 = 434; pdf .moveTo(args.ajusteX + colunaLateralLayout1, args.ajusteY + linha1) .lineTo(args.ajusteX + colunaLateralLayout1, args.ajusteY + linha6) .stroke(args.corDoLayout); var coluna001 = 93.5; pdf .moveTo(args.ajusteX + coluna001, args.ajusteY + linha3) .lineTo(args.ajusteX + coluna001, args.ajusteY + linha4Opcional) .stroke(args.corDoLayout); var coluna002 = coluna001 + 92.5; pdf .moveTo(args.ajusteX + coluna002, args.ajusteY + linha3) .lineTo(args.ajusteX + coluna002, args.ajusteY + linha4Opcional) .stroke(args.corDoLayout); var coluna003 = coluna002 + 84.5; pdf .moveTo(args.ajusteX + coluna003, args.ajusteY + linha3) .lineTo(args.ajusteX + coluna003, args.ajusteY + linha4Opcional) .stroke(args.corDoLayout); var coluna004 = coluna003 + 61; pdf .moveTo(args.ajusteX + coluna004, args.ajusteY + linha3) .lineTo(args.ajusteX + coluna004, args.ajusteY + linha4Opcional) .stroke(args.corDoLayout); var coluna24 = 93.5; pdf .moveTo(args.ajusteX + coluna24, args.ajusteY + linha4Opcional) .lineTo(args.ajusteX + coluna24, args.ajusteY + linha5) .stroke(args.corDoLayout); if (banco.exibirCampoCip) { pdf .moveTo(args.ajusteX + coluna24, args.ajusteY + linha4Opcional) .lineTo(args.ajusteX + coluna24, args.ajusteY + linha5) .stroke(args.corDoLayout); } var coluna281 = 26 + 106; pdf .moveTo(args.ajusteX + coluna281, args.ajusteY + linha4Opcional) .lineTo(args.ajusteX + coluna281, args.ajusteY + linha5) .stroke(args.corDoLayout); var coluna291 = coluna281 + 76.5; pdf .moveTo(args.ajusteX + coluna291, args.ajusteY + linha4Opcional) .lineTo(args.ajusteX + coluna291, args.ajusteY + linha5) .stroke(args.corDoLayout); var coluna2101 = coluna291 + 77; pdf .moveTo(args.ajusteX + coluna2101, args.ajusteY + linha4Opcional) .lineTo(args.ajusteX + coluna2101, args.ajusteY + linha5) .stroke(args.corDoLayout); var coluna2111 = coluna2101 + 92; pdf .moveTo(args.ajusteX + coluna2111, args.ajusteY + linha4Opcional) .lineTo(args.ajusteX + coluna2111, args.ajusteY + linha5) .stroke(args.corDoLayout); var colunaSuperior = 154; pdf .moveTo(args.ajusteX + colunaSuperior, args.ajusteY + linha1 - 25) .lineTo(args.ajusteX + colunaSuperior, args.ajusteY + linha1) .stroke(args.corDoLayout); var colunaSuperior2 = colunaSuperior + 41.5; pdf .moveTo(args.ajusteX + colunaSuperior2, args.ajusteY + linha1 - 25) .lineTo(args.ajusteX + colunaSuperior2, args.ajusteY + linha1) .stroke(args.corDoLayout); ////////////////// var margemDaLinhaSeparadora = 16, divisoresVerticais = linha7 + 2 * margemDaLinhaSeparadora - 4, margemDoSegundoBloco = 30, margemDoSegundoBlocoLayout = margemDoSegundoBloco - 4, alturaDoLogotipoDoBanco = 20; var linha21 = divisoresVerticais + alturaDoLogotipoDoBanco + 4; pdf .moveTo( args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha21 ) .lineTo(args.ajusteX + 571, args.ajusteY + linha21) .stroke(args.corDoLayout); var linha22 = linha21 + ESPACO_ENTRE_LINHAS + 8; pdf .moveTo( args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha22 ) .lineTo(args.ajusteX + 571, args.ajusteY + linha22) .stroke(args.corDoLayout); var linha23 = linha22 + ESPACO_ENTRE_LINHAS; pdf .moveTo( args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha23 ) .lineTo(args.ajusteX + 571, args.ajusteY + linha23) .stroke(args.corDoLayout); var linha24 = linha23 + ESPACO_ENTRE_LINHAS; pdf .moveTo( args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha24 ) .lineTo(args.ajusteX + 571, args.ajusteY + linha24) .stroke(args.corDoLayout); var linha25 = linha24 + ESPACO_ENTRE_LINHAS; pdf .moveTo( args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha25 ) .lineTo(args.ajusteX + 571, args.ajusteY + linha25) .stroke(args.corDoLayout); var camposLaterais = 434, linha26 = linha25 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + camposLaterais, args.ajusteY + linha26) .lineTo(args.ajusteX + 571, args.ajusteY + linha26) .stroke(args.corDoLayout); var linha27 = linha26 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + camposLaterais, args.ajusteY + linha27) .lineTo(args.ajusteX + 571, args.ajusteY + linha27) .stroke(args.corDoLayout); var linha28 = linha27 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + camposLaterais, args.ajusteY + linha28) .lineTo(args.ajusteX + 571, args.ajusteY + linha28) .stroke(args.corDoLayout); if (args.exibirCampoUnidadeBeneficiaria) { var linha28_2 = linha28 + 12.4; pdf .moveTo( args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha28_2 ) .lineTo(args.ajusteX + camposLaterais, args.ajusteY + linha28_2) .stroke(args.corDoLayout); } var linha29 = linha28 + ESPACO_ENTRE_LINHAS; pdf .moveTo(args.ajusteX + camposLaterais, args.ajusteY + linha29) .lineTo(args.ajusteX + 571, args.ajusteY + linha29) .stroke(args.corDoLayout); var linha211 = linha29 + ESPACO_ENTRE_LINHAS + 0.4; pdf .moveTo( args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha211 ) .lineTo(args.ajusteX + 571, args.ajusteY + linha211) .stroke(args.corDoLayout); var linha212 = linha211 + 56.6; pdf .moveTo( args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha212 ) .lineTo(args.ajusteX + 571, args.ajusteY + linha212) .stroke(args.corDoLayout); var coluna21 = margemDoSegundoBlocoLayout + 0.5; pdf .moveTo(args.ajusteX + coluna21, args.ajusteY + linha21) .lineTo(args.ajusteX + coluna21, args.ajusteY + linha212) .stroke(args.corDoLayout); var coluna22 = 571 - 0.5; pdf .moveTo(args.ajusteX + coluna22, args.ajusteY + linha21) .lineTo(args.ajusteX + coluna22, args.ajusteY + linha212) .stroke(args.corDoLayout); var coluna23 = camposLaterais; pdf .moveTo(args.ajusteX + coluna23, args.ajusteY + linha21) .lineTo(args.ajusteX + coluna23, args.ajusteY + linha211) .stroke(args.corDoLayout); var coluna24 = 93.5; pdf .moveTo(args.ajusteX + coluna24, args.ajusteY + linha23) .lineTo(args.ajusteX + coluna24, args.ajusteY + linha24) .stroke(args.corDoLayout); if (banco.exibirCampoCip) { pdf .moveTo(args.ajusteX + coluna24, args.ajusteY + linha24) .lineTo(args.ajusteX + coluna24, args.ajusteY + linha25) .stroke(args.corDoLayout); } var coluna25 = coluna24 + 92.5; pdf .moveTo(args.ajusteX + coluna25, args.ajusteY + linha23) .lineTo(args.ajusteX + coluna25, args.ajusteY + linha24) .stroke(args.corDoLayout); var coluna26 = coluna25 + 84.5; pdf .moveTo(args.ajusteX + coluna26, args.ajusteY + linha23) .lineTo(args.ajusteX + coluna26, args.ajusteY + linha24) .stroke(args.corDoLayout); var coluna27 = coluna26 + 61; pdf .moveTo(args.ajusteX + coluna27, args.ajusteY + linha23) .lineTo(args.ajusteX + coluna27, args.ajusteY + linha24) .stroke(args.corDoLayout); var coluna28 = margemDoSegundoBlocoLayout + 106; pdf .moveTo(args.ajusteX + coluna28, args.ajusteY + linha24) .lineTo(args.ajusteX + coluna28, args.ajusteY + linha25) .stroke(args.corDoLayout); var coluna29 = coluna28 + 76.5; pdf .moveTo(args.ajusteX + coluna29, args.ajusteY + linha24) .lineTo(args.ajusteX + coluna29, args.ajusteY + linha25) .stroke(args.corDoLayout); var coluna210 = coluna29 + 77; pdf .moveTo(args.ajusteX + coluna210, args.ajusteY + linha24) .lineTo(args.ajusteX + coluna210, args.ajusteY + linha25) .stroke(args.corDoLayout); var coluna211 = coluna210 + 92; pdf .moveTo(args.ajusteX + coluna211, args.ajusteY + linha24) .lineTo(args.ajusteX + coluna211, args.ajusteY + linha25) .stroke(args.corDoLayout); var coluna212 = 154; pdf .moveTo(args.ajusteX + coluna212, args.ajusteY + divisoresVerticais) .lineTo(args.ajusteX + coluna212, args.ajusteY + linha21) .stroke(args.corDoLayout); var coluna213 = coluna212 + 1; pdf .moveTo(args.ajusteX + coluna213, args.ajusteY + divisoresVerticais) .lineTo(args.ajusteX + coluna213, args.ajusteY + linha21) .stroke(args.corDoLayout); var coluna214 = coluna213 + 1; pdf .moveTo(args.ajusteX + coluna214, args.ajusteY + divisoresVerticais) .lineTo(args.ajusteX + coluna214, args.ajusteY + linha21) .stroke(args.corDoLayout); var coluna215 = coluna214 + 41.5; pdf .moveTo(args.ajusteX + coluna215, args.ajusteY + divisoresVerticais) .lineTo(args.ajusteX + coluna215, args.ajusteY + linha21) .stroke(args.corDoLayout); var coluna216 = coluna215 + 1; pdf .moveTo(args.ajusteX + coluna216, args.ajusteY + divisoresVerticais) .lineTo(args.ajusteX + coluna216, args.ajusteY + linha21) .stroke(args.corDoLayout); var coluna217 = coluna216 + 1; pdf .moveTo(args.ajusteX + coluna217, args.ajusteY + divisoresVerticais) .lineTo(args.ajusteX + coluna217, args.ajusteY + linha21) .stroke(args.corDoLayout); var linhaSeparadora = linha7 + margemDaLinhaSeparadora; pdf .moveTo(args.ajusteX + 27, args.ajusteY + linhaSeparadora) .lineTo(args.ajusteX + 572, args.ajusteY + linhaSeparadora) .dash(3, { space: 5 }) .stroke(args.corDoLayout); var caminhoParaTesoura = path.join(__dirname, 'imagens/tesoura128.png'); pdf.image( caminhoParaTesoura, args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linhaSeparadora - 3.2, { width: 10, } ); /// IMPRIMIR LAYOUT var titulos = utils.merge( { instrucoes: 'Instruções', informativo: 'INFORMATIVO', dataDocumento: 'Data Documento', nomeDoPagador: 'Nome do Cliente', agenciaECodigoDoBeneficiario: 'Agência / Código do Beneficiário', nossoNumero: 'Nosso Número', especie: 'Espécie', especieDoDocumento: 'Espécie Doc.', quantidade: 'Quantidade', numeroDoDocumento: 'Nº do Documento', dataDeProcessamento: 'Data Processamento', valorDoDocumento: 'Valor do Documento', valor: 'Valor', carteira: 'Carteira', moraMulta: '(+) Mora / Multa / Juros', localDoPagamento: 'Local do Pagamento', igualDoValorDoDocumento: '(=) ', }, banco.titulos || {} ); args.creditos && pdf .font('italico') .fontSize(8) .text(args.creditos, args.ajusteX + 3, args.ajusteY + 90, { width: 560, align: 'center', }); // PIX CODE if (boleto._qrCode) { var pixQrCode = boleto._qrCode; var pixLinha0 = 95; var qrCodeBase64 = await generateQRCode(pixQrCode); var qrCodeBuffer = Buffer.from( qrCodeBase64.replace(/^data:image\/png;base64,/, ''), 'base64' ); pdf.image( qrCodeBuffer, args.ajusteX + 480, args.ajusteY + pixLinha0, { width: 90, } ); pdf .font('negrito') .fontSize(10) .text( titulos.informativo, args.ajusteX + 250, args.ajusteY + pixLinha0, { lineBreak: false, width: 294, align: 'left', } ); var instrucaoY = pixLinha0 + 12; boleto.getInformativo().forEach(function (informativo, indice) { pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( informativo, args.ajusteX + margemDoSegundoBloco, args.ajusteY + instrucaoY + indice * args.tamanhoDaFonte, { lineBreak: false, width: 400, align: 'left', } ); }); pdf .fontSize(10) .text( 'Pague agora via PIX, basta acessar o aplicativo de sua instituição financeira', args.ajusteX + 30, args.ajusteY + pixLinha0 + 66, { lineBreak: false, width: 350, align: 'left', } ); pdf .font('negrito') .fontSize(10) .text( 'PIX copia e cola', args.ajusteX + 30, args.ajusteY + pixLinha0 + 75, { lineBreak: false, width: 294, align: 'left', } ); // Fundo cinza pdf .rect(args.ajusteX + 27, args.ajusteY + pixLinha0 + 88, 545, 23) .fill('#DFDFDF'); // Texto do copia e cola pdf .font('negrito') .fontSize(6) .fillColor('black') .text(pixQrCode, args.ajusteX + 32, args.ajusteY + pixLinha0 + 90, { lineBreak: false, width: 500, align: 'left', }); var pixMarginX = args.ajusteX + 27; var pixMarginY = args.ajusteY + pixLinha0 - 10; var pixWidth = 545; var pixHeight = 120; // Margem ao redor da sessão pix pdf .rect(pixMarginX, pixMarginY, pixWidth, pixHeight) .undash() .stroke(); } const segundaLinha3 = linha1 - 20.25; pdf.image( banco.getImagem(), args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + segundaLinha3 - 5, { height: alturaDoLogotipoDoBanco, } ); pdf .font('negrito') .fontSize(args.tamanhoDaLinhaDigitavel) .text( 'Recibo do Pagador', args.ajusteX + margemDoSegundoBlocoLayout + 145, args.ajusteY + segundaLinha3, { lineBreak: false, width: 400, align: 'right', } ); pdf .font('negrito') .fontSize(args.tamanhoDaLinhaDigitavel) .text( banco.getNumeroFormatadoComDigito(), args.ajusteX + margemDoSegundoBlocoLayout + 131, args.ajusteY + linha1 - 20.25, { lineBreak: false, width: 39.8, align: 'center', } ); var primeiraLinha = linha1 + 9, diferencaEntreTituloEValor = 10, tituloDaPrimeiraLinha = primeiraLinha - diferencaEntreTituloEValor, colunaLateralLinhaSuperior = 440; var tituloLocalDoPagamento = margemDoSegundoBloco; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.localDoPagamento, args.ajusteX + margemDoSegundoBloco, args.ajusteY + primeiraLinha - 7, { lineBreak: false, width: 294, align: 'left', } ); boleto .getLocaisDePagamento() .forEach(function (localDePagamento, indice) { if (indice > 1) { return; } pdf .font('normal') .fontSize(args.tamanhoDaFonteDoTitulo + 2) .text( localDePagamento, args.ajusteX + margemDoSegundoBloco, args.ajusteY + primeiraLinha + 2, { lineBreak: false, width: 400, align: 'left', } ); }); const LinhaBaseBloco1 = linha2 - 20.25; var linhaSuperiorLayout1 = LinhaBaseBloco1 + 9, tituloDaTerceiraLinha = linhaSuperiorLayout1 - diferencaEntreTituloEValor, tituloDaTerceiraLinhaLateral1 = linhaSuperiorLayout1 - diferencaEntreTituloEValor, colunaLateral = 440; var tamanhoDasCelulasADireita = 124.5; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( 'Vencimento', args.ajusteX + colunaLateralLinhaSuperior, args.ajusteY + tituloDaTerceiraLinhaLateral1, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( datas.getVencimentoFormatado(), args.ajusteX + colunaLateralLinhaSuperior, args.ajusteY + linhaSuperiorLayout1, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right', } ); var primeiraLinhaOpcional = primeiraLinha + ESPACO_ENTRE_LINHAS, tituloDaPrimeiraLinhaOpcional = primeiraLinhaOpcional - diferencaEntreTituloEValor; var quartaLinha1 = LinhaBaseBloco1 + 30, tituloDaQuartaLinhaLateral1 = quartaLinha1 - diferencaEntreTituloEValor; var tituloBeneficiario = margemDoSegundoBloco; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( 'Beneficiário', args.ajusteX + tituloBeneficiario, args.ajusteY + tituloDaQuartaLinhaLateral1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( beneficiario.getIdentificacao(), args.ajusteX + margemDoSegundoBloco, args.ajusteY + quartaLinha1, { lineBreak: false, width: 400, align: 'left', } ); pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.agenciaECodigoDoBeneficiario, args.ajusteX + colunaLateral, args.ajusteY + tituloDaQuartaLinhaLateral1, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( banco.getAgenciaECodigoBeneficiario(boleto), args.ajusteX + colunaLateral, args.ajusteY + quartaLinha1, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right', } ); var quintaLinha1 = quartaLinha1 + ESPACO_ENTRE_LINHAS, tituloDaQuintaLinha1 = quintaLinha1 - diferencaEntreTituloEValor, tituloDaQuintaLinhaLateral1 = quintaLinha1 - diferencaEntreTituloEValor; var tituloDataDocumento = margemDoSegundoBloco; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.dataDocumento, args.ajusteX + tituloDataDocumento, args.ajusteY + tituloDaQuintaLinha1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( datas.getDocumentoFormatado(), args.ajusteX + margemDoSegundoBloco, args.ajusteY + quintaLinha1, { lineBreak: false, width: 61.5, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( boleto.getNumeroDoDocumentoFormatado(), args.ajusteX + margemDoSegundoBloco + 68, args.ajusteY + quintaLinha1, { lineBreak: false, width: 84, align: 'left', } ); var tituloNumeroDoDocumento = tituloDataDocumento + 68, tituloCip = tituloNumeroDoDocumento; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.numeroDoDocumento, args.ajusteX + tituloNumeroDoDocumento, args.ajusteY + tituloDaQuintaLinha1, { lineBreak: false, width: 294, align: 'left', } ); var tituloEspecieDoc = tituloNumeroDoDocumento + 90; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.especieDoDocumento, args.ajusteX + tituloEspecieDoc, args.ajusteY + tituloDaQuintaLinha1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( boleto.getEspecieDocumento(), args.ajusteX + margemDoSegundoBloco + 68 + 90, args.ajusteY + quintaLinha1, { lineBreak: false, width: 81, align: 'center', } ); var tituloAceite = tituloEspecieDoc + 86; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( 'Aceite', args.ajusteX + tituloAceite, args.ajusteY + tituloDaQuintaLinha1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( boleto.getAceiteFormatado(), args.ajusteX + margemDoSegundoBloco + 68 + 90 + 86, args.ajusteY + quintaLinha1, { lineBreak: false, width: 55, align: 'center', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( datas.getProcessamentoFormatado(), args.ajusteX + margemDoSegundoBloco + 68 + 90 + 86 + 61.5, args.ajusteY + quintaLinha1, { lineBreak: false, width: 93.5, align: 'left', } ); var tituloDataProcessamento = tituloAceite + 61; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.dataDeProcessamento, args.ajusteX + tituloDataProcessamento, args.ajusteY + tituloDaQuintaLinha1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.nossoNumero, args.ajusteX + colunaLateral, args.ajusteY + tituloDaQuintaLinhaLateral1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( beneficiario._nossoNumero, args.ajusteX + colunaLateral, args.ajusteY + quintaLinha1, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right', } ); var sextaLinha1 = quintaLinha1 + ESPACO_ENTRE_LINHAS, tituloDaSextaLinha1 = sextaLinha1 - diferencaEntreTituloEValor; var tituloUsoDoBancoX = margemDoSegundoBloco; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( 'Uso do Banco', args.ajusteX + tituloUsoDoBancoX, args.ajusteY + tituloDaSextaLinha1, { lineBreak: false, width: 294, align: 'left', } ); if (banco.exibirCampoCip) { pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( 'CIP', args.ajusteX + tituloCip, args.ajusteY + tituloDaSextaLinha1, { lineBreak: false, width: 31, align: 'left', } ); // TODO: Implementar campo CIP no boleto pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text('', args.ajusteX + tituloCip, args.ajusteY + sextaLinha1, { lineBreak: false, width: 31, align: 'center', }); } var tituloCarteira = tituloUsoDoBancoX + 105; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.carteira, args.ajusteX + tituloCarteira, args.ajusteY + tituloDaSextaLinha1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( banco.getCarteiraTexto(beneficiario), args.ajusteX + margemDoSegundoBloco + 104.5, args.ajusteY + sextaLinha1, { lineBreak: false, width: 71, align: 'center', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( boleto.getEspecieMoeda(), args.ajusteX + margemDoSegundoBloco + 104.5 + 77, args.ajusteY + sextaLinha1, { lineBreak: false, width: 71, align: 'center', } ); var tituloEspecieMoeda = tituloCarteira + 77; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.especie, args.ajusteX + tituloEspecieMoeda, args.ajusteY + tituloDaSextaLinha1, { lineBreak: false, width: 294, align: 'left', } ); var tituloQuantidadeMoeda = tituloEspecieMoeda + 77; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.quantidade, args.ajusteX + tituloQuantidadeMoeda, args.ajusteY + tituloDaSextaLinha1, { lineBreak: false, width: 294, align: 'left', } ); var tituloValorMoeda = tituloQuantidadeMoeda + 92; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.valor, args.ajusteX + tituloValorMoeda, args.ajusteY + tituloDaSextaLinha1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.igualDoValorDoDocumento + titulos.valorDoDocumento, args.ajusteX + colunaLateral, args.ajusteY + tituloDaSextaLinha1, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( boleto.getValorFormatadoBRL(), args.ajusteX + colunaLateral, args.ajusteY + sextaLinha1, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right', } ); var setimaLinhaLateral1 = sextaLinha1 + ESPACO_ENTRE_LINHAS, tituloDaSetimaLinha1 = tituloDaSextaLinha1 + ESPACO_ENTRE_LINHAS, tituloDaSetimaLinhaLateral1 = setimaLinhaLateral1 - diferencaEntreTituloEValor; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.instrucoes, args.ajusteX + margemDoSegundoBloco, args.ajusteY + tituloDaSetimaLinha1, { lineBreak: false, width: 294, align: 'left', } ); var instrucaoY = tituloDaSetimaLinha1 + 12; boleto.getInstrucoes().forEach(function (instrucao, indice) { pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( instrucao, args.ajusteX + margemDoSegundoBloco, args.ajusteY + instrucaoY + indice * args.tamanhoDaFonte, { lineBreak: false, width: 400, align: 'left', } ); }); if (args.exibirCampoUnidadeBeneficiaria) { pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( 'Unidade Beneficiária', args.ajusteX + 30, args.ajusteY + tituloDaSetimaLinha1 + 70, { lineBreak: false, width: 294, align: 'left', } ); } pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( 'Pagador', args.ajusteX + 30, args.ajusteY + tituloDaSetimaLinha1 + 115, { lineBreak: false, width: 294, align: 'left', } ); var cpfCnpj = formatCpfCnpj(pagador._registroNacional); if (!cpfCnpj) { cpfCnpj = ''; } else { cpfCnpj = `(CPF: ${cpfCnpj})`; } pdf .font('normal') .fontSize(args.tamanhoDaFonte) // TODO: Diminuir tamanho da fonte caso seja maior que X caracteres .text( pagador.getIdentificacao(), args.ajusteX + 30, args.ajusteY + tituloDaSetimaLinha1 + 115 + 10, { lineBreak: false, width: 294, align: 'left', } ); var enderecoDoPagador = pagador.getEndereco(); if (enderecoDoPagador) { var espacamento = args.tamanhoDaFonte; if (enderecoDoPagador.getPrimeiraLinha()) { pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( enderecoDoPagador.getPrimeiraLinha(), args.ajusteX + 30, args.ajusteY + tituloDaSetimaLinha1 + 115 + 10 + espacamento, { lineBreak: false, width: 535, align: 'left', } ); espacamento += espacamento; } if (enderecoDoPagador.getSegundaLinha()) { pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( enderecoDoPagador.getSegundaLinha(), args.ajusteX + 30, args.ajusteY + tituloDaSetimaLinha1 + 115 + 10 + espacamento, { lineBreak: false, width: 535, align: 'left', } ); } } pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( 'Código de Baixa', args.ajusteX + 370, args.ajusteY + tituloDaSetimaLinha1 + 150, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( 'Autenticação Mecânica', args.ajusteX + 360, args.ajusteY + tituloDaSetimaLinha1 + 165, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo + 1) .text( 'FICHA DE COMPENSAÇÃO', args.ajusteX + 421, args.ajusteY + tituloDaSetimaLinha1 + 165, { lineBreak: false, width: 150, align: 'right', } ); pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( '(-) Desconto / Abatimento', args.ajusteX + colunaLateral, args.ajusteY + tituloDaSetimaLinhaLateral1, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( boleto.getValorDescontosFormatadoBRL(), args.ajusteX + colunaLateral, args.ajusteY + setimaLinhaLateral1, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right', } ); var oitavaLinhaLateral1 = setimaLinhaLateral1 + ESPACO_ENTRE_LINHAS, tituloDaOitavaLinhaLateral1 = oitavaLinhaLateral1 - diferencaEntreTituloEValor; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( '(-) Outras Deduções', args.ajusteX + colunaLateral, args.ajusteY + tituloDaOitavaLinhaLateral1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( boleto.getValorDeducoesFormatadoBRL(), args.ajusteX + colunaLateral, args.ajusteY + oitavaLinhaLateral1, { lineBreak: false, width: 294, align: 'left', } ); var nonaLinhaLateral1 = oitavaLinhaLateral1 + ESPACO_ENTRE_LINHAS, tituloDaNonaLinhaLateral1 = nonaLinhaLateral1 - diferencaEntreTituloEValor; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( titulos.moraMulta, args.ajusteX + colunaLateral, args.ajusteY + tituloDaNonaLinhaLateral1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( boleto.getValorMoraMultaJurosFormatadoBRL(), args.ajusteX + colunaLateral, args.ajusteY + tituloDaNonaLinhaLateral1 + 7, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right', } ); var decimaLinhaLateral1 = nonaLinhaLateral1 + ESPACO_ENTRE_LINHAS, tituloDaDecimaLinhaLateral1 = decimaLinhaLateral1 - diferencaEntreTituloEValor; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( '(+) Outros Acréscimos', args.ajusteX + colunaLateral, args.ajusteY + tituloDaDecimaLinhaLateral1, { lineBreak: false, width: 294, align: 'left', } ); var decimaPrimLinhaLateral1 = decimaLinhaLateral1 + ESPACO_ENTRE_LINHAS, tituloDaDecimaPrimLinhaLateral1 = decimaPrimLinhaLateral1 - diferencaEntreTituloEValor; pdf .font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text( '(=) Valor Cobrado', args.ajusteX + colunaLateral, args.ajusteY + tituloDaDecimaPrimLinhaLateral1, { lineBreak: false, width: 294, align: 'left', } ); pdf .font('normal') .fontSize(args.tamanhoDaFonte) .text( boleto.getValorCobradoFormatadoBRL(), args.ajusteX + colunaLateral, args.ajusteY + tituloDaDecimaPrimLinhaLateral1 + 7, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right', } ); var cpfCnpj = formatCpfCnpj(pagador._registroNacional); if (!cpfCnpj) { cpfCnpj = ''; } else { cpfCnpj = `(CPF: ${cpfCnpj})`; } var primeiraLinhaOpcional = primeiraLinha + ESPACO_ENTRE_LINHAS, tituloDaPrimeiraLinhaOpcional = primeiraLinhaOpcional - diferencaEntreTituloEValor; var segundaLinha = banco.exibirReciboDoPagadorCompleto ? primeiraLinhaOpcional + ESPACO_ENTRE_LINHAS : primeiraLinha + ESPACO_ENTRE_LINHAS, tituloDaSegundaLinha = segundaLinha - diferencaEntreTituloEValor; const segundaLinha2 = linha21 - 20.25; const codigoDeBarras = boleto._codigoBarras || banco.geraCodigoDeBarrasPara(boleto); const linhaDigitavel = boleto._linhaDigitavel ? gerarLinhaDigitavel(boleto._linhaDigitavel) : gerarLinhaDigitavel(codigoDeBarras, banco); pdf.image( banco.getImagem(), args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + segundaLinha2 - 5, { height: alturaDoLogotipoDoBanco, } ); banco.imprimirNome && pdf .font('negrito') .fontSize(args.tamanhoDaLinhaDigitavel) .text( banco.nome, args.ajusteX + margemDoSegundoBlocoLayout + 26, args.ajusteY + segundaLinha2, { lineBreak: false, width: 100, align: 'left', } ); pdf .font('negrito') .fontSize(args.tamanhoDaLinhaDigitavel) .text( banco.getNumeroFormatadoComDigito(), args.ajusteX + margemDoSegundoBlocoLayout + 131, args.ajusteY + segundaLinha2, { lineBreak: false, width: 39.8, align: 'center', } ); pdf .font('negrito') .fontSize(args.tamanhoDaLinhaDigitavel) .text( linhaDigitavel, args.ajusteX + margemDoSegundoBlocoLayout + 145, args.ajusteY + segundaLinha2, { lineBreak: false, width: 400, align: 'right', } ); function i25(text) { var start = String.fromCharCode(201), stop = String.fromCharCode(202); return ( text.match(/.{2}/g).reduce(function (acc, part) { var value = parseInt(part, 10), ascii; if (value >= 0 && value <= 93) { ascii = value + 33; } if (value >= 94 && value <= 99) { ascii = value + 101; } return acc + String.fromCharCode(ascii); }, start) + stop