danfe
Version:
Módulo node.js para gerar DANFEs em .pdf
911 lines (715 loc) • 36.2 kB
JavaScript
'use strict';
var path = require('path'),
gammautils = require('gammautils'),
barcode = gammautils.barcode,
merge = gammautils.object.merge,
Pdf = require('pdfkit'),
diretorioDeFontes = path.join(__dirname, './fontes'),
timesNewRoman = path.join(diretorioDeFontes, 'Times New Roman.ttf'),
timesNewRomanNegrito = path.join(diretorioDeFontes, 'Times New Roman Bold.ttf'),
timesNewRomanItalico = path.join(diretorioDeFontes, 'Times New Roman Italic.ttf'),
timesNewRomanNegritoItalico = path.join(diretorioDeFontes, 'Times New Roman Bold Italic.ttf');
var pdfDefaults = {
ajusteY: 0,
ajusteX: 0,
autor: '',
titulo: '',
criador: '',
tamanhoDaFonteDoTitulo: 6,
corDoTitulo: 'black',
alinhamentoDoTitulo: 'left',
alinhamentoDoTituloDaTabela: 'center',
tamanhoDaFonteDaSecao: 7,
corDaSecao: 'black',
tamanhoDaFonteDoCampo: 9.5,
alinhamentoDoCampo: 'center',
corDoCampo: 'black',
tamanhoDaFonteDosItens: 7,
separadorDeItens: true,
ajusteYDoLogotipo: 0,
ajusteYDaIdentificacaoDoEmitente: 0,
ambiente: 'producao',
opacidadeDaHomologacao: 0.2,
ajusteYDaHomologacao: 275,
tamanhoDoCodigoDeBarras: 32,
corDoLayout: 'black',
larguraDaPagina: 595.44,
alturaDaPagina: 841.68,
creditos: 'Impresso com Brasil.js - http://github.com/brasil-js/danfe'
};
module.exports = function(danfe, args, callback) {
if(typeof args === 'function') {
callback = args;
args = pdfDefaults;
}
args = merge(pdfDefaults, args);
var emitente = danfe.getEmitente(),
destinatario = danfe.getDestinatario(),
transportador = danfe.getTransportador(),
impostos = danfe.getImpostos(),
volumes = danfe.getVolumes(),
protocolo = danfe.getProtocolo(),
itens = danfe.getItens(),
fatura = danfe.getFatura(),
alturaDoBlocoFaturaDuplicatas = 0,
duplicatas = danfe.getDuplicatas(),
pdf = new Pdf({
bufferPages: true,
margin: 0,
size: [
args.larguraDaPagina,
args.alturaDaPagina
],
info: {
Author: args.autor,
Title: args.titulo,
Creator: args.criador,
Producer: 'http://github.com/brasil-js/danfe'
}
}),
pdfTemporario = new Pdf({
//TODO: Verificar se a criação deste pdf temporario
// está causando problemas de performance
margin: 0,
size: [
args.larguraDaPagina,
args.alturaDaPagina
]
}),
deveExibirQuadroDeCalculoDoIssqn =
danfe.getValorTotalDosServicos() ||
impostos.getBaseDeCalculoDoIssqn() ||
impostos.getValorTotalDoIssqn();
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', barcode.code128.font);
pdfTemporario.registerFont('normal', timesNewRoman);
///////// LAYOUT
var grossuraDaLinha = 0.5,
margemTopo = 2.8,
margemEsquerda = 3,
margemDireita = 589.65,
larguraDoFormulario = margemDireita - margemEsquerda;
pdf.lineWidth(grossuraDaLinha);
function linhaHorizontal(x1, x2, y, cor) {
y = margemTopo + args.ajusteY + y;
x1 = margemEsquerda + args.ajusteX + x1;
x2 = margemDireita + args.ajusteX + x2;
return pdf.moveTo(x1, y).lineTo(x2, y).dash(false).stroke(cor || args.corDoLayout);
}
function linhaHorizontalTracejada(x1, x2, y) {
y = margemTopo + args.ajusteY + y;
x1 = margemEsquerda + args.ajusteX + x1;
x2 = margemDireita + args.ajusteX + x2;
return pdf.moveTo(x1, y).lineTo(x2, y).dash(3, { space: 5 }).stroke(args.corDoLayout);
}
function linhaVertical(y1, y2, x, cor) {
x = margemEsquerda + args.ajusteX + x;
y1 = margemTopo + args.ajusteY + y1;
y2 = margemTopo + args.ajusteY + y2;
return pdf.moveTo(x, y1).lineTo(x, y2).dash(false).stroke(cor || args.corDoLayout);
}
function secao(string, x, y, largura, alinhamento, tamanho) {
string = string || '';
x = margemEsquerda + args.ajusteX + x;
y = margemTopo + args.ajusteY + y;
pdf.font('negrito')
.fillColor(args.corDaSecao)
.fontSize(tamanho || args.tamanhoDaFonteDaSecao)
.text(string.toUpperCase(), x, y, {
width: largura,
align: 'left'
});
}
function titulo(string, x, y, largura, alinhamento, tamanho) {
string = typeof string !== 'undefined' && string !== null && string.toString() || '';
x = margemEsquerda + args.ajusteX + x;
y = margemTopo + args.ajusteY + y;
pdf.font('normal')
.fillColor(args.corDoTitulo)
.fontSize(tamanho || args.tamanhoDaFonteDoTitulo)
.text(string.toUpperCase(), x, y, {
width: largura,
align: alinhamento || args.alinhamentoDoTitulo
});
}
function normal(string, x, y, largura, alinhamento, tamanho, _pdf) {
string = string || '';
(_pdf || pdf).font('normal')
.fillColor(args.corDoTitulo)
.fontSize(tamanho || 8)
.text(string,
margemEsquerda + args.ajusteX + x,
margemTopo + args.ajusteY + y, {
width: largura,
align: alinhamento || 'center',
lineGap: -1.5
});
}
function italico(string, x, y, largura, alinhamento, tamanho) {
string = string || '';
pdf.font('italico')
.fillColor(args.corDoTitulo)
.fontSize(tamanho || 6)
.text(string,
margemEsquerda + args.ajusteX + x,
margemTopo + args.ajusteY + y, {
width: largura,
align: alinhamento || 'center',
lineGap: -1.5
});
}
function negrito(string, x, y, largura, alinhamento, tamanho) {
string = string || '';
pdf.font('negrito')
.fillColor(args.corDoTitulo)
.fontSize(tamanho || 6)
.text(string,
margemEsquerda + args.ajusteX + x,
margemTopo + args.ajusteY + y, {
width: largura,
align: alinhamento || 'center',
lineGap: -1.5
});
}
function campo(string, x, y, largura, alinhamento, tamanho) {
string = string || '';
pdf.font('negrito')
.fillColor(args.corDoCampo)
.fontSize(tamanho || args.tamanhoDaFonteDoCampo)
.text(string,
margemEsquerda + args.ajusteX + x,
margemTopo + args.ajusteY + y, {
width: largura,
align: alinhamento || args.alinhamentoDoCampo
});
}
function desenharPagina() {
if(args.ambiente !== 'producao') {
pdf.font('normal')
.fillColor(args.corDoTitulo)
.fontSize(50)
.fillOpacity(args.opacidadeDaHomologacao)
.text('HOMOLOGAÇÃO',
margemEsquerda + args.ajusteX + 0,
margemTopo + args.ajusteY + 400 + args.ajusteYDaHomologacao, {
width: larguraDoFormulario,
align: 'center'
});
pdf.font('normal')
.fillColor(args.corDoTitulo)
.fontSize(25)
.fillOpacity(args.opacidadeDaHomologacao)
.text('SEM VALOR FISCAL',
margemEsquerda + args.ajusteX + 0,
margemTopo + args.ajusteY + 450 + args.ajusteYDaHomologacao, {
width: larguraDoFormulario,
align: 'center'
});
}
//RECIBO
linhaHorizontal(0, 0, 0);
linhaHorizontal(0, -110.5, 28.3);
linhaHorizontal(0, 0, 51.1);
linhaVertical(0, 51.1, 0);
linhaVertical(28.3, 51.1, 99.2);
linhaVertical(0, 51.1, 476);
linhaVertical(0, 51.1, 0);
linhaVertical(0, 51.1, larguraDoFormulario);
//PRIMEIRO BLOCO
//QUADRADO DO TIPO (ENTRADA OU SAIDA)
linhaHorizontal(317.4, -255, 96.4);
linhaVertical(96.4, 116.2, 317.4);
linhaHorizontal(317.4, -255, 116.2);
linhaVertical(96.4, 116.2, 331.55);
linhaHorizontal(0, 0, 59.55);
linhaHorizontal(340.05, 0, 104.8);
linhaHorizontal(340.05, 0, 127.4);
linhaHorizontal(0, 0, 150.2);
linhaHorizontal(0, 0, 170);
linhaHorizontal(0, 0, 190);
linhaVertical(59.55, 190, 0);
linhaVertical(59.55, 150.2, 240.75);
linhaVertical(59.55, 170, 340.05);
linhaVertical(59.55, 190, larguraDoFormulario);
linhaVertical(170, 190, 195.55);
linhaVertical(170, 190, 391);
//SEGUNDO BLOCO
linhaHorizontal(0, 0, 201.2);
linhaHorizontal(0, 0, 221);
linhaHorizontal(0, 0, 241);
linhaHorizontal(0, 0, 261);
linhaVertical(201.2, 261, 0);
linhaVertical(201.2, 221, 357.1);
linhaVertical(221, 261, 274.9);
linhaVertical(241, 261, 297.6);
linhaVertical(221, 261, 396.75);
linhaVertical(201.2, 261, 493.1);
linhaVertical(201.2, 261, larguraDoFormulario);
//TERCEIRO BLOCO
linhaHorizontal(0, 0, 269);
linhaHorizontal(0, 0, 289);
linhaHorizontal(0, 0, 309);
linhaVertical(269, 309, 0);
linhaVertical(269, 309, 87.7);
linhaVertical(269, 309, (87.7 * 2) + 0.3);
linhaVertical(269, 309, (87.7 * 3) + 0.4);
linhaVertical(269, 309, (87.7 * 4) + 0.4);
linhaVertical(269, 309, (87.7 * 5) + 0.6);
linhaVertical(269, 309, (87.7 * 5) + 51.8);
linhaVertical(269, 309, larguraDoFormulario);
//QUARTO BLOCO
linhaHorizontal(0, 0, 320);
linhaHorizontal(0, 0, 340);
linhaHorizontal(0, 0, 360);
linhaHorizontal(0, 0, 380);
linhaVertical(320, 380, 0);
linhaVertical(320, 340, 170);
linhaVertical(320, 340, 346);
linhaVertical(320, 360, 434);
linhaVertical(320, 360, 456.65);
linhaVertical(320, 380, 258);
linhaVertical(360, 380, 59.6);
linhaVertical(360, 380, 158.6);
linhaVertical(360, 380, 357);
linhaVertical(360, 380, 473.3);
linhaVertical(320, 380, larguraDoFormulario);
//QUINTO BLOCO - LISTA DE PRODUTOS
var alturaInicialDoQuadroDeItens = 391,
alturaInicialDoQuadroDeDuplicatas = alturaInicialDoQuadroDeItens,
alturaDeLinhaDeDuplicata = 23,
duplicatasPorLinha = 8,
larguraDaDuplicata = larguraDoFormulario / duplicatasPorLinha,
segundaLinhaDoQuadroDeItens,
linhasDeDuplicatas = 0;
if(fatura) {
alturaDoBlocoFaturaDuplicatas += args.tamanhoDaFonteDoTitulo;
alturaInicialDoQuadroDeDuplicatas += 6.5;
}
if(duplicatas.length) {
linhasDeDuplicatas = Math.ceil(duplicatas.length / duplicatasPorLinha);
alturaDoBlocoFaturaDuplicatas += (linhasDeDuplicatas * alturaDeLinhaDeDuplicata) + 10;
} else {
alturaDoBlocoFaturaDuplicatas += args.tamanhoDaFonteDoTitulo + 3;
}
duplicatas = gammautils.array.chop(duplicatas, duplicatasPorLinha);
var margemDeCimaDaDuplicata = 2,
margemEsquerdaDaDuplicata = 2,
larguraDaDuplicataComMargem = larguraDaDuplicata - margemEsquerdaDaDuplicata - 1;
duplicatas.forEach(function(linha, indiceDaLinha) {
var x1, x2, y;
linha.forEach(function(duplicata, indiceDaDuplicata) {
x1 = indiceDaDuplicata * larguraDaDuplicata;
x2 = x1 + larguraDaDuplicata - larguraDoFormulario;
y = alturaInicialDoQuadroDeDuplicatas + (indiceDaLinha * alturaDeLinhaDeDuplicata);
linhaHorizontal(x1, x2, y);
linhaVertical(y, y + alturaDeLinhaDeDuplicata, x1);
titulo('NÚM.', x1 + margemEsquerdaDaDuplicata, y + margemDeCimaDaDuplicata, larguraDaDuplicataComMargem);
titulo(duplicata.getNumero(), x1 + margemEsquerdaDaDuplicata, y + margemDeCimaDaDuplicata, larguraDaDuplicataComMargem, 'right');
titulo('VENC.', x1 + margemEsquerdaDaDuplicata, y + margemDeCimaDaDuplicata + args.tamanhoDaFonteDoTitulo, larguraDaDuplicataComMargem, 'left');
titulo(duplicata.getVencimentoFormatado(), x1 + margemEsquerdaDaDuplicata, y + margemDeCimaDaDuplicata + args.tamanhoDaFonteDoTitulo, larguraDaDuplicataComMargem, 'right');
titulo('VALOR', x1 + margemEsquerdaDaDuplicata, y + margemDeCimaDaDuplicata + (2 * args.tamanhoDaFonteDoTitulo), larguraDaDuplicataComMargem, 'left');
titulo(duplicata.getValorFormatado(), x1 + margemEsquerdaDaDuplicata, y + margemDeCimaDaDuplicata + (2 * args.tamanhoDaFonteDoTitulo), larguraDaDuplicataComMargem, 'right');
});
linhaVertical(y, y + alturaDeLinhaDeDuplicata, x1 + larguraDaDuplicata);
linhaHorizontal(0, x2, y + alturaDeLinhaDeDuplicata);
});
//
alturaInicialDoQuadroDeItens += alturaDoBlocoFaturaDuplicatas;
segundaLinhaDoQuadroDeItens = alturaInicialDoQuadroDeItens + 14.2;
linhaHorizontal(0, 0, alturaInicialDoQuadroDeItens);
linhaHorizontal(0, 0, segundaLinhaDoQuadroDeItens);
linhaHorizontal(0, 0, 751);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 0);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 53.8);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 235.3);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 269.3);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 292);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 314.5);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 331.6);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 371.2);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 405.4);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 439.3);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 473.2);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 507.2);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 535.6);
linhaVertical(alturaInicialDoQuadroDeItens, 751, 555.4);
linhaVertical(alturaInicialDoQuadroDeItens, 751, larguraDoFormulario);
var alturaInicialDoSetimoBloco = 793.6;
//SEXTO BLOCO
if(deveExibirQuadroDeCalculoDoIssqn) {
linhaHorizontal(0, 0, 762.2);
linhaHorizontal(0, 0, 782.2);
linhaVertical(762.2, 782.2, 0);
linhaVertical(762.2, 782.2, 136.1);
linhaVertical(762.2, 782.2, (136.1 * 2) - 0.1);
linhaVertical(762.2, 782.2, (136.1 * 3) - 0.1);
linhaVertical(762.2, 782.2, larguraDoFormulario);
} else {
alturaInicialDoSetimoBloco = 762.2;
}
// SÉTIMO BLOCO
linhaHorizontal(0, 0, alturaInicialDoSetimoBloco); // x1, x2, y
linhaHorizontal(0, 0, 821.8);
linhaVertical(alturaInicialDoSetimoBloco, 821.8, 0);
linhaVertical(alturaInicialDoSetimoBloco, 821.8, 388.25);
linhaVertical(alturaInicialDoSetimoBloco, 821.8, larguraDoFormulario);
// Deve ser a última linha pois não estou conseguindo
// retirar o tracejado após utiliza-lo pela primeira vez
linhaHorizontalTracejada(0, 0, 55.32);
// MARGENS DA IMPRESSORA (ÚTIL PARA DEBUG)
// linhaHorizontal(0, args.larguraDaPagina, 18, 'red');
// linhaHorizontal(0, args.larguraDaPagina, args.alturaDaPagina - 18, 'red');
// linhaVertical(0, args.alturaDaPagina, 18, 'red');
// linhaVertical(0, args.alturaDaPagina, args.larguraDaPagina - 22, 'red');
normal([
'Recebemos de',
emitente.getNome(),
'os produtos e/ou serviços constantes da nota',
'fiscal eletrônica indicada abaixo.',
'Emissão:',
danfe.getDataDaEmissaoFormatada(),
'- Valor Total:',
danfe.getValorTotalDaNotaFormatado(),
'- Destinatário:',
destinatario.getNome(),
'- Endereço:',
destinatario.getEndereco().getPrimeiraLinha()
].join(' ').toUpperCase(), 1.5, 3, 472.5, 'justify', 6.9);
titulo('DANFE', 266.5, 63.5, 197, 'left', 14);
normal('NF-e', 476.6, 1.8, 110, 'center', 14);
normal(danfe.getNumeroFormatado(), 476.6, 22, 110, 'center', 10);
normal(danfe.getSerieFormatada(), 476.6, 31.5, 110, 'center', 10);
italico('IDENTIFICAÇÃO DO EMITENTE', 1, 60, 238);
var temLogotipo = emitente.getLogotipo(),
identificacaoDoEmitenteY = temLogotipo ? 78 : 84,
identificacaoDoEmitenteX = temLogotipo ? 67 : 1.5,
identificacaoDoEmitenteLargura = temLogotipo ? 172 : 237,//
identificacaoDoEmitenteFonte = temLogotipo ? 0 : 1.5;
if(temLogotipo) {
var caminhoDoLogotipo = emitente.getLogotipo();
pdf.image(caminhoDoLogotipo, margemEsquerda + args.ajusteX + 4.5, margemTopo + args.ajusteY + args.ajusteYDoLogotipo + 78, {
fit: [60, 60]
});
}
negrito(emitente.getNome(), identificacaoDoEmitenteX, identificacaoDoEmitenteY + args.ajusteYDaIdentificacaoDoEmitente, identificacaoDoEmitenteLargura, 'center', 8 + identificacaoDoEmitenteFonte);
if(emitente.getEndereco().getPrimeiraLinha()) {
normal(emitente.getEndereco().getPrimeiraLinha(),
identificacaoDoEmitenteX,
pdf.y - margemTopo + 2,
identificacaoDoEmitenteLargura, 'center', 6 + identificacaoDoEmitenteFonte);
}
if(emitente.getEndereco().getSegundaLinha()) {
normal(emitente.getEndereco().getSegundaLinha(),
identificacaoDoEmitenteX,
pdf.y - margemTopo,
identificacaoDoEmitenteLargura, 'center', 6 + identificacaoDoEmitenteFonte);
}
var jaAdicionouEspacamento = false;
if(emitente.getTelefone()) {
jaAdicionouEspacamento = true;
normal('Telefone: ' + emitente.getTelefoneFormatado(),
identificacaoDoEmitenteX,
pdf.y - margemTopo + 2,
identificacaoDoEmitenteLargura, 'center', 6 + identificacaoDoEmitenteFonte);
}
if(emitente.getEmail()) {
normal('Email: ' + emitente.getEmail(),
identificacaoDoEmitenteX,
pdf.y - margemTopo + (jaAdicionouEspacamento ? 0 : 2),
identificacaoDoEmitenteLargura, 'center', 6 + identificacaoDoEmitenteFonte);
}
normal('Documento Auxiliar da Nota Fiscal Eletrônica', 241.5, 77, 99.5);
normal('0 - ENTRADA', 248, 100, 99.5, 'left');
normal('1 - SAÍDA', 248, 108.5, 99.5, 'left');
negrito(danfe.getTipoFormatado(), 317.5, 96.8, 14.5, 'center', 18);
// CAMPO OPCIONAL 1 - FSDA
var formularioDeSeguranca = danfe.getFormularioDeSeguranca();
if(protocolo.getFormatacao()) {
normal('Consulta de autenticidade no portal nacional da NF-e', 340.5, 130, 244);
normal('www.nfe.fazenda.gov.br/portal ou no site da Sefaz Autorizadora', 340.5, 138, 244);
} else if(formularioDeSeguranca) {
pdf.font('codigoDeBarras')
.fontSize(18.5)
.text(barcode.code128.encode(formularioDeSeguranca.getDadosDaNfe()), 341.5, 131.5, {
align: 'center',
width: 250
});
}
var informacoesComplementares = [
danfe.getInformacoesComplementares()
];
if(formularioDeSeguranca) {
informacoesComplementares.unshift([
'DANFE EM CONTINGÊNCIA, ',
'IMPRESSO EM DECORRÊNCIA DE PROBLEMAS TÉCNICOS: ',
formularioDeSeguranca.getJustificativa().toUpperCase(),
].join(''));
}
normal(informacoesComplementares.join(' - '), 1, alturaInicialDoSetimoBloco + 7.5, 386, 'justify', 6);
normal(danfe.getNumeroFormatado(), 241.2, 119.5, 98.5, 'center', 10);
normal(danfe.getSerieFormatada(), 241.2, 129.5, 98.5, 'center', 10);
//RECIBO
titulo('DATA DE RECEBIMENTO', 1.5, 29, 97);
titulo('IDENTIFICAÇÃO E ASSINATURA DO RECEBEDOR', 100.5, 29, 374);
var codigoDeBarrasCodificado = barcode.code128.encode(danfe.getChaveDeAcesso());
if(danfe.getChaveDeAcesso()) {
pdf.font('codigoDeBarras')
.fontSize(args.tamanhoDoCodigoDeBarras)
.text(codigoDeBarrasCodificado, args.ajusteX + margemEsquerda + 339, args.ajusteY + margemTopo + 65, {
align: 'center',
width: 249
});
}
//PRIMEIRO BLOCO
titulo('CHAVE DE ACESSO', 341.5, 105.5, 244);
campo(danfe.getChaveDeAcessoFormatada(), 341.5, 114, 244);
if(protocolo.getFormatacao()) {
titulo('PROTOCOLO DE AUTORIZAÇÃO DE USO', 341.5, 151, 244);
campo(protocolo.getFormatacao(), 341.5, 158.4, 244);
} else if(formularioDeSeguranca) {
titulo('DADOS DA NFE', 341.5, 151, 244);
campo(formularioDeSeguranca.getDadosDaNfeFormatado(), 341.5, 158.4, 244);
}
titulo('NATUREZA DA OPERAÇÃO', 1.5, 151, 338);
campo(danfe.getNaturezaDaOperacao(), 1.5, 158.4, 338);
titulo('INSCRIÇÃO ESTADUAL', 1.5, 171, 192.5);
campo(emitente.getInscricaoEstadual(), 1.5, 178.4, 192.5);
titulo('INSCRIÇÃO ESTADUAL DO SUBST. TRIBUT.', 197, 171, 192.5);
campo(danfe.getInscricaoEstadualDoSubstitutoTributario(), 197, 178.4, 192.5);
titulo('CNPJ', 392.5, 171, 192.5);
campo(emitente.getRegistroNacionalFormatado(), 392.5, 178.4, 192.5);
//SEGUNDO BLOCO
secao('DESTINATÁRIO / REMETENTE', 1.5, 194);
titulo('NOME / RAZÃO SOCIAL', 1.5, 202, 353.5);
campo(destinatario.getNome(), 1.5, 210, 353.5, 'left');
titulo('CNPJ / CPF', 358, 202, 133.5);
campo(destinatario.getRegistroNacionalFormatado(), 358, 210, 133.5);
titulo('DATA DA EMISSÃO', 495, 202, 90);
campo(danfe.getDataDaEmissaoFormatada(), 495, 210, 90);
titulo('ENDEREÇO', 1.5, 222, 272);
campo(destinatario.getEndereco().getPrimeiraLinha(), 1.5, 230, 272, 'left', args.tamanhoDaFonteDoCampo - 0.5);
titulo('BAIRRO / DISTRITO', 276, 222, 119);
campo(destinatario.getEndereco().getBairro(), 276, 230, 119);
titulo('CEP', 398, 222, 93);
campo(destinatario.getEndereco().getCepFormatado(), 398, 230, 93);
titulo('DATA DA SAÍDA', 495, 222, 90);
campo(danfe.getDataDaEntradaOuSaidaFormatada(), 495, 230, 90);
titulo('MUNICÍPIO', 1.5, 242, 272);
campo(destinatario.getEndereco().getMunicipio(), 1.5, 250, 272, 'left');
titulo('UF', 276, 242, 20);
campo(destinatario.getEndereco().getUf(), 276, 250, 20);
titulo('FONE / FAX', 299, 242, 96);
campo(destinatario.getTelefoneFormatado(), 299, 250, 96);
titulo('INSCRIÇÃO ESTADUAL', 398, 242, 93);
campo(destinatario.getInscricaoEstadual(), 398, 250, 93);
titulo('HORA DA SAÍDA', 495, 242, 90);
campo(danfe.getHorarioDaEntradaOuSaida(), 495, 250, 90);
//TERCEIRO BLOCO
secao('CÁLCULO DO IMPOSTO', 1.5, 261.5);
titulo('BASE DE CÁLCULO DO ICMS', 1.5, 270, 84);
campo(impostos.getBaseDeCalculoDoIcmsFormatada(), 1.5, 278, 84, 'right');
titulo('VALOR DO ICMS', 89, 270, 84);
campo(impostos.getValorDoIcmsFormatado(), 89, 278, 84, 'right');
titulo('BASE DE CÁLC. ICMS S.T.', 177, 270, 84);
campo(impostos.getBaseDeCalculoDoIcmsStFormatada(), 177, 278, 84, 'right');
titulo('VALOR DO ICMS SUBST.', 265, 270, 84);
campo(impostos.getValorDoIcmsStFormatado(), 265, 278, 84, 'right');
titulo('VALOR IMP. IMPORTAÇÃO', 353, 270, 84);
campo(impostos.getValorDoImpostoDeImportacaoFormatado(), 353, 278, 84, 'right');
titulo('VALOR DO PIS', 441, 270, 47);
campo(impostos.getValorDoPisFormatado(), 441, 278, 47, 'right');
titulo('VALOR TOTAL DOS PRODUTOS', 492, 270, 93);
campo(danfe.getValorTotalDosProdutosFormatado(), 492, 278, 93, 'right');
titulo('VALOR DO FRETE', 1.5, 290, 84);
campo(danfe.getValorDoFreteFormatado(), 1.5, 298, 84, 'right');
titulo('VALOR DO SEGURO', 89, 290, 84);
campo(danfe.getValorDoSeguroFormatado(), 89, 298, 84, 'right');
titulo('DESCONTO', 177, 290, 84);
campo(danfe.getDescontoFormatado(), 177, 298, 84, 'right');
titulo('OUTRAS DESPESAS', 265, 290, 84);
campo(danfe.getOutrasDespesasFormatado(), 265, 298, 84, 'right');
titulo('VALOR TOTAL DO IPI', 353, 290, 84);
campo(impostos.getValorTotalDoIpiFormatado(), 353, 298, 84, 'right');
titulo('VALOR DA COFINS', 440.5, 290.5, 47, null, args.tamanhoDaFonteDoTitulo - 1);
campo(impostos.getValorDaCofinsFormatado(), 440.5, 298, 47, 'right');
titulo('VALOR TOTAL DA NOTA', 492, 290, 93);
campo(danfe.getValorTotalDaNotaFormatado(false), 492, 298, 93, 'right');
//QUARTO BLOCO
secao('TRANSPORTADOR / VOLUMES TRANSPORTADOS', 1.5, 312.5);
titulo('NOME / RAZÃO SOCIAL', 1.5, 321, 166.5);
campo(transportador.getNome(), 1.5, 329, 166.5, 'left');
titulo('FRETE POR CONTA', 171.5, 321, 85);
campo(danfe.getModalidadeDoFreteFormatada(), 171.5, 329, 85);
titulo('CÓDIGO ANTT', 259.5, 321, 84);
campo(transportador.getCodigoAntt(), 259.5, 329, 84);
titulo('PLACA DO VEÍCULO', 347.5, 321, 84);
campo(transportador.getPlacaDoVeiculoFormatada(), 347.5, 329, 84);
titulo('UF', 435.5, 321, 19.5);
campo(transportador.getUfDaPlacaDoVeiculo(), 435.5, 329, 19.5);
titulo('CNPJ / CPF', 458, 321, 126.5);
campo(transportador.getRegistroNacionalFormatado(), 458, 329, 126.5);
titulo('ENDEREÇO', 1.5, 341, 254);
campo(transportador.getEndereco().getPrimeiraLinha(), 1.5, 349, 254, 'left', args.tamanhoDaFonteDoCampo - 0.5);
titulo('MUNICÍPIO', 259.5, 341, 172);
campo(transportador.getEndereco().getMunicipio(), 259.5, 349, 172);
titulo('UF', 435.5, 341, 19.5);
campo(transportador.getEndereco().getUf(), 435.5, 349, 19.5);
titulo('INSCRIÇÃO ESTADUAL', 458, 341, 126.5);
campo(transportador.getInscricaoEstadual(), 458, 349, 126.5);
titulo('QUANTIDADE', 1.5, 361, 56.5);
campo(volumes.getQuantidadeFormatada(), 1.5, 369, 56.5);
titulo('ESPÉCIE', 60.8, 361, 96);
campo(volumes.getEspecie(), 60.8, 369, 96);
titulo('MARCA', 160, 361, 96);
campo(volumes.getMarca(), 160, 369, 96);
titulo('NUMERAÇÃO', 259.5, 361, 96);
campo(volumes.getNumeracao(), 259.5, 369, 96);
titulo('PESO BRUTO', 358.5, 361, 112.5);
campo(volumes.getPesoBruto(), 358.5, 369, 112.5);
titulo('PESO LÍQUIDO', 474.5, 361, 110.5);
campo(volumes.getPesoLiquido(), 474.5, 369, 110.5);
var alturaDaSecaoDosItens = 383,
alturaDosTitulosDosItens;
if(fatura || duplicatas.length) {
secao('FATURA / DUPLICATAS', 1.5, 383);
alturaDaSecaoDosItens += alturaDoBlocoFaturaDuplicatas;
}
if(fatura) {
var dadosDaFatura = [];
if(fatura.getNumero()) {
dadosDaFatura.push('NÚMERO: ' + fatura.getNumero());
}
if(fatura.getNumero()) {
dadosDaFatura.push('VALOR ORIGINAL: ' + fatura.getValorOriginalFormatado());
}
if(fatura.getNumero()) {
dadosDaFatura.push('VALOR DO DESCONTO: ' + fatura.getValorDoDescontoFormatado());
}
if(fatura.getNumero()) {
dadosDaFatura.push('VALOR LÍQUIDO: ' + fatura.getValorLiquidoFormatado());
}
if(fatura.getFormaDePagamento()) {
dadosDaFatura.push('PAGAMENTO: ' + fatura.getFormaDePagamento());
}
dadosDaFatura = dadosDaFatura.join(' - ');
if(dadosDaFatura) {
negrito(dadosDaFatura, 1.5, 390, larguraDoFormulario, 'left');
}
}
alturaDosTitulosDosItens = alturaDaSecaoDosItens + 12;
// QUINTO BLOCO - LISTA DE PRODUTOS
secao('DADOS DOS PRODUTOS / SERVIÇOS', 1.5, alturaDaSecaoDosItens);
titulo('CÓDIGO', 1.5, alturaDosTitulosDosItens, 50.5, args.alinhamentoDoTituloDaTabela);
titulo('DESCRIÇÃO DO PRODUTO / SERVIÇO', 55, alturaDosTitulosDosItens, 179, args.alinhamentoDoTituloDaTabela);
titulo('NCM/SH', 236.5, alturaDosTitulosDosItens, 31.5, args.alinhamentoDoTituloDaTabela);
titulo('O/CST', 270.5, alturaDosTitulosDosItens, 20, args.alinhamentoDoTituloDaTabela);
titulo('CFOP', 293.5, alturaDosTitulosDosItens, 19.5, args.alinhamentoDoTituloDaTabela);
titulo('UN.', 316, alturaDosTitulosDosItens, 14.5, args.alinhamentoDoTituloDaTabela);
titulo('QUANT.', 333, alturaDosTitulosDosItens, 37, args.alinhamentoDoTituloDaTabela);
titulo('VALOR UNIT.', 373, alturaDosTitulosDosItens - 4, 31.5, args.alinhamentoDoTituloDaTabela);
titulo('VALOR TOTAL', 407.5, alturaDosTitulosDosItens - 4, 31.5, args.alinhamentoDoTituloDaTabela);
titulo('B. CÁLC. ICMS', 441.5, alturaDosTitulosDosItens - 4, 31.5, args.alinhamentoDoTituloDaTabela);
titulo('VALOR ICMS', 475, alturaDosTitulosDosItens - 4, 31.5, args.alinhamentoDoTituloDaTabela);
titulo('VALOR IPI', 508, alturaDosTitulosDosItens - 4, 28, args.alinhamentoDoTituloDaTabela);
titulo('ALÍQ. ICMS', 532, alturaDosTitulosDosItens - 4, 28, args.alinhamentoDoTituloDaTabela);
titulo('ALÍQ. IPI', 557, alturaDosTitulosDosItens, 28, args.alinhamentoDoTituloDaTabela);
// SEXTO BLOCO
if(deveExibirQuadroDeCalculoDoIssqn) {
secao('CÁLCULO DO ISSQN', 1.5, 754.5);
titulo('INSCRIÇÃO MUNICIPAL', 1.5, 763, 132.5);
campo(emitente.getInscricaoMunicipal(), 1.5, 771, 132.5, 'left');
titulo('VALOR TOTAL DOS SERVIÇOS', 137.5, 763, 132.5);
campo(danfe.getValorTotalDosServicosFormatado(), 137.5, 771, 132.5, 'right');
titulo('BASE DE CÁLCULO DO ISSQN', 273.5, 763, 132.5);
campo(impostos.getBaseDeCalculoDoIssqnFormatada(), 273.5, 771, 132.5, 'right');
titulo('VALOR TOTAL DO ISSQN', 409.5, 763, 175.5);
campo(impostos.getValorTotalDoIssqnFormatado(), 409.5, 771, 175.5, 'right');
}
var alturaDaSecaoDoSetimoBloco = 786,
alturaDosTitulosDoSetimoBloco;
if(!deveExibirQuadroDeCalculoDoIssqn) {
alturaDaSecaoDoSetimoBloco = 754;
}
alturaDosTitulosDoSetimoBloco = alturaDaSecaoDoSetimoBloco + 9;
// SÉTIMO BLOCO
secao('DADOS ADICIONAIS', 1.5, alturaDaSecaoDoSetimoBloco);
titulo('INFORMAÇÕES COMPLEMENTARES', 1.5, alturaDosTitulosDoSetimoBloco, 385);
titulo('RESERVADO AO FISCO', 390, alturaDosTitulosDoSetimoBloco, 195);
if(args.creditos) {
italico(args.creditos, 1.5, 827, larguraDoFormulario);
}
}
desenharPagina();
var numeroDePaginas = 1,
yInicialDosItens = 406 + alturaDoBlocoFaturaDuplicatas,
yDoItemAtual = yInicialDosItens,
alturaAtual = 0;
itens.forEach(function(item) {
function renderizarLinha(pdf) {
normal(item.getCodigo(), 1.5, yDoItemAtual, 51, 'center', args.tamanhoDaFonteDosItens, pdf);
var maiorY = pdf.y;
var descricao = item.getDescricao();
if(item.getInformacoesAdicionais()) {
descricao += '\n' + item.getInformacoesAdicionais();
}
normal(descricao, 55.5, yDoItemAtual, 178, 'justify', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getNcmSh(), 235.5, yDoItemAtual, 32.5, 'center', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getOCst(), 270, yDoItemAtual, 21, 'center', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getCfop(), 293.5, yDoItemAtual, 21, 'center', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getUnidade(), 315, yDoItemAtual, 16.5, 'center', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getQuantidadeFormatada(), 332.5, yDoItemAtual, 37.5, 'right', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getValorUnitarioFormatado(), 372, yDoItemAtual, 32.5, 'right', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getValorTotalFormatado(), 407, yDoItemAtual, 31, 'right', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getBaseDeCalculoDoIcmsFormatada(), 440, yDoItemAtual, 32.5, 'right', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getBaseDeCalculoDoIcmsFormatada(), 440, yDoItemAtual, 32.5, 'right', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getValorDoIcmsFormatado(), 474.5, yDoItemAtual, 32, 'right', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getValorDoIpiFormatado(), 508.5, yDoItemAtual, 26, 'right', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getAliquotaDoIcmsFormatada(), 536, yDoItemAtual + 0.65, 19, 'center', args.tamanhoDaFonteDosItens - 1, pdf);
maiorY = Math.max(maiorY, pdf.y);
normal(item.getAliquotaDoIpiFormatada(), 556.5, yDoItemAtual, 29, 'center', args.tamanhoDaFonteDosItens, pdf);
maiorY = Math.max(maiorY, pdf.y);
if(args.separadorDeItens) {
linhaHorizontalTracejada(0, 0, maiorY);
}
return maiorY + (args.separadorDeItens ? 2 : 0);
}
var altura = renderizarLinha(pdfTemporario) - yDoItemAtual;
if(alturaAtual + altura > (751 - yInicialDosItens)) {
numeroDePaginas += 1;
pdf.addPage();
yDoItemAtual = yInicialDosItens;
alturaAtual = 0;
desenharPagina();
}
renderizarLinha(pdf);
alturaAtual += altura;
yDoItemAtual = yDoItemAtual + altura;
});
var paginas = pdf.bufferedPageRange();
for(var i = paginas.start; i < paginas.start + paginas.count; i++) {
pdf.switchToPage(i);
italico('FOLHA ' + (i + 1) + '/' + numeroDePaginas, 241.2, 141.2, 98.5, 'center', 8);
}
pdf.flushPages();
pdf.end();
callback(null, pdf);
};
//fswatch ./lib/geradores/geradorDePdf.js | xargs -n1 /usr/local/bin/nodeunit ./tests/geradorTest.js