/** * Draw mark * * @param object $g plot object reference * @access private * @return void */ private function _drawMark(&$g, $type, $color, $fcolor, $size) { if ($type) { $g->SetType($this->_getMark($type)); } if ($color) { $g->SetColor($color); } if ($fcolor) { $g->SetFillColor($fcolor); } if ($size) { $g->SetSize($size); } }
/** * * @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'); } } }
/** *cabecalhoDANFE * Monta o cabelhalho da DANFE (retrato e paisagem) * * @param number $x Posição horizontal inicial, canto esquerdo * @param number $y Posição vertical inicial, canto superior * @param number $pag Número da Página * @param number$totPag Total de páginas * @return number Posição vertical final */ protected function pCabecalhoDANFE($x = 0, $y = 0, $pag = '1', $totPag = '1') { $oldX = $x; $oldY = $y; if ($this->orientacao == 'P') { $maxW = $this->wPrint; } else { if ($pag == 1) { // primeira página $maxW = $this->wPrint - $this->wCanhoto; } else { // páginas seguintes $maxW = $this->wPrint; } } //#################################################################################### //coluna esquerda identificação do emitente $w = round($maxW * 0.41, 0); if ($this->orientacao == 'P') { $aFont = array('font' => $this->fontePadrao, 'size' => 6, 'style' => 'I'); } else { $aFont = array('font' => $this->fontePadrao, 'size' => 8, 'style' => 'B'); } $w1 = $w; $h = 32; $oldY += $h; $this->pTextBox($x, $y, $w, $h); $texto = 'IDENTIFICAÇÃO DO EMITENTE'; $this->pTextBox($x, $y, $w, 5, $texto, $aFont, 'T', 'C', 0, ''); //estabelecer o alinhamento //pode ser left L, center C, right R, full logo L //se for left separar 1/3 da largura para o tamanho da imagem //os outros 2/3 serão usados para os dados do emitente //se for center separar 1/2 da altura para o logo e 1/2 para os dados //se for right separa 2/3 para os dados e o terço seguinte para o logo //se não houver logo centraliza dos dados do emitente // coloca o logo if (is_file($this->logomarca)) { $logoInfo = getimagesize($this->logomarca); //largura da imagem em mm $logoWmm = $logoInfo[0] / 72 * 25.4; //altura da imagem em mm $logoHmm = $logoInfo[1] / 72 * 25.4; if ($this->logoAlign == 'L') { $nImgW = round($w / 3, 0); $nImgH = round($logoHmm * ($nImgW / $logoWmm), 0); $xImg = $x + 1; $yImg = round(($h - $nImgH) / 2, 0) + $y; //estabelecer posições do texto $x1 = round($xImg + $nImgW + 1, 0); $y1 = round($h / 3 + $y, 0); $tw = round(2 * $w / 3, 0); } elseif ($this->logoAlign == 'C') { $nImgH = round($h / 3, 0); $nImgW = round($logoWmm * ($nImgH / $logoHmm), 0); $xImg = round(($w - $nImgW) / 2 + $x, 0); $yImg = $y + 3; $x1 = $x; $y1 = round($yImg + $nImgH + 1, 0); $tw = $w; } elseif ($this->logoAlign == 'R') { $nImgW = round($w / 3, 0); $nImgH = round($logoHmm * ($nImgW / $logoWmm), 0); $xImg = round($x + ($w - (1 + $nImgW)), 0); $yImg = round(($h - $nImgH) / 2, 0) + $y; $x1 = $x; $y1 = round($h / 3 + $y, 0); $tw = round(2 * $w / 3, 0); } elseif ($this->logoAlign == 'F') { $nImgH = round($h - 5, 0); $nImgW = round($logoWmm * ($nImgH / $logoHmm), 0); $xImg = round(($w - $nImgW) / 2 + $x, 0); $yImg = $y + 3; $x1 = $x; $y1 = round($yImg + $nImgH + 1, 0); $tw = $w; } $this->pdf->Image($this->logomarca, $xImg, $yImg, $nImgW, $nImgH); } else { $x1 = $x; $y1 = round($h / 3 + $y, 0); $tw = $w; } // monta as informações apenas se diferente de full logo if ($this->logoAlign !== 'F') { //Nome emitente $aFont = array('font' => $this->fontePadrao, 'size' => 12, 'style' => 'B'); $texto = $this->emit->getElementsByTagName("xNome")->item(0)->nodeValue; $this->pTextBox($x1, $y1, $tw, 8, $texto, $aFont, 'T', 'C', 0, ''); //endereço $y1 = $y1 + 5; $aFont = array('font' => $this->fontePadrao, 'size' => 8, 'style' => ''); $fone = !empty($this->enderEmit->getElementsByTagName("fone")->item(0)->nodeValue) ? $this->enderEmit->getElementsByTagName("fone")->item(0)->nodeValue : ''; $lgr = $this->pSimpleGetValue($this->enderEmit, "xLgr"); $nro = $this->pSimpleGetValue($this->enderEmit, "nro"); $cpl = $this->pSimpleGetValue($this->enderEmit, "xCpl", " - "); $bairro = $this->pSimpleGetValue($this->enderEmit, "xBairro"); $CEP = $this->pSimpleGetValue($this->enderEmit, "CEP"); $CEP = $this->pFormat($CEP, "#####-###"); $mun = $this->pSimpleGetValue($this->enderEmit, "xMun"); $UF = $this->pSimpleGetValue($this->enderEmit, "UF"); $texto = $lgr . ", " . $nro . $cpl . "\n" . $bairro . " - " . $CEP . "\n" . $mun . " - " . $UF . " " . "Fone/Fax: " . $fone; $this->pTextBox($x1, $y1, $tw, 8, $texto, $aFont, 'T', 'C', 0, ''); } //#################################################################################### //coluna central Danfe $x += $w; $w = round($maxW * 0.17, 0); //35; $w2 = $w; $h = 32; $this->pTextBox($x, $y, $w, $h); if (!$this->pNotaCancelada()) { // A PRINCIPIO NÃO PRECISAVA, POIS A NFE ESTÁ AUTORIZADA, // SÓ SE RETIRA O DANFE PARA NOTAS NÃO AUTORIZADAS $texto = "DANFE"; $aFont = array('font' => $this->fontePadrao, 'size' => 14, 'style' => 'B'); $this->pTextBox($x, $y + 1, $w, $h, $texto, $aFont, 'T', 'C', 0, ''); $aFont = array('font' => $this->fontePadrao, 'size' => 8, 'style' => ''); $texto = 'Documento Auxiliar da Nota Fiscal Eletrônica'; $h = 20; $this->pTextBox($x, $y + 6, $w, $h, $texto, $aFont, 'T', 'C', 0, '', false); } $aFont = array('font' => $this->fontePadrao, 'size' => 8, 'style' => ''); $texto = '0 - ENTRADA'; $y1 = $y + 14; $h = 8; $this->pTextBox($x + 2, $y1, $w, $h, $texto, $aFont, 'T', 'L', 0, ''); $texto = '1 - SAÍDA'; $y1 = $y + 17; $this->pTextBox($x + 2, $y1, $w, $h, $texto, $aFont, 'T', 'L', 0, ''); //tipo de nF $aFont = array('font' => $this->fontePadrao, 'size' => 12, 'style' => 'B'); $y1 = $y + 13; $h = 7; $texto = $this->ide->getElementsByTagName('tpNF')->item(0)->nodeValue; $this->pTextBox($x + 27, $y1, 5, $h, $texto, $aFont, 'C', 'C', 1, ''); //numero da NF $aFont = array('font' => $this->fontePadrao, 'size' => 10, 'style' => 'B'); $y1 = $y + 20; $numNF = str_pad($this->ide->getElementsByTagName('nNF')->item(0)->nodeValue, 9, "0", STR_PAD_LEFT); $numNF = $this->pFormat($numNF, "###.###.###"); $texto = "Nº. " . $numNF; $this->pTextBox($x, $y1, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); //Série $y1 = $y + 23; $serie = str_pad($this->ide->getElementsByTagName('serie')->item(0)->nodeValue, 3, "0", STR_PAD_LEFT); $texto = "Série " . $serie; $this->pTextBox($x, $y1, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); //numero paginas $aFont = array('font' => $this->fontePadrao, 'size' => 8, 'style' => 'I'); $y1 = $y + 26; $texto = "Folha " . $pag . "/" . $totPag; $this->pTextBox($x, $y1, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); //#################################################################################### //coluna codigo de barras $x += $w; $w = $maxW - $w1 - $w2; //85; $w3 = $w; $h = 32; $this->pTextBox($x, $y, $w, $h); $this->pdf->SetFillColor(0, 0, 0); $chave_acesso = str_replace('NFe', '', $this->infNFe->getAttribute("Id")); $bW = 75; $bH = 12; //codigo de barras $this->pdf->Code128($x + ($w - $bW) / 2, $y + 2, $chave_acesso, $bW, $bH); //linhas divisorias $this->pdf->Line($x, $y + 4 + $bH, $x + $w, $y + 4 + $bH); $this->pdf->Line($x, $y + 12 + $bH, $x + $w, $y + 12 + $bH); $aFont = array('font' => $this->fontePadrao, 'size' => 6, 'style' => ''); $y1 = $y + 4 + $bH; $h = 7; $texto = 'CHAVE DE ACESSO'; $this->pTextBox($x, $y1, $w, $h, $texto, $aFont, 'T', 'L', 0, ''); $aFont = array('font' => $this->fontePadrao, 'size' => 8, 'style' => 'B'); $y1 = $y + 8 + $bH; $texto = $this->pFormat($chave_acesso, $this->formatoChave); $this->pTextBox($x + 2, $y1, $w - 2, $h, $texto, $aFont, 'T', 'C', 0, ''); $y1 = $y + 12 + $bH; $aFont = array('font' => $this->fontePadrao, 'size' => 8, 'style' => ''); $chaveContingencia = ""; if ($this->pNotaDPEC()) { $cabecalhoProtoAutorizacao = 'NÚMERO DE REGISTRO DPEC'; } else { $cabecalhoProtoAutorizacao = 'PROTOCOLO DE AUTORIZAÇÃO DE USO'; } if (($this->tpEmis == 2 || $this->tpEmis == 5) && !$this->pNotaDPEC()) { $cabecalhoProtoAutorizacao = "DADOS DA NF-E"; $chaveContingencia = $this->pGeraChaveAdicionalDeContingencia(); $this->pdf->SetFillColor(0, 0, 0); //codigo de barras $this->pdf->Code128($x + 11, $y1 + 1, $chaveContingencia, $bW * 0.9, $bH / 2); } else { $texto = 'Consulta de autenticidade no portal nacional da NF-e'; $this->pTextBox($x + 2, $y1, $w - 2, $h, $texto, $aFont, 'T', 'C', 0, ''); $y1 = $y + 16 + $bH; $texto = 'www.nfe.fazenda.gov.br/portal ou no site da Sefaz Autorizadora'; $this->pTextBox($x + 2, $y1, $w - 2, $h, $texto, $aFont, 'T', 'C', 0, 'http://www.nfe.fazenda.gov.br/portal ou no site da Sefaz Autorizadora'); } //#################################################################################### //Dados da NF do cabeçalho //natureza da operação $texto = 'NATUREZA DA OPERAÇÃO'; $aFont = array('font' => $this->fontePadrao, 'size' => 6, 'style' => ''); $w = $w1 + $w2; $y = $oldY; $oldY += $h; $x = $oldX; $h = 7; $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'T', 'L', 1, ''); $texto = $this->ide->getElementsByTagName("natOp")->item(0)->nodeValue; $aFont = array('font' => $this->fontePadrao, 'size' => 10, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'B', 'C', 0, ''); $x += $w; $w = $w3; //PROTOCOLO DE AUTORIZAÇÃO DE USO ou DADOS da NF-E $aFont = array('font' => $this->fontePadrao, 'size' => 6, 'style' => ''); $this->pTextBox($x, $y, $w, $h, $cabecalhoProtoAutorizacao, $aFont, 'T', 'L', 1, ''); // algumas NFe podem estar sem o protocolo de uso portanto sua existencia deve ser // testada antes de tentar obter a informação. // NOTA : DANFE sem protocolo deve existir somente no caso de contingência !!! // Além disso, existem várias NFes em contingência que eu recebo com protocolo de autorização. // Na minha opinião, deveríamos mostra-lo, mas o manual da NFe v4.01 diz outra coisa... if (($this->tpEmis == 2 || $this->tpEmis == 5) && !$this->pNotaDPEC()) { $aFont = array('font' => $this->fontePadrao, 'size' => 8, 'style' => 'B'); $texto = $this->pFormat($chaveContingencia, "#### #### #### #### #### #### #### #### ####"); $cStat = ''; } else { $aFont = array('font' => $this->fontePadrao, 'size' => 10, 'style' => 'B'); if ($this->pNotaDPEC()) { $texto = $this->numero_registro_dpec; $cStat = ''; } else { if (isset($this->nfeProc)) { $texto = !empty($this->nfeProc->getElementsByTagName("nProt")->item(0)->nodeValue) ? $this->nfeProc->getElementsByTagName("nProt")->item(0)->nodeValue : ''; $tsHora = $this->pConvertTime($this->nfeProc->getElementsByTagName("dhRecbto")->item(0)->nodeValue); if ($texto != '') { $texto .= " - " . date('d/m/Y H:i:s', $tsHora); } $cStat = $this->nfeProc->getElementsByTagName("cStat")->item(0)->nodeValue; } else { $texto = ''; $cStat = ''; } } } $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'B', 'C', 0, ''); //#################################################################################### //INSCRIÇÃO ESTADUAL $w = round($maxW * 0.333, 0); $y += $h; $oldY += $h; $x = $oldX; $texto = 'INSCRIÇÃO ESTADUAL'; $aFont = array('font' => $this->fontePadrao, 'size' => 6, 'style' => ''); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'T', 'L', 1, ''); $texto = $this->pSimpleGetValue($this->emit, "IE"); $aFont = array('font' => $this->fontePadrao, 'size' => 10, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'B', 'C', 0, ''); //INSCRIÇÃO ESTADUAL DO SUBST. TRIBUT. $x += $w; $texto = 'INSCRIÇÃO ESTADUAL DO SUBST. TRIBUT.'; $aFont = array('font' => $this->fontePadrao, 'size' => 6, 'style' => ''); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'T', 'L', 1, ''); $texto = !empty($this->emit->getElementsByTagName("IEST")->item(0)->nodeValue) ? $this->emit->getElementsByTagName("IEST")->item(0)->nodeValue : ''; $aFont = array('font' => $this->fontePadrao, 'size' => 10, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'B', 'C', 0, ''); //CNPJ $x += $w; $w = $maxW - 2 * $w; $texto = 'CNPJ'; $aFont = array('font' => $this->fontePadrao, 'size' => 6, 'style' => ''); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'T', 'L', 1, ''); $texto = $this->emit->getElementsByTagName("CNPJ")->item(0)->nodeValue; $texto = $this->pFormat($texto, "##.###.###/####-##"); $aFont = array('font' => $this->fontePadrao, 'size' => 10, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'B', 'C', 0, ''); //#################################################################################### //Indicação de NF Homologação, cancelamento e falta de protocolo $tpAmb = $this->ide->getElementsByTagName('tpAmb')->item(0)->nodeValue; //indicar cancelamento if ($this->pNotaCancelada()) { //101 Cancelamento $x = 10; $y = $this->hPrint - 130; $h = 25; $w = $maxW - 2 * $x; $this->pdf->SetTextColor(90, 90, 90); $texto = "NFe CANCELADA"; $aFont = array('font' => $this->fontePadrao, 'size' => 48, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); $this->pdf->SetTextColor(0, 0, 0); } if ($this->pNotaDPEC() || $this->tpEmis == 4) { //DPEC $x = 10; $y = $this->hPrint - 130; $h = 25; $w = $maxW - 2 * $x; $this->pdf->SetTextColor(200, 200, 200); $texto = "DANFE impresso em contingência -\n" . "DPEC regularmente recebido pela Receita\n" . "Federal do Brasil"; $aFont = array('font' => $this->fontePadrao, 'size' => 48, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); $this->pdf->SetTextColor(0, 0, 0); } if ($this->pNotaDenegada()) { //110 301 302 Denegada $x = 10; $y = $this->hPrint - 130; $h = 25; $w = $maxW - 2 * $x; $this->pdf->SetTextColor(90, 90, 90); $texto = "NFe USO DENEGADO"; $aFont = array('font' => $this->fontePadrao, 'size' => 48, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); $y += $h; $h = 5; $w = $maxW - 2 * $x; if (isset($this->infProt)) { $xMotivo = $this->infProt->getElementsByTagName("xMotivo")->item(0)->nodeValue; } else { $xMotivo = ''; } $texto = "SEM VALOR FISCAL\n" . $xMotivo; $aFont = array('font' => $this->fontePadrao, 'size' => 48, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); $this->pdf->SetTextColor(0, 0, 0); } //indicar sem valor if ($tpAmb != 1) { $x = 10; if ($this->orientacao == 'P') { $y = round($this->hPrint * 2 / 3, 0); } else { $y = round($this->hPrint / 2, 0); } $h = 5; $w = $maxW - 2 * $x; $this->pdf->SetTextColor(90, 90, 90); $texto = "SEM VALOR FISCAL"; $aFont = array('font' => $this->fontePadrao, 'size' => 48, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); $aFont = array('font' => $this->fontePadrao, 'size' => 30, 'style' => 'B'); $texto = "AMBIENTE DE HOMOLOGAÇÃO"; $this->pTextBox($x, $y + 14, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); $this->pdf->SetTextColor(0, 0, 0); } else { $x = 10; if ($this->orientacao == 'P') { $y = round($this->hPrint * 2 / 3, 0); } else { $y = round($this->hPrint / 2, 0); } //fim orientacao $h = 5; $w = $maxW - 2 * $x; $this->pdf->SetTextColor(90, 90, 90); //indicar FALTA DO PROTOCOLO se NFe não for em contingência if (($this->tpEmis == 2 || $this->tpEmis == 5) && !$this->pNotaDPEC()) { //Contingência $texto = "DANFE Emitido em Contingência"; $aFont = array('font' => $this->fontePadrao, 'size' => 48, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); $aFont = array('font' => $this->fontePadrao, 'size' => 30, 'style' => 'B'); $texto = "devido à problemas técnicos"; $this->pTextBox($x, $y + 12, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); } else { if (!isset($this->nfeProc)) { if (!$this->pNotaDPEC()) { $texto = "SEM VALOR FISCAL"; $aFont = array('font' => $this->fontePadrao, 'size' => 48, 'style' => 'B'); $this->pTextBox($x, $y, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); } $aFont = array('font' => $this->fontePadrao, 'size' => 30, 'style' => 'B'); $texto = "FALTA PROTOCOLO DE APROVAÇÃO DA SEFAZ"; if (!$this->pNotaDPEC()) { $this->pTextBox($x, $y + 12, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); } else { $this->pTextBox($x, $y + 25, $w, $h, $texto, $aFont, 'C', 'C', 0, ''); } } //fim nefProc } //fim tpEmis $this->pdf->SetTextColor(0, 0, 0); } return $oldY; }
/** * Arbitrary cells containing text, optionally with borders and backgrounds * * @param string $text The text to display, can include line breaks with <br /> or \n * @param array $options an associative array of options, in the format 'option' => $value * Possible options: * font - object defining any of family, size and decoration, and colour as properties. * fill - HTML-style hex string of RGB for background colour. * width - the cell width, defaults to 0 (whole page) * height - the cell height, defaults to 0 * border - 0 for no border, 1 for all borders, combination of LTRB for Left, Top, Right, * Bottom, defaults to 0 * align - L for left, C for center, R for right, defaults to L * */ public static function cell($text, $options = array()) { $width = array_key_exists('width', $options) ? $options['width'] : ''; $height = array_key_exists('height', $options) ? $options['height'] : self::$pdf->FontSize * 1.2; $border = array_key_exists('border', $options) ? $options['border'] : ''; $fill = array_key_exists('fill', $options) ? $options['fill'] : 0; $breakafter = array_key_exists('breakafter', $options) ? $options['breakafter'] : 0; $align = array_key_exists('align', $options) ? $options['align'] : 'L'; if (array_key_exists('font', $options) && !empty($options['font'])) { self::change_font($options['font']); } if (array_key_exists('fill', $options)) { $fill = 1; $colour = self::parse_colour($options['fill']); self::$pdf->SetFillColor($colour['red'], $colour['green'], $colour['blue']); } if (empty($border)) { $borders = 0; } else { $style = new stdClass(); $borders = $border->borders; $style->width = isset($border->width) ? $border->width : null; $style->colour = isset($border->colour) ? $border->colour : null; self::$pdf->change_line_style($style); } $text = str_replace('<br />', "\n", $text); $text = self::decode_utf8($text); if (strpos($text, "\n") === false) { return self::$pdf->Cell($width, $height, $text, $borders, $breakafter, $align, $fill); } else { return self::$pdf->MultiCell($width, $height, $text, $borders, $align, $fill); } }