//campo livre (sem dv) é 24 digitos
$campo_livre = $conta_cedente . $conta_cedente_dv . formata_numero($dadosboleto["nosso_numero1"], 3, 0) . formata_numero($dadosboleto["nosso_numero_const1"], 1, 0) . formata_numero($dadosboleto["nosso_numero2"], 3, 0) . formata_numero($dadosboleto["nosso_numero_const2"], 1, 0) . formata_numero($dadosboleto["nosso_numero3"], 9, 0);
//dv do campo livre
$dv_campo_livre = digitoVerificador_nossonumero($campo_livre);
$campo_livre_com_dv = "{$campo_livre}{$dv_campo_livre}";
//nosso número (sem dv) é 17 digitos
$nnum = formata_numero($dadosboleto["nosso_numero_const1"], 1, 0) . formata_numero($dadosboleto["nosso_numero_const2"], 1, 0) . formata_numero($dadosboleto["nosso_numero1"], 3, 0) . formata_numero($dadosboleto["nosso_numero2"], 3, 0) . formata_numero($dadosboleto["nosso_numero3"], 9, 0);
//nosso número completo (com dv) com 18 digitos
$nossonumero = $nnum . digitoVerificador_nossonumero($nnum);
// 43 numeros para o calculo do digito verificador do codigo de barras
$dv = digitoVerificador_barra("{$codigobanco}{$nummoeda}{$fator_vencimento}{$valor}{$campo_livre_com_dv}", 9, 0);
// Numero para o codigo de barras com 44 digitos
$linha = "{$codigobanco}{$nummoeda}{$dv}{$fator_vencimento}{$valor}{$campo_livre_com_dv}";
$agencia_codigo = $agencia . " / " . $conta_cedente . "-" . $conta_cedente_dv;
$dadosboleto["codigo_barras"] = $linha;
$linhaDigitavel = monta_linha_digitavel($linha);
$dadosboleto["linha_digitavel"] = $linhaDigitavel;
$dadosboleto["agencia_codigo"] = $agencia_codigo;
$dadosboleto["nosso_numero"] = $nossonumero;
$dadosboleto["codigo_banco_com_dv"] = $codigo_banco_com_dv;
function digitoVerificador_nossonumero($numero)
{
    $resto2 = modulo_11($numero, 9, 1);
    $digito = 11 - $resto2;
    if ($digito == 10 || $digito == 11) {
        $dv = 0;
    } else {
        $dv = $digito;
    }
    return $dv;
}
//dv do nosso número
$dv_nosso_numero = digitoVerificador_nossonumero($nnum);
$nossonumero_dv = "{$nnum}{$dv_nosso_numero}";
//conta cedente (sem dv) é 11 digitos
$conta_cedente = formata_numero($dadosboleto["conta_cedente"], 11, 0);
//dv da conta cedente
$conta_cedente_dv = formata_numero($dadosboleto["conta_cedente_dv"], 1, 0);
$ag_contacedente = $agencia . $conta_cedente;
// 43 numeros para o calculo do digito verificador do codigo de barras
$dv = digitoVerificador_barra("{$codigobanco}{$nummoeda}{$fator_vencimento}{$valor}{$nnum}{$ag_contacedente}", 9, 0);
// Numero para o codigo de barras com 44 digitos
$linha = "{$codigobanco}{$nummoeda}{$dv}{$fator_vencimento}{$valor}{$nnum}{$ag_contacedente}";
$nossonumero = substr($nossonumero_dv, 0, 10) . '-' . substr($nossonumero_dv, 10, 1);
$agencia_codigo = $agencia . " / " . $conta_cedente . "-" . $conta_cedente_dv;
$dadosboleto["codigo_barras"] = $linha;
$dadosboleto["linha_digitavel"] = monta_linha_digitavel($linha);
$dadosboleto["agencia_codigo"] = $agencia_codigo;
$dadosboleto["nosso_numero"] = $nossonumero;
$dadosboleto["codigo_banco_com_dv"] = $codigo_banco_com_dv;
function digitoVerificador_nossonumero($numero)
{
    $resto2 = modulo_11($numero, 9, 1);
    $digito = 11 - $resto2;
    if ($digito == 10 || $digito == 11) {
        $dv = 0;
    } else {
        $dv = $digito;
    }
    return $dv;
}
function digitoVerificador_barra($numero)
//conta é 7 digitos
$conta    = formata_numero($dadosboleto["conta"], 7, 0);
//nosso número: 13 digitos
$nossonum = formata_numero($dadosboleto["nosso_numero"], 13, 0);

// Calcula o Digitão da Cobrança
$digitao = modulo_10($nossonum . $agencia . $conta);
if ($digitao == 10) $digitao = 0;

// 43 numeros para o calculo do digito verificador do codigo de barras
$dv = modulo_11($codigobanco . $nummoeda . $fator_vencimento . $valor . $agencia . $conta . $digitao . $nossonum, 9, 1);
$dv = ($dv == 0 || $dv == 1) ? 1 : 11 - $dv;

// Dados finais
$dadosboleto["codigo_barras"]       = $codigobanco . $nummoeda . $dv . $fator_vencimento . $valor . $agencia . $conta . $digitao . $nossonum;
$dadosboleto["linha_digitavel"]     = monta_linha_digitavel($codigobanco . $nummoeda . $agencia . $conta . $digitao . $nossonum . $dv . $fator_vencimento . $valor);
$dadosboleto["agencia_codigo"]      = $agencia . '/' . $conta . '/' . $digitao;
$dadosboleto["nosso_numero"]        = $nossonum;
$dadosboleto["codigo_banco_com_dv"] = $codigo_banco_com_dv;

// FUNÇÕES
// Algumas foram retiradas do Projeto PhpBoleto e modificadas para atender as particularidades de cada banco

function formata_numero($numero,$loop,$insert,$tipo = "geral") {
	if ($tipo == "geral") {
		$numero = str_replace(",","",$numero);
		while(strlen($numero)<$loop){
			$numero = $insert . $numero;
		}
	}
	if ($tipo == "valor") {