/**
  *
  * @param string $code
  * @param float $x
  * @param float $y
  * @param float $w
  * @param float $h
  * @param object $pdf
  * @return void
  */
 public static function draw_code39($code, $x, $y, $w, $h, $pdf)
 {
     //Dessine les barres
     $pdf->SetDrawColor(0, 0, 0);
     $pdf->SetFillColor(0, 0, 0);
     for ($i = 0; $i < strlen($code); $i++) {
         if ($code[$i] == '1') {
             $pdf->Rect($x + $i * $w, $y, $w, $h, 'F');
         }
     }
 }
Esempio n. 2
0
 /**
  * montaDANFE
  * Monta a DANFE conforme as informações fornecidas para a classe durante sua
  * construção. Constroi DANFEs com até 3 páginas podendo conter até 56 itens.
  * A definição de margens e posições iniciais para a impressão são estabelecidas
  * pelo conteúdo da funçao e podem ser modificados.
  * @param string $orientacao (Opcional) Estabelece a orientação da impressão
  *  (ex. P-retrato), se nada for fornecido será usado o padrão da NFe
  * @param string $papel (Opcional) Estabelece o tamanho do papel (ex. A4)
  * @return string O ID da NFe numero de 44 digitos extraido do arquivo XML
  */
 public function montaDANFE($orientacao = '', $papel = 'A4', $logoAlign = 'C', $situacaoExterna = NFEPHP_SITUACAO_EXTERNA_NONE, $classPdf = false, $depecNumReg = '')
 {
     //se a orientação estiver em branco utilizar o padrão estabelecido na NF
     if ($orientacao == '') {
         if ($this->tpImp == '1') {
             $orientacao = 'P';
         } else {
             $orientacao = 'L';
         }
     }
     $this->orientacao = $orientacao;
     $this->pAdicionaLogoPeloCnpj();
     $this->papel = $papel;
     $this->logoAlign = $logoAlign;
     $this->situacao_externa = $situacaoExterna;
     $this->numero_registro_dpec = $depecNumReg;
     //instancia a classe pdf
     if ($classPdf) {
         $this->pdf = $classPdf;
     } else {
         $this->pdf = new PdfNFePHP($this->orientacao, 'mm', $this->papel);
     }
     //margens do PDF, em milímetros. Obs.: a margem direita é sempre igual à
     //margem esquerda. A margem inferior *não* existe na FPDF, é definida aqui
     //apenas para controle se necessário ser maior do que a margem superior
     $margSup = 2;
     $margEsq = 2;
     $margInf = 2;
     // posição inicial do conteúdo, a partir do canto superior esquerdo da página
     $xInic = $margEsq;
     $yInic = $margSup;
     if ($this->orientacao == 'P') {
         if ($papel == 'A4') {
             $maxW = 210;
             $maxH = 297;
         }
     } else {
         if ($papel == 'A4') {
             $maxH = 210;
             $maxW = 297;
             //se paisagem multiplica a largura do canhoto pela quantidade de canhotos
             $this->wCanhoto *= $this->qCanhoto;
         }
     }
     //total inicial de paginas
     $totPag = 1;
     //largura imprimivel em mm: largura da folha menos as margens esq/direita
     $this->wPrint = $maxW - $margEsq * 2;
     //comprimento (altura) imprimivel em mm: altura da folha menos as margens
     //superior e inferior
     $this->hPrint = $maxH - $margSup - $margInf;
     // estabelece contagem de paginas
     $this->pdf->AliasNbPages();
     // fixa as margens
     $this->pdf->SetMargins($margEsq, $margSup);
     $this->pdf->SetDrawColor(0, 0, 0);
     $this->pdf->SetFillColor(255, 255, 255);
     // inicia o documento
     $this->pdf->Open();
     // adiciona a primeira página
     $this->pdf->AddPage($this->orientacao, $this->papel);
     $this->pdf->SetLineWidth(0.1);
     $this->pdf->SetTextColor(0, 0, 0);
     //##################################################################
     // CALCULO DO NUMERO DE PAGINAS A SEREM IMPRESSAS
     //##################################################################
     //Verificando quantas linhas serão usadas para impressão das duplicatas
     $linhasDup = 0;
     if ($this->dup->length > 0 && $this->dup->length <= 7) {
         $linhasDup = 1;
     } elseif ($this->dup->length > 7 && $this->dup->length <= 14) {
         $linhasDup = 2;
     } elseif ($this->dup->length > 14 && $this->dup->length <= 21) {
         $linhasDup = 3;
     } elseif ($this->dup->length > 21) {
         // TODO fmertins 20/08/14: mudar para "else" apenas? E acho que a variavel deveria receber outro valor, ja que esta igual a 3 que dá na mesma da condição anterior, parece ser bug? Talvez atribuir 4 ao inves de 3?
         $linhasDup = 3;
     }
     //verifica se será impressa a linha dos serviços ISSQN
     $linhaISSQN = 0;
     if (isset($this->ISSQNtot) && $this->pSimpleGetValue($this->ISSQNtot, 'vServ') > 0) {
         $linhaISSQN = 1;
     }
     //calcular a altura necessária para os dados adicionais
     if ($this->orientacao == 'P') {
         $this->wAdic = round($this->wPrint * 0.66, 0);
     } else {
         $this->wAdic = round(($this->wPrint - $this->wCanhoto) * 0.5, 0);
     }
     $fontProduto = array('font' => $this->fontePadrao, 'size' => 7, 'style' => '');
     $this->textoAdic = '';
     if (isset($this->retirada)) {
         $txRetCNPJ = !empty($this->retirada->getElementsByTagName("CNPJ")->item(0)->nodeValue) ? $this->retirada->getElementsByTagName("CNPJ")->item(0)->nodeValue : '';
         $txRetxLgr = !empty($this->retirada->getElementsByTagName("xLgr")->item(0)->nodeValue) ? $this->retirada->getElementsByTagName("xLgr")->item(0)->nodeValue : '';
         $txRetnro = !empty($this->retirada->getElementsByTagName("nro")->item(0)->nodeValue) ? $this->retirada->getElementsByTagName("nro")->item(0)->nodeValue : 's/n';
         $txRetxCpl = $this->pSimpleGetValue($this->retirada, "xCpl", " - ");
         $txRetxBairro = !empty($this->retirada->getElementsByTagName("xBairro")->item(0)->nodeValue) ? $this->retirada->getElementsByTagName("xBairro")->item(0)->nodeValue : '';
         $txRetxMun = !empty($this->retirada->getElementsByTagName("xMun")->item(0)->nodeValue) ? $this->retirada->getElementsByTagName("xMun")->item(0)->nodeValue : '';
         $txRetUF = !empty($this->retirada->getElementsByTagName("UF")->item(0)->nodeValue) ? $this->retirada->getElementsByTagName("UF")->item(0)->nodeValue : '';
         $this->textoAdic .= "LOCAL DE RETIRADA : " . $txRetCNPJ . '-' . $txRetxLgr . ', ' . $txRetnro . ' ' . $txRetxCpl . ' - ' . $txRetxBairro . ' ' . $txRetxMun . ' - ' . $txRetUF . "\r\n";
     }
     //dados do local de entrega da mercadoria
     if (isset($this->entrega)) {
         $txRetCNPJ = !empty($this->entrega->getElementsByTagName("CNPJ")->item(0)->nodeValue) ? $this->entrega->getElementsByTagName("CNPJ")->item(0)->nodeValue : '';
         $txRetxLgr = !empty($this->entrega->getElementsByTagName("xLgr")->item(0)->nodeValue) ? $this->entrega->getElementsByTagName("xLgr")->item(0)->nodeValue : '';
         $txRetnro = !empty($this->entrega->getElementsByTagName("nro")->item(0)->nodeValue) ? $this->entrega->getElementsByTagName("nro")->item(0)->nodeValue : 's/n';
         $txRetxCpl = $this->pSimpleGetValue($this->entrega, "xCpl", " - ");
         $txRetxBairro = !empty($this->entrega->getElementsByTagName("xBairro")->item(0)->nodeValue) ? $this->entrega->getElementsByTagName("xBairro")->item(0)->nodeValue : '';
         $txRetxMun = !empty($this->entrega->getElementsByTagName("xMun")->item(0)->nodeValue) ? $this->entrega->getElementsByTagName("xMun")->item(0)->nodeValue : '';
         $txRetUF = !empty($this->entrega->getElementsByTagName("UF")->item(0)->nodeValue) ? $this->entrega->getElementsByTagName("UF")->item(0)->nodeValue : '';
         if ($this->textoAdic != '') {
             $this->textoAdic .= ". \r\n";
         }
         $this->textoAdic .= "LOCAL DE ENTREGA : " . $txRetCNPJ . '-' . $txRetxLgr . ', ' . $txRetnro . ' ' . $txRetxCpl . ' - ' . $txRetxBairro . ' ' . $txRetxMun . ' - ' . $txRetUF . "\r\n";
     }
     //informações adicionais
     $this->textoAdic .= $this->pGeraInformacoesDasNotasReferenciadas();
     if (isset($this->infAdic)) {
         $i = 0;
         if ($this->textoAdic != '') {
             $this->textoAdic .= ". \r\n";
         }
         $this->textoAdic .= !empty($this->infAdic->getElementsByTagName("infCpl")->item(0)->nodeValue) ? 'Inf. Contribuinte: ' . trim($this->pAnfavea($this->infAdic->getElementsByTagName("infCpl")->item(0)->nodeValue)) : '';
         $infPedido = $this->pGeraInformacoesDaTagCompra();
         if ($infPedido != "") {
             $this->textoAdic .= $infPedido;
         }
         $this->textoAdic .= $this->pSimpleGetValue($this->dest, "email", ' Email do Destinatário: ');
         $this->textoAdic .= !empty($this->infAdic->getElementsByTagName("infAdFisco")->item(0)->nodeValue) ? "\r\n Inf. fisco: " . trim($this->infAdic->getElementsByTagName("infAdFisco")->item(0)->nodeValue) : '';
         $obsCont = $this->infAdic->getElementsByTagName("obsCont");
         if (isset($obsCont)) {
             foreach ($obsCont as $obs) {
                 $campo = $obsCont->item($i)->getAttribute("xCampo");
                 $xTexto = !empty($obsCont->item($i)->getElementsByTagName("xTexto")->item(0)->nodeValue) ? $obsCont->item($i)->getElementsByTagName("xTexto")->item(0)->nodeValue : '';
                 $this->textoAdic .= "\r\n" . $campo . ':  ' . trim($xTexto);
                 $i++;
             }
         }
     }
     //INCLUSO pela NT 2013.003 Lei da Transparência
     //verificar se a informação sobre o valor aproximado dos tributos
     //já se encontra no campo de informações adicionais
     if ($this->exibirValorTributos) {
         $flagVTT = strpos(strtolower(trim($this->textoAdic)), 'valor');
         $flagVTT = $flagVTT || strpos(strtolower(trim($this->textoAdic)), 'vl');
         $flagVTT = $flagVTT && strpos(strtolower(trim($this->textoAdic)), 'aprox');
         $flagVTT = $flagVTT && (strpos(strtolower(trim($this->textoAdic)), 'trib') || strpos(strtolower(trim($this->textoAdic)), 'imp'));
         $vTotTrib = $this->pSimpleGetValue($this->ICMSTot, 'vTotTrib');
         if ($vTotTrib != '' && !$flagVTT) {
             $this->textoAdic .= "\n Valor Aproximado dos Tributos : R\$ " . number_format($vTotTrib, 2, ",", ".");
         }
     }
     //fim da alteração NT 2013.003 Lei da Transparência
     $this->textoAdic = str_replace(";", "\n", $this->textoAdic);
     $alinhas = explode("\n", $this->textoAdic);
     $numlinhasdados = 0;
     foreach ($alinhas as $linha) {
         $numlinhasdados += $this->pGetNumLines($linha, $this->wAdic, $fontProduto);
     }
     $hdadosadic = round(($numlinhasdados + 3) * $this->pdf->FontSize, 0);
     if ($hdadosadic < 10) {
         $hdadosadic = 10;
     }
     //altura disponivel para os campos da DANFE
     $hcabecalho = 47;
     //para cabeçalho
     $hdestinatario = 25;
     //para destinatario
     $hduplicatas = 12;
     //para cada grupo de 7 duplicatas
     $himposto = 18;
     // para imposto
     $htransporte = 25;
     // para transporte
     $hissqn = 11;
     // para issqn
     $hfooter = 5;
     // para rodape
     $hCabecItens = 4;
     //cabeçalho dos itens
     //alturas disponiveis para os dados
     $hDispo1 = $this->hPrint - 10 - ($hcabecalho + $hdestinatario + $linhasDup * $hduplicatas + $himposto + $htransporte + $linhaISSQN * $hissqn + $hdadosadic + $hfooter + $hCabecItens + $this->pSizeExtraTextoFatura());
     if ($this->orientacao == 'P') {
         $hDispo1 -= 23 * $this->qCanhoto;
         //para canhoto
     } else {
         $hcanhoto = $this->hPrint;
         //para canhoto
     }
     $hDispo2 = $this->hPrint - 10 - ($hcabecalho + $hfooter + $hCabecItens) - 4;
     //Contagem da altura ocupada para impressão dos itens
     $fontProduto = array('font' => $this->fontePadrao, 'size' => 7, 'style' => '');
     $i = 0;
     $numlinhas = 0;
     $hUsado = $hCabecItens;
     $w2 = round($this->wPrint * 0.31, 0);
     $hDispo = $hDispo1;
     $totPag = 1;
     while ($i < $this->det->length) {
         $texto = $this->pDescricaoProduto($this->det->item($i));
         $numlinhas = $this->pGetNumLines($texto, $w2, $fontProduto);
         $hUsado += round($numlinhas * $this->pdf->FontSize + $numlinhas * 0.5, 2);
         if ($hUsado > $hDispo) {
             $totPag++;
             $hDispo = $hDispo2;
             $hUsado = 7;
         }
         $i++;
     }
     //fim da soma das areas de itens usadas
     $qtdeItens = $i;
     //controle da quantidade de itens no DANFE
     //montagem da primeira página
     $pag = 1;
     $x = $xInic;
     $y = $yInic;
     //coloca o(s) canhoto(s) da NFe
     if ($this->orientacao == 'P') {
         for ($i = 1; $i <= $this->qCanhoto; $i++) {
             $y = $this->pCanhoto($x, $y);
         }
     } else {
         for ($i = 1; $i <= $this->qCanhoto; $i++) {
             $this->pCanhoto($x, $y);
             $x = 25 * $i;
         }
     }
     //coloca o cabeçalho
     $y = $this->pCabecalhoDANFE($x, $y, $pag, $totPag);
     //coloca os dados do destinatário
     $y = $this->pDestinatarioDANFE($x, $y + 1);
     //coloca os dados das faturas
     $y = $this->pFaturaDANFE($x, $y + 1);
     //coloca os dados dos impostos e totais da NFe
     $y = $this->pImpostoDANFE($x, $y + 1);
     //coloca os dados do trasnporte
     $y = $this->pTransporteDANFE($x, $y + 1);
     //itens da DANFE
     $nInicial = 0;
     $y = $this->pItensDANFE($x, $y + 1, $nInicial, $hDispo1, $pag, $totPag);
     //coloca os dados do ISSQN
     if ($linhaISSQN == 1) {
         $y = $this->pIssqnDANFE($x, $y + 4);
     } else {
         $y += 4;
     }
     //coloca os dados adicionais da NFe
     $y = $this->pDadosAdicionaisDANFE($x, $y, $hdadosadic);
     //coloca o rodapé da página
     if ($this->orientacao == 'P') {
         $this->pRodape($xInic, $y - 1);
     } else {
         $this->pRodape($xInic, $this->hPrint + 1);
     }
     //loop para páginas seguintes
     for ($n = 2; $n <= $totPag; $n++) {
         // fixa as margens
         $this->pdf->SetMargins($margEsq, $margSup);
         //adiciona nova página
         $this->pdf->AddPage($this->orientacao, $this->papel);
         //ajusta espessura das linhas
         $this->pdf->SetLineWidth(0.1);
         //seta a cor do texto para petro
         $this->pdf->SetTextColor(0, 0, 0);
         // posição inicial do relatorio
         $x = $xInic;
         $y = $yInic;
         //coloca o cabeçalho na página adicional
         $y = $this->pCabecalhoDANFE($x, $y, $n, $totPag);
         //coloca os itens na página adicional
         $y = $this->pItensDANFE($x, $y + 1, $nInicial, $hDispo2, $pag, $totPag);
         //coloca o rodapé da página
         if ($this->orientacao == 'P') {
             $this->pRodape($xInic, $y + 4);
         } else {
             $this->pRodape($xInic, $this->hPrint + 4);
         }
         //se estiver na última página e ainda restar itens para inserir, adiciona mais uma página
         if ($n == $totPag && $this->qtdeItensProc < $qtdeItens) {
             $totPag++;
         }
     }
     //retorna o ID na NFe
     if ($classPdf !== false) {
         $aR = array('id' => str_replace('NFe', '', $this->infNFe->getAttribute("Id")), 'classe_PDF' => $this->pdf);
         return $aR;
     } else {
         return str_replace('NFe', '', $this->infNFe->getAttribute("Id"));
     }
 }
Esempio n. 3
0
 /**
  * Sets the style of subsequent lines as specificed by $style
  *
  * $style is an object with $color and $width properties
  *
  * @param stdClass $style
  */
 public static function change_line_style(stdClass $style)
 {
     $colour = isset($font->colour) ? self::parse_colour($style->colour) : '';
     $width = isset($font->width) ? $style->width : '';
     if (!empty($colour)) {
         self::$pdf->SetDrawColor($colour['red'], $colour['green'], $colour['blue']);
     }
     if (!empty($width)) {
         self::$pdf->SetLineWidth($width);
     }
 }