Salve galera do Scriptcase
Venho neste fórum para compartilhar uma forma de extração de relatório usando a biblioteca TCPDF que construí com base em vídeo que assisti dos meus amigos da Avant Soluções. https://www.youtube.com/watch?v=08nlb6BmpDQ
Este formato baseia-se em uma biblioteca externa que leva basicamente o código em HTML e que constrói as colunas em HTML/TABLES usando a biblioteca externa(cabeçalho), a biblioteca interna(corpo) e o blank(dados do relatório) de impressão.
Crio uma biblioteca externa com o nome modelo e dentro desta biblioteca coloco um arquivo que me servirá de modelo para todos os relatórios, desde que o padrão seja requerido, com o nome de lib_modelo_prn.php.
Código lib_modelo_prn.php (biblioteca externa)
<?php class MYPDF extends TCPDF { var $grid = false; function DrawGrid() { if($this->grid===true){ $spacing = 5; } else { $spacing = $this->grid; } $this->SetDrawColor(204,255,255); $this->SetLineWidth(0.35); for($i=0;$i<$this->w;$i+=$spacing){ $this->Line($i,0,$i,$this->h); } for($i=0;$i<$this->h;$i+=$spacing){ $this->Line(0,$i,$this->w,$i); } $this->SetDrawColor(0,0,0); $x = $this->GetX(); $y = $this->GetY(); $this->SetTextColor(204,204,204); for($i=20;$i<$this->h;$i+=20){ $this->SetXY(1,$i-3); $this->Write(4,$i); } for($i=20;$i<(($this->w)-($this->rMargin)-10);$i+=20){ $this->SetXY($i-1,1); $this->Write(4,$i); } $this->SetXY($x,$y); } public function setIdHeader($titulo){ $this->IdHeader = $titulo; } function Header() { if($this->grid) $this->DrawGrid(); // Tipo de fonte $this->SetFont('helvetica', 'B', 14); $separa_titulos = explode("#",$this->IdHeader); $v_titulos = $separa_titulos[0]; $v_dataprn = $separa_titulos[1]; $v_horaprn = $separa_titulos[2]; $v_usuario = $separa_titulos[3]; $v_total_colunas = $separa_titulos[4]; //Pegando as colunas $v_horiz_col = array(); for ($i = 1; $i <= $v_total_colunas; $i++) { array_push($v_horiz_col, $separa_titulos[$i+4]); } //Pegando os percentuais $v_percen_col = array(); for ($ii=($i+4); $ii <= ($v_total_colunas+(($i+4)-1)); $ii++) { array_push($v_percen_col,$separa_titulos[$ii]); } //Pegando as alinhamentos $v_align_col = array(); //$passo = $ii+($v_total_colunas-3); for ($iii = $ii; $iii <= $ii + ($v_total_colunas-1); $iii++) { array_push($v_align_col,$separa_titulos[$iii]); } $hed_html = '
| ';
$hed_html .= '
| ';
$hed_html .= '
| ';
$hed_html .= '
| ';
}
$cab_html .= '
Agora crio uma biblioteca interna, em nível de projeto, com o nome de prn_tcpdf.php, nome apenas sugestivo com o seguinte conteúdo:
<?php function prn_open_table($arg_striped,$arg_color_y,$arg_color_x,$arg_line) { if ($arg_striped=='S'){ if ($arg_line % 2 == 0){ $arg_html = ''.$arg_element.' |
Esta biblioteca interna é responsável pela montagem das colunas do corpo do relatório em HTML/TABLES
E agora chegamos ao BLANK, que é a única coisa que modificamos depois da implementação da biblioteca externa e da interna.
No código abaixo passo alguns parâmetros obrigatórios para as bibliotecas internas e externas, são eles:
$par_title => O título do relatório.
$par_data, $par_hora , $par_user => Data, hora e usuário responsável pela emissão.
$par_cols_ttl => Quantidade de colunas do seu relatório.
$par_tit => Os títulos das colunas deste relatório separados pelo símbolo da cerquilha #.
$par_tit => Os percentuais de cada coluna, vejam que se informamos 4 colunas precisamos de 4 valores percentuais, também separados pela cerquilha #.
$par_alg => O alinhamento das colunas e a regra é mesma, 4 valores para 4 colunas, também separados pela cerquilha #.
$v_paper => Se é Landscape (L) ou Portrait §
$v_striped => Se o relatório será Zebrado/Listrado.
$v_color_y => ‘ccf9d1’ => a cor da linha ímpar do relatório
$v_color_x= ‘ffffff’ => a cor da linha par do relatório
$v_sc_app, $v_idhash, $v_hash => Crio um identificador único para o relatório.
O código da BLANK:
$par_title = ‘RELAÇÃO DE PRODUTOS’;
$par_data = ‘24/03/2018’;
$par_hora = ‘10:05’;
$par_user = ‘ANDRE LUIZ’;
$par_cols_ttl = ‘4’;
$par_tit = ‘ID#PRODUTO#STK ATUAL#STK MÍNIMO’;
$par_per = ‘10#40#25#25’;
$par_alg = ‘left#left#center#center’;
/**********************************************************/
/ Parâmetros OBRIGATÓRIOS para MODIFICAR o cabeçalho ******/
$par_title = ‘RELAÇÃO DE PRODUTOS’;
$par_data = ‘24/03/2018’;
$par_hora = ‘10:05’;
$par_user = ‘ANDRE LUIZ’;
$par_cols_ttl = ‘4’;
$par_tit = ‘ID#PRODUTO#STK ATUAL#STK MÍNIMO’;
$par_per = ‘10#40#25#25’;
$par_alg = ‘left#left#center#center’;
$v_header = $par_title .’#’;
$v_header .= $par_data .’#’;
$v_header .= $par_hora.’#’;
$v_header .= $par_user.’#’;
$v_header .= $par_cols_ttl.’#’;
$v_header .= $par_tit.’#’;
$v_header .= $par_per.’#’;
$v_header .= $par_alg;
// L = Landscape or P = Portrait
$v_paper = ‘P’;
$v_striped= ‘S’;
$v_color_y= ‘ccf9d1’;
$v_color_x= ‘ffffff’;
$v_sc_app = ‘tcpdf_produtos’;
$v_idhash = rand(10000, 30000);
$v_hash = hash(‘tiger192,3’, $v_sc_app . $v_idhash . ‘6abb4c58b1464ebcc593554d61c1e73490781df78fb73407’);
/***************************************************************/
sc_include_lib (“tcpdf”);
sc_include_library(“prj”, “modelos”, “lib_modelo_prn.php”, true, true);
//UTF-8 ou ISO-8859-1
$pdf = new MYPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, false, ‘ISO-8859-1’, false);
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor($par_user);
$pdf->SetTitle($par_title);
$pdf->SetSubject($v_hash);
$pdf->SetKeywords(‘Relatório de Sistema’);
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.’ 001’, PDF_HEADER_STRING, array(0,64,255), array(0,64,128));
$pdf->setFooterData(array(0,64,0), array(91,196,191));
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, ‘’, PDF_FONT_SIZE_MAIN));
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, ‘’, PDF_FONT_SIZE_DATA));
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
if ($v_paper==‘P’) {
$vlr_ini = 41;
} else {
$vlr_ini = 50;
}
$pdf->SetMargins(PDF_MARGIN_LEFT, $vlr_ini, PDF_MARGIN_RIGHT);
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
$pdf->SetFont(‘helvetica’, ‘’, 10, ‘’, true);
$pdf->grid = false;
$pdf->setIdHeader($v_header);
$pdf->AddPage($v_paper,‘A4’);
$check_sql = “SELECT id_prod, descricao, stkatual, stkminimo
FROM produtos”;
sc_select(meus_dados, $check_sql);
$html=’’;
$ll=1;
while (!{meus_dados}->EOF){
$pdf_00 = {meus_dados}->fields[0];
$pdf_01 = {meus_dados}->fields[1];
$pdf_02 = {meus_dados}->fields[2];
$pdf_03 = {meus_dados}->fields[2];
$html .= prn_open_table($v_striped,$v_color_y,$v_color_x,$ll);
$html .= prn_set_ini_body();
$html .= prn_rampup_body($pdf_00,'10','left',8);
$html .= prn_rampup_body($pdf_01,'40','left',8);
$html .= prn_rampup_body($pdf_02,'25','right',8);
$html .= prn_rampup_body($pdf_03,'25','right',8);
$html .= prn_set_end_body();
$html .= prn_close_table();
$ll = $ll + 1;
{meus_dados}->MoveNext();
}
{meus_dados}->Close();
$pdf->writeHTML($html, true, false, true, false,’’);
$pdf->lastPage();
$pdf->Output(‘rel_final.pdf’, ‘I’);
Não esqueçam de habilitar a biblioteca interna nos BLANK`s com o conteúdo do relatório.
O resultado segue em anexo! Um forte abraço e até a próxima!
rel_final.pdf (72.8 KB)