UNPKG

@notlekmelo/gerar-boletos

Version:
1,200 lines (1,016 loc) 41.9 kB
'use strict'; const path = require('path'); const StringUtils = require('../utils/string-utils'); const ObjectUtils = require('../utils/object-utils'); const Pdf = require('pdfkit'); const { Base64Encode } = require('base64-stream'); const GeradorDeLinhaDigitavel = require('./gerador-de-linha-digitavel'); const Sicredi = require('@notlekmelo/gerar-boletos/lib/boleto/bancos/sicredi'); 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'); var GeradorDeBoleto = (function() { function GeradorDeBoleto(boletos) { if (!Array.isArray(boletos)) { boletos = [boletos]; } this._boletos = boletos; } const pdfDefaults = { ajusteY: -80, ajusteX: 0, autor: '', titulo: '', criador: '', tamanhoDaFonteDoTitulo: 8, tamanhoDaFonte: 10, tamanhoDaLinhaDigitavel: 14, tamanhoDoCodigoDeBarras: 32, imprimirSequenciaDoBoleto: true, corDoLayout: 'black', alturaDaPagina: 595.44, larguraDaPagina: 841.68, exibirCampoUnidadeBeneficiaria: false, template: path.join(__dirname, '/templates/template.pdf'), informacoesPersonalizadas: function(pdf, x, y) {} }; GeradorDeBoleto.prototype.gerarPDF = function(args) { return new Promise((resolve)=> { if (typeof args === 'function') { args = pdfDefaults; } args = ObjectUtils.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); boletos.forEach(function escreveOsDadosDoBoleto(boleto, indice) { // 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; var linha1 = 151; 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 + 329, args.ajusteY + linha4Opcional) .stroke(args.corDoLayout); } var coluna1 = 27; pdf.moveTo(args.ajusteX + coluna1, args.ajusteY + linha1 - 0.5) .lineTo(args.ajusteX + coluna1, args.ajusteY + (banco.exibirReciboDoPagadorCompleto() ? linha4Opcional : linha3) + 0.5) .stroke(args.corDoLayout); var coluna2 = 329; pdf.moveTo(args.ajusteX + coluna2, args.ajusteY + linha1) .lineTo(args.ajusteX + coluna2, args.ajusteY + (banco.exibirReciboDoPagadorCompleto() ? linha4Opcional : linha3) + 0.5) .stroke(args.corDoLayout); var coluna3 = 178; pdf.moveTo(args.ajusteX + coluna3, args.ajusteY + linha2) .lineTo(args.ajusteX + coluna3, args.ajusteY + (banco.exibirReciboDoPagadorCompleto() ? linha4Opcional : linha3)) .stroke(args.corDoLayout); var coluna4 = 420; pdf.moveTo(args.ajusteX + coluna4, args.ajusteY + linha1) .lineTo(args.ajusteX + coluna4, args.ajusteY + (banco.exibirReciboDoPagadorCompleto() ? linha3 : linha2)) .stroke(args.corDoLayout); var coluna5 = 572; pdf.moveTo(args.ajusteX + coluna5, args.ajusteY + linha1 - 0.5) .lineTo(args.ajusteX + coluna5, args.ajusteY + (banco.exibirReciboDoPagadorCompleto() ? linha3 : linha2) + 0.5) .stroke(args.corDoLayout); var coluna6 = coluna2 + 4; pdf.moveTo(args.ajusteX + coluna6, args.ajusteY + (banco.exibirReciboDoPagadorCompleto() ? linha3 : linha2) + 3.5) .lineTo(args.ajusteX + coluna6, args.ajusteY + (banco.exibirReciboDoPagadorCompleto() ? linha4Opcional : linha3) + 0.5) .stroke(args.corDoLayout); if (banco.exibirReciboDoPagadorCompleto()) { var coluna6Opcional = coluna3; pdf.moveTo(args.ajusteX + coluna6Opcional, args.ajusteY + linha3 - 0.5) .lineTo(args.ajusteX + coluna6Opcional, args.ajusteY + linha4Opcional + 0.5) .stroke(args.corDoLayout); var coluna8Opcional = coluna1 + 75.5; pdf.moveTo(args.ajusteX + coluna8Opcional, args.ajusteY + linha2 - 0.5) .lineTo(args.ajusteX + coluna8Opcional, args.ajusteY + linha3 + 0.5) .stroke(args.corDoLayout); } var coluna7 = coluna5; pdf.moveTo(args.ajusteX + coluna7, args.ajusteY + (banco.exibirReciboDoPagadorCompleto() ? linha3 : linha2) + 3.5) .lineTo(args.ajusteX + coluna7, args.ajusteY + (banco.exibirReciboDoPagadorCompleto() ? linha4Opcional : linha3) + 0.5) .stroke(args.corDoLayout); var linha4 = (banco.exibirReciboDoPagadorCompleto() ? linha3 : linha2) + 4; pdf.moveTo(args.ajusteX + coluna6, args.ajusteY + linha4) .lineTo(args.ajusteX + coluna7, args.ajusteY + linha4) .stroke(args.corDoLayout); ////////////////// var margemDaLinhaSeparadora = 30, divisoresVerticais = (linha4Opcional || linha3) + (2 * margemDaLinhaSeparadora) - 4, margemDoSegundoBloco = 30, margemDoSegundoBlocoLayout = margemDoSegundoBloco - 4, alturaDoLogotipoDoBanco = 23; 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; if(!(banco instanceof Sicredi)) pdf.moveTo(args.ajusteX + coluna28, args.ajusteY + linha24) // Coluna entre uso do banco e carteira .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 = (linha4Opcional || linha3) + 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 = ObjectUtils.merge({ instrucoes: 'Instruções', 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', localDoPagamento: 'Local do Pagamento', igualDoValorDoDocumento: '(=) ' }, banco.getTitulos ? banco.getTitulos() : {}); args.creditos && pdf.font('italico') .fontSize(8) .text(args.creditos, args.ajusteX + 3, args.ajusteY + 90, { width: 560, align: 'center' }); var zeroLinha = 105; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('BENEFICIÁRIO:', args.ajusteX + 27, args.ajusteY + zeroLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(beneficiario.getIdentificacao().toUpperCase(), args.ajusteX + 27, args.ajusteY + zeroLinha + args.tamanhoDaFonte + 1.5, { lineBreak: false, width: 545, align: 'left' }); var enderecoDoBeneficiario = beneficiario.getEndereco(); if (enderecoDoBeneficiario) { var zeroUmLinha = zeroLinha + 2 + args.tamanhoDaFonte + args.tamanhoDaFonte, zeroDoisLinha = zeroUmLinha + 1 + args.tamanhoDaFonte; if (enderecoDoBeneficiario.getPrimeiraLinha()) { pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(enderecoDoBeneficiario.getPrimeiraLinha(), args.ajusteX + 27, args.ajusteY + zeroUmLinha, { lineBreak: false, width: 545, align: 'left' }); espacamento += espacamento; } if (enderecoDoBeneficiario.getSegundaLinha()) { pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(enderecoDoBeneficiario.getSegundaLinha(), args.ajusteX + 27, args.ajusteY + zeroDoisLinha, { lineBreak: false, width: 545, align: 'left' }); } } pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('RECIBO DO PAGADOR', args.ajusteX + 278, args.ajusteY + zeroLinha, { lineBreak: false, width: 294, align: 'right' }); var primeiraLinha = linha1 + 11, diferencaEntreTituloEValor = 10, tituloDaPrimeiraLinha = primeiraLinha - diferencaEntreTituloEValor; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.nomeDoPagador, args.ajusteX + 32, args.ajusteY + tituloDaPrimeiraLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) // TODO: Diminuir tamanho da fonte caso seja maior que X caracteres .text(pagador.getNome().toUpperCase(), args.ajusteX + 32, args.ajusteY + primeiraLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('Data de Vencimento', args.ajusteX + 332, args.ajusteY + tituloDaPrimeiraLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(datas.getVencimentoFormatado(), args.ajusteX + 332, args.ajusteY + primeiraLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('Valor Cobrado', args.ajusteX + 424, args.ajusteY + tituloDaPrimeiraLinha, { lineBreak: false, width: 294, align: 'left' }); var primeiraLinhaOpcional = primeiraLinha + ESPACO_ENTRE_LINHAS, tituloDaPrimeiraLinhaOpcional = primeiraLinhaOpcional - diferencaEntreTituloEValor; if (banco.exibirReciboDoPagadorCompleto()) { if(!(banco instanceof Sicredi)) { pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.carteira, args.ajusteX + 32, args.ajusteY + tituloDaPrimeiraLinhaOpcional, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(beneficiario.getCarteira(), args.ajusteX + 32, args.ajusteY + primeiraLinhaOpcional, { lineBreak: false, width: 40, align: 'left' }); } else { pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.dataDocumento, args.ajusteX + 32, args.ajusteY + tituloDaPrimeiraLinhaOpcional, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(datas.getDocumentoFormatado(), args.ajusteX + 32, args.ajusteY + primeiraLinhaOpcional, { lineBreak: false, width: 61.5, align: 'left' }); } pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.especieDoDocumento, args.ajusteX + 105, args.ajusteY + tituloDaPrimeiraLinhaOpcional, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(boleto.getEspecieDocumento(), args.ajusteX + 105, args.ajusteY + primeiraLinhaOpcional, { lineBreak: false, width: 40, align: 'left' }); pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.numeroDoDocumento, args.ajusteX + 181, args.ajusteY + tituloDaPrimeiraLinhaOpcional, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(StringUtils.pad(boleto.getNumeroDoDocumento(), 8, '0'), args.ajusteX + 181, args.ajusteY + primeiraLinhaOpcional, { lineBreak: false, width: 294, align: 'left' }); pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.valorDoDocumento, args.ajusteX + 424, args.ajusteY + tituloDaPrimeiraLinhaOpcional, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(boleto.getValorFormatadoBRL(), args.ajusteX + 424, args.ajusteY + primeiraLinhaOpcional, { lineBreak: false, width: 294, align: 'left' }); } var segundaLinha = banco.exibirReciboDoPagadorCompleto() ? primeiraLinhaOpcional + ESPACO_ENTRE_LINHAS : primeiraLinha + ESPACO_ENTRE_LINHAS, tituloDaSegundaLinha = segundaLinha - diferencaEntreTituloEValor; if (banco.exibirReciboDoPagadorCompleto()) { pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.dataDeProcessamento, args.ajusteX + 332, args.ajusteY + tituloDaPrimeiraLinhaOpcional, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(datas.getProcessamentoFormatado(), args.ajusteX + 332, args.ajusteY + primeiraLinhaOpcional, { lineBreak: false, width: 294, align: 'left' }); } pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.agenciaECodigoDoBeneficiario, args.ajusteX + 32, args.ajusteY + tituloDaSegundaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(banco.getAgenciaECodigoBeneficiario(boleto), args.ajusteX + 32, args.ajusteY + segundaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.nossoNumero, args.ajusteX + 181, args.ajusteY + tituloDaSegundaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(banco.getNossoNumeroECodigoDocumento(boleto), args.ajusteX + 181, args.ajusteY + segundaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(7) .text('Autenticação Mecânica', args.ajusteX + 426, args.ajusteY + segundaLinha - 5, { lineBreak: false, width: 294, align: 'left' }); const segundaLinha2 = linha21 - 20.25; const codigoDeBarras = banco.geraCodigoDeBarrasPara(boleto); const linhaDigitavel = GeradorDeLinhaDigitavel(codigoDeBarras, banco); pdf.image(banco.getImagem(), args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + segundaLinha2 - 5, { height: alturaDoLogotipoDoBanco }); banco.getImprimirNome() && pdf.font('negrito') .fontSize(args.tamanhoDaLinhaDigitavel) .text(banco.getNome(), 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) { // TODO: MUDAR PARA O GAMMAUTILS ASAP if (text.length % 2 !== 0) { throw new Error('Text must have an even number of characters'); } 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; } pdf.font('codigoDeBarras') .fontSize(args.tamanhoDoCodigoDeBarras) .text(i25(codigoDeBarras), args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha212 + 3.5, { lineBreak: false, width: 340, align: 'left' }); var terceiraLinha = segundaLinha2 + 38, tituloDaTerceiraLinha = terceiraLinha - diferencaEntreTituloEValor, tituloDaTerceiraLinhaLateral = terceiraLinha - diferencaEntreTituloEValor, colunaLateral = 440; var tituloLocalDoPagamento = margemDoSegundoBloco; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.localDoPagamento, args.ajusteX + tituloLocalDoPagamento, args.ajusteY + tituloDaTerceiraLinha - 7, { lineBreak: false, width: 294, align: 'left' }); boleto.getLocaisDePagamento().forEach(function(localDePagamento, indice) { if (indice > 1) { return; } pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(localDePagamento, args.ajusteX + margemDoSegundoBloco, args.ajusteY + (terceiraLinha + 2 - args.tamanhoDaFonte + (indice * args.tamanhoDaFonte)), { lineBreak: false, width: 400, align: 'left' }); }); var tamanhoDasCelulasADireita = 124.5; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('Vencimento', args.ajusteX + colunaLateral, args.ajusteY + tituloDaTerceiraLinhaLateral - 7, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(datas.getVencimentoFormatado(), args.ajusteX + colunaLateral, args.ajusteY + terceiraLinha, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right' }); var quartaLinha = terceiraLinha + 24, tituloDaQuartaLinhaLateral = quartaLinha - diferencaEntreTituloEValor; var tituloBeneficiario = margemDoSegundoBloco; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('Beneficiário', args.ajusteX + tituloBeneficiario, args.ajusteY + tituloDaQuartaLinhaLateral, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(beneficiario.getIdentificacao(), args.ajusteX + margemDoSegundoBloco, args.ajusteY + quartaLinha, { lineBreak: false, width: 400, align: 'left' }); pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.agenciaECodigoDoBeneficiario, args.ajusteX + colunaLateral, args.ajusteY + tituloDaQuartaLinhaLateral, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(banco.getAgenciaECodigoBeneficiario(boleto), args.ajusteX + colunaLateral, args.ajusteY + quartaLinha, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right' }); var quintaLinha = quartaLinha + ESPACO_ENTRE_LINHAS, tituloDaQuintaLinha = quintaLinha - diferencaEntreTituloEValor, tituloDaQuintaLinhaLateral = quintaLinha - diferencaEntreTituloEValor; var tituloDataDocumento = margemDoSegundoBloco; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.dataDocumento, args.ajusteX + tituloDataDocumento, args.ajusteY + tituloDaQuintaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(datas.getDocumentoFormatado(), args.ajusteX + margemDoSegundoBloco, args.ajusteY + quintaLinha, { lineBreak: false, width: 61.5, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(boleto.getNumeroDoDocumento(), args.ajusteX + margemDoSegundoBloco + 68, args.ajusteY + quintaLinha, { lineBreak: false, width: 84, align: 'center' }); var tituloNumeroDoDocumento = tituloDataDocumento + 68, tituloCip = tituloNumeroDoDocumento; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.numeroDoDocumento, args.ajusteX + tituloNumeroDoDocumento, args.ajusteY + tituloDaQuintaLinha, { lineBreak: false, width: 294, align: 'left' }); var tituloEspecieDoc = tituloNumeroDoDocumento + 90; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.especieDoDocumento, args.ajusteX + tituloEspecieDoc, args.ajusteY + tituloDaQuintaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(boleto.getEspecieDocumento(), args.ajusteX + margemDoSegundoBloco + 68 + 90, args.ajusteY + quintaLinha, { lineBreak: false, width: 81, align: 'center' }); var tituloAceite = tituloEspecieDoc + 86; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('Aceite', args.ajusteX + tituloAceite, args.ajusteY + tituloDaQuintaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(boleto.getAceiteFormatado(), args.ajusteX + margemDoSegundoBloco + 68 + 90 + 86, args.ajusteY + quintaLinha, { 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 + quintaLinha, { 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 + tituloDaQuintaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.nossoNumero, args.ajusteX + colunaLateral, args.ajusteY + tituloDaQuintaLinhaLateral, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(banco.getNossoNumeroECodigoDocumento(boleto), args.ajusteX + colunaLateral, args.ajusteY + quintaLinha, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right' }); var sextaLinha = quintaLinha + ESPACO_ENTRE_LINHAS, tituloDaSextaLinha = sextaLinha - diferencaEntreTituloEValor; var tituloUsoDoBancoX = margemDoSegundoBloco; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('Uso do Banco', args.ajusteX + tituloUsoDoBancoX, args.ajusteY + tituloDaSextaLinha, { lineBreak: false, width: 294, align: 'left' }); if (banco.exibirCampoCip()) { pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('CIP', args.ajusteX + tituloCip, args.ajusteY + tituloDaSextaLinha, { lineBreak: false, width: 31, align: 'left' }); // TODO: Implementar campo CIP no boleto pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text('', args.ajusteX + tituloCip, args.ajusteY + sextaLinha, { lineBreak: false, width: 31, align: 'center' }); } var tituloCarteira = tituloUsoDoBancoX + 105; if(!(banco instanceof Sicredi)) { pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.carteira, args.ajusteX + tituloCarteira, args.ajusteY + tituloDaSextaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(beneficiario.getCarteira(), args.ajusteX + margemDoSegundoBloco + 104.5, args.ajusteY + sextaLinha, { lineBreak: false, width: 71, align: 'center' }); } pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(boleto.getEspecieMoeda(), args.ajusteX + margemDoSegundoBloco + 104.5 + 77, args.ajusteY + sextaLinha, { lineBreak: false, width: 71, align: 'center' }); var tituloEspecieMoeda = tituloCarteira + 77; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.especie, args.ajusteX + tituloEspecieMoeda, args.ajusteY + tituloDaSextaLinha, { lineBreak: false, width: 294, align: 'left' }); var tituloQuantidadeMoeda = tituloEspecieMoeda + 77; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.quantidade, args.ajusteX + tituloQuantidadeMoeda, args.ajusteY + tituloDaSextaLinha, { lineBreak: false, width: 294, align: 'left' }); var tituloValorMoeda = tituloQuantidadeMoeda + 92; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.valor, args.ajusteX + tituloValorMoeda, args.ajusteY + tituloDaSextaLinha, { lineBreak: false, width: 294, align: 'left' }); pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.igualDoValorDoDocumento + titulos.valorDoDocumento, args.ajusteX + colunaLateral, args.ajusteY + tituloDaSextaLinha, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(boleto.getValorFormatadoBRL(), args.ajusteX + colunaLateral, args.ajusteY + sextaLinha, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right' }); var setimaLinhaLateral = sextaLinha + ESPACO_ENTRE_LINHAS, tituloDaSetimaLinha = tituloDaSextaLinha + ESPACO_ENTRE_LINHAS, tituloDaSetimaLinhaLateral = setimaLinhaLateral - diferencaEntreTituloEValor; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.instrucoes, args.ajusteX + margemDoSegundoBloco, args.ajusteY + tituloDaSetimaLinha, { lineBreak: false, width: 380, align: 'left' }); var instrucaoY = tituloDaSetimaLinha + 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 + tituloDaSetimaLinha + 70, { lineBreak: false, width: 294, align: 'left' }); } pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('Pagador', args.ajusteX + 30, args.ajusteY + tituloDaSetimaLinha + 115, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(pagador.getIdentificacao(), args.ajusteX + 30, args.ajusteY + tituloDaSetimaLinha + 115 + 10, { lineBreak: false, width: 535, 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 + tituloDaSetimaLinha + 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 + tituloDaSetimaLinha + 115 + 10 + espacamento, { lineBreak: false, width: 535, align: 'left' }); } } pdf.font('normal') .fontSize(args.tamanhoDaFonteDoTitulo) .text('Código de Baixa', args.ajusteX + 380, args.ajusteY + tituloDaSetimaLinha + 150, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(banco.getNossoNumeroECodigoDocumento(boleto), args.ajusteX + 390, args.ajusteY + tituloDaSetimaLinha + 160, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonteDoTitulo) .text('Autenticação Mecânica', args.ajusteX + 380, args.ajusteY + tituloDaSetimaLinha + 171.5, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonteDoTitulo + 1) .text('Ficha de Compensação', args.ajusteX + 400, args.ajusteY + tituloDaSetimaLinha + 171.5, { lineBreak: false, width: 150, align: 'right' }); pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('(-) Desconto / Abatimento', args.ajusteX + colunaLateral, args.ajusteY + tituloDaSetimaLinhaLateral, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(boleto.getValorDescontosFormatadoBRL(), args.ajusteX + colunaLateral, args.ajusteY + setimaLinhaLateral, { lineBreak: false, width: tamanhoDasCelulasADireita, align: 'right' }); var oitavaLinhaLateral = setimaLinhaLateral + ESPACO_ENTRE_LINHAS, tituloDaOitavaLinhaLateral = oitavaLinhaLateral - diferencaEntreTituloEValor; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('(-) Outras Deduções', args.ajusteX + colunaLateral, args.ajusteY + tituloDaOitavaLinhaLateral, { lineBreak: false, width: 294, align: 'left' }); pdf.font('normal') .fontSize(args.tamanhoDaFonte) .text(boleto.getValorDeducoesFormatadoBRL(), args.ajusteX + colunaLateral, args.ajusteY + oitavaLinhaLateral, { lineBreak: false, width: 294, align: 'left' }); var nonaLinhaLateral = oitavaLinhaLateral + ESPACO_ENTRE_LINHAS, tituloDaNonaLinhaLateral = nonaLinhaLateral - diferencaEntreTituloEValor; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text(titulos.moraMulta, args.ajusteX + colunaLateral, args.ajusteY + tituloDaNonaLinhaLateral, { lineBreak: false, width: 294, align: 'left' }); var decimaLinhaLateral = nonaLinhaLateral + ESPACO_ENTRE_LINHAS, tituloDaDecimaLinhaLateral = decimaLinhaLateral - diferencaEntreTituloEValor; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('(+) Outros Acréscimos', args.ajusteX + colunaLateral, args.ajusteY + tituloDaDecimaLinhaLateral, { lineBreak: false, width: 294, align: 'left' }); var decimaPrimLinhaLateral = decimaLinhaLateral + ESPACO_ENTRE_LINHAS, tituloDaDecimaPrimLinhaLateral = decimaPrimLinhaLateral - diferencaEntreTituloEValor; pdf.font('negrito') .fontSize(args.tamanhoDaFonteDoTitulo) .text('(=) Valor Cobrado', args.ajusteX + colunaLateral, args.ajusteY + tituloDaDecimaPrimLinhaLateral, { lineBreak: false, width: 294, align: 'left' }); // args.imprimirSequenciaDoBoleto && pdf.font('italico') // .fontSize(args.tamanhoDaFonte) // .text('Boleto Nº ' + (indice + 1) + '/' + boletos.length, args.ajusteX + 30, args.ajusteY + 10, { // width: 560, // align: 'center' // }); informacoesPersonalizadas(pdf, args.ajusteX + margemDoSegundoBlocoLayout, args.ajusteY + linha212 + args.tamanhoDoCodigoDeBarras + 10); if (indice < boletos.length - 1) { pdf.addPage(); } }); if(args.base64){ var finalString = ''; var stream = pdf.pipe(new Base64Encode()); pdf.end(); stream.on('data', function(chunk) { finalString += chunk; }); stream.on('end', function() { resolve(finalString); }); }else{ pdf.end(); resolve(pdf); } }); }; GeradorDeBoleto.prototype.gerarLinhaDigitavel = function() { return new Promise((resolve)=> { const boletos = this._boletos; const linhaDigitavel = []; boletos.forEach((boleto, indice)=> { const banco = boleto.getBanco(); const numeroDocumento = boleto.getNumeroDoDocumentoFormatado(); const linha = GeradorDeLinhaDigitavel(banco.geraCodigoDeBarrasPara(boleto), banco) if (indice <= boletos.length - 1) { linhaDigitavel.push({linha, numeroDocumento}); } }); resolve(linhaDigitavel); }); }; GeradorDeBoleto.prototype.gerarHTML = function() { throw new Error('Não implementado!'); }; return GeradorDeBoleto; })(); module.exports = GeradorDeBoleto;