Gerando documento PDF em PHP

Neste artigo estarei mostrando como gerar documentos no formato PDF em PHP com consulta em banco de dados. A idéia é mostrar um pouco do que é possível se fazer com esta API e não gerar um relatório bonito, pois isso ficará a encargo de cada um.

[ Hits: 169.647 ]

Por: Luis Carlos de Brito em 18/10/2004


Conclusão



Bem, espero que possam ter entendido meu artigo, seu objetivo era mostrar algumas funções desta API de modo que o relatório possa ficar com a cara de quem o fez, personalizando-o de acordo com o gosto ou necessidade.

Até a próxima!

Luis.

Página anterior    

Páginas do artigo
   1. Baixando os arquivos necessários
   2. Gerando um arquivo simples
   3. Criando um banco para posterior consulta
   4. Gerando PDF a partir de consulta SQL
   5. Conclusão
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Wordpress: Hospede blogs no seu Linux

Servidor LAMP + PHPMyAdmin + Webalizer

Enganando o proxy Squid (download de arquivos)

Deixando seu PHPNuke mais 'esperto'

O que é o e107

  
Comentários
[1] Comentário enviado por Jarnotrulli em 18/10/2004 - 08:40h

Poxa, muito legal esse artigo! Alias, isso vale para outros tipos de exibicao de texto, como o Ghostscript?

[2] Comentário enviado por nhanhu em 18/10/2004 - 16:17h

resultado:

%PDF-1.3 %âãÏÓ 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R 9 0 R ] /Count 2 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Creator (R and OS php pdf writer, http://www.ros.co.nz) /CreationDate (D:20041018) >> endobj 6 0 obj << /Type /Page /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 105 >> stream xoeOE1@@{§x%ÍúldW+¡¢ÿb?!a4Nì6´)¦TMo/oo*FNZoeK¤´&°CÚdÈH"Y?¸]¯{"Èáä"×_~ü®<ìtÏз xCÍQ8ê?ÁX«OEù¿î7 endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Page /Parent 3 0 R /Contents 10 0 R >> endobj 10 0 obj << /Filter /FlateDecode /Length 180 >> stream xoeUÎÁªÂ0н_1î$&i1}[QqÙE~ Ök"GmJsf¿o"?TMÕa{ ­+a´D#¥¨* {Åö¤ ¤(û¬¬ %)ܧ?À"î3ÃÇ8®aÿq´<¢©Æ^æ¯`)½SõWS­>É1¬=oep?]¾ÓÈÈ)OE=Ús<Á?}v=ý~;¡ëÆ"§µþsúcrDO#Í/80?=Üä:Oð4Lĺ~çDË7ûf/E_ endstream endobj xref 0 11 0000000000 65535 f 0000000015 00000 n 0000000080 00000 n 0000000126 00000 n 0000000286 00000 n 0000000315 00000 n 0000000420 00000 n 0000000483 00000 n 0000000661 00000 n 0000000768 00000 n 0000000832 00000 n trailer << /Size 11 /Root 1 0 R /Info 5 0 R >> startxref 1086 %%EOF

[3] Comentário enviado por pools em 18/10/2004 - 18:18h

Acredito que faltou setar o contentType para pdf!

A princípio, é muito simpls criar PDF "on the fly" no php. Já no JSP... que horror...

[4] Comentário enviado por fagner em 05/11/2004 - 05:26h

Bom estou tentando gerar um pdf a partir de dados gravados em session, tirando as sessions, somente as imagens e textos aparecem segue codigo para analise.:
for($i=0; $i<$_SESSION['total']; $i++)
{
$vlrtot = $_SESSION["qtd[$i]"]*$_SESSION["preco[$i]"];
$pdf->ezTable($_SESSION["produto[$i]"], $cols,'AGENDA',$optionsTable);
$pdf->ezTable($_SESSION["qtd[$i]"], $cols,'AGENDA',$optionsTable);
$pdf->ezTable($_SESSION["preco[$i]"], $cols,'AGENDA',$optionsTable);
$pdf->ezTable($_SESSION["final[$i]"], $cols,'AGENDA',$optionsTable);
}

por favor alguem me de um help.
Fagner M. Vila
fagnervila@hotmail.com

[5] Comentário enviado por jawd em 08/05/2005 - 12:18h

Este erro esta dando no internet explore.

%PDF-1.3 %âãÏÓ 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Creator (R and OS php pdf writer, http://www.ros.co.nz) /CreationDate (D:20050508) >> endobj 6 0 obj << /Type /Page /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 74 >> stream xoeãr Q06Ð300P0³4Ó3²4PIQÐw3T04 +"¤)(hx¤æääk*"d)¸+p!4~ZèTMaÕz_""¢Õ,àV endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj xref 0 9 0000000000 65535 f 0000000015 00000 n 0000000080 00000 n 0000000126 00000 n 0000000280 00000 n 0000000309 00000 n 0000000414 00000 n 0000000477 00000 n 0000000623 00000 n trailer << /Size 9 /Root 1 0 R /Info 5 0 R >> startxref 730 %%EOF

Mas no firefox não. Alguem sabe me dizer o que fazer para funcionar nele?
Obrigado a todos que responderem

[6] Comentário enviado por villas em 26/10/2005 - 22:54h

Bitcho ... funfou beleza .... só que eu tenho o seguinte do ..while:
do {
echo $row_rsLISTAITENS['detalhe_item'];
echo $row_rsLISTAITENS['detalhe_codpro'];
echo $row_rsLISTAITENS['detalhe_vlr_total'];
$totalP = $row_rsLISTAITENS['detalhe_vlr_total'];
$total += $totalP;
} while ($row_rsLISTAITENS = mysql_fetch_assoc($rsLISTAITENS));

echo 'Total do Pedido',number_format($total, 2, ',', '.');

Só com o While ue vc colocou ai, lista todos os itens da tabela ... como eu poderia adaptar este meu do...while para o pdf ??

Obrigado
Villas
villas2@terra.com.br

[7] Comentário enviado por luiscarlos em 27/10/2005 - 16:28h

Bem o que vc poderia fazer é jogar todos esse valores num array
$data[] = array("Item"=>$row_rsLISTAITENS['detalhe_item'], "Codigo"=>$row_rsLISTAITENS['detalhe_codpro'],"valor"=> $row_rsLISTAITENS['detalhe_vlr_total'],"Total"=>$total);

depois passa para o ezTable esse valor ($data), sem o $cols que tem no exemplo, por que os cabeçalhos seriam já colocados no array, depois vc colcoa no final um campo com o total da compra, se tiver divida manda um email que tentarei fazer um exemplo pra ti, blz? abraços

[8] Comentário enviado por mtavares em 06/06/2006 - 07:34h

Eu experimentei e funcionou numa beleza só que eu queria saber se existe alguma documentação...

[9] Comentário enviado por mtavares em 06/06/2006 - 08:31h

Minha gente isto é maravilhoso faz-se muita coisa e com facilidade...Beleza

[10] Comentário enviado por aelsonjr em 31/08/2006 - 11:09h

Olá, estou muito interessado em usar esse recurso, mas gostaria de saber como proceder para gerar um pdf a partir de documento do word gravado no servidor.

Agradeço qualquer informaçao!!

[11] Comentário enviado por luiscarlos em 05/09/2006 - 19:27h

priemeiro vc precisa ler o conteudo desse word e jogar para funcao que escreve pdf ou vc pode usar o fop para gerar pdf, vc criaria um xml com o conteudo do word e depois criaria um arquivo xsl para gerar o pdf com base no conteudo do xml, fop é gratuito, da fundacao apache

[12] Comentário enviado por optero em 17/11/2006 - 00:18h

Ola gostaria de saber como eu pego as informações que eu enviei por um form ?

<?php
$_POST[esse];
// chama a classe 'class.ezpdf.php' necessária para se gerar o documento
include "class.ezpdf.php";

// instancia um novo documento com o nome de pdf
$pdf = new Cezpdf();

// seta a fonte que será usada para apresentar os dados
//essas fontes são aquelas dentro do diretório GeraPDF/fonts
$pdf->selectFont('fonts/Helvetica.afm');

// chama o método ezText e passa o texto que deverá ser apresentado no documento
//o numero após o texto se refere ao tamanho da fonte
$pdf->ezText($esse);

// gera o PDF
$pdf->ezStream();
?>

por favor me ajude!!!
optero@hotmail.com
optero@gmail.com
optero@uggy.com.br
=======================================

Mil desculpas pessoal funcionou era meu global do php que estava off

[13] Comentário enviado por mtavares em 30/04/2007 - 16:28h

alguém já tentou colocar a opção que permite a página ficar na Horizontal

[14] Comentário enviado por removido em 12/07/2007 - 15:56h

Puts cara! valeu mesmo fera! tu tá de parabéns! usei esse exemplo aqui pra eu criar uma aplicação aqui e ficou show de bola! valeu mesmo cara! :)

[15] Comentário enviado por macevidal em 15/10/2007 - 07:55h

Bom estou com problemas de acentuacao ao exportar para pdf, andei pesquisando bastante antes de perguntar, jah estou quebrando a cabeça a alguns dias, se puder me ajudar, agradeço. Os acentos e cedilhas, quando exporto, ficam com caracteres muito loucos. =,.(
Tx desde jah, Mace

[16] Comentário enviado por LE750 em 12/02/2008 - 11:27h

Ae alguem sabe como gerar o pdf em modo paisagem

[]s

leandroviana@gmail.com

[17] Comentário enviado por frajolitzz em 12/05/2008 - 11:57h

//mostra em formato paisagem
$pdf = new Cezpdf('a4','landscape');

[18] Comentário enviado por miglaranjeira em 03/06/2008 - 01:41h

Oi
Quando leio de um banco de dados um campo com por exemplo Gonçalves no pdf aparece Hugo Gonçalves,
Alguém pode me ajudar

Miguel

[19] Comentário enviado por comfaa em 28/10/2008 - 13:04h

muito legal !!!

[20] Comentário enviado por junior.amadeu em 01/12/2008 - 15:27h

Estou tendo problemas ao gerar pdf.

Com o código abaixo, me é gerado um pdf que os textos estão sobrepostos, ou seja tudo o que eu escrevo fica no mesmo lugar. Quando uso a função addText, o mesmo não acontece.

<?php
include("../pdfClassesAndFonts_009e/class.ezpdf.php");
$pdf = new Cezpdf();
$pdf->ezText("\n\nPQP");
$pdf->ezText("\n\nPQPqqqq");
$pdf->addText(200,200,10,"AA");
$pdf->stream();
?>

Alguem pode me ajudar?

[]s



[21] Comentário enviado por beniltonet em 27/02/2009 - 00:27h

Pessoal boa noite:

Estou com um probleminha sobre geração de pdf a partir de PHP.
Meu atual script esta dando um erro na linha 48. Não entendo o que esta havendo.
Disponho do script para vossa observação. Se alguém souber como indicar o que posso esta alterando, agradeço!
Muito Obrigado: José Benilton...

<?

ob_start();


$type = $_POST[group1];


require('fpdf/fpdf.php');

define('FPDF_FONTPATH','fpdf/font/');



include('../default/a2conectar.php');



if($type == 0)

{

$pdf = new FPDF('P','cm','A4');

$pdf -> AddPage();
$pdf -> SetMargins(1,1,1);

$lin = 1;
$col = 1;

$status = 1;
$cont = 0;

$inicio = $_POST[inicio];

$folhas = $_POST[folhas];


$folhas = $folhas * 10;

$folhas = (($inicio + $folhas) - 1);



$qry= "SELECT vox_espelho,username FROM cc_card WHERE vox_espelho >= $inicio AND vox_espelho <= $folhas AND nbused = 0 GROUP BY vox_espelho ORDER BY vox_espelho";

$buscar = mysql_query($qry);

while($linha = mysql_fetch_array($buscar))

{

switch($lin)

{
case 1:

if(($lin == 1) and ($col == 1)){$a=3; $b=2; $c=7.5; $d=4.7; $e=1.9; $f=1.9; $col++;} else {

if(($lin == 1) and ($col == 2)){$a=12.5; $b=2; $c=17; $d=4.7; $e=18.7; $f=1.9; $col = 1; $lin++;}}

break;



case 2:

if(($lin == 2) and ($col == 1)){$a=3; $b=7.5; $c=7.5; $d=10.2; $e=1.9; $f=7.1; $col++;} else {

if(($lin == 2) and ($col == 2)){$a=12.5; $b=7.5; $c=17; $d=10.2; $e=18.7; $f=7.1; $col = 1; $lin++;}}}

break;



case 3:

if(($lin == 3) and ($col == 1)){$a=3; $b=13; $c=7.5;$d=15.7; $e=1.9; $f=12.4; $col++;} else {

if(($lin == 3) and ($col == 2)){$a=12.5; $b=13; $c=17; $d=15.7; $e=18.7; $f=12.4; $col = 1; $lin++;}}}}

break;



case 4:

if(($lin == 4) and ($col == 1)){$a=3; $b=18.5; $c=7.5; $d=21.2; $e=1.9; $f=17.6; $col++;} else {

if(($lin == 4) and ($col == 2)){$a=12.5; $b=18.5; $c=17; $d=21.2; $e=18.7; $f=17.6; $lin=1; $col=1;
break;

case 5:

if(($lin == 5) and ($col == 1)){$a=3; $b=24; $c=7.5; $d=26.7; $e=1.9; $f=17.6; $col++;} else {

if(($lin == 5) and ($col == 2)){$a=12.5; $b=24; $c=17; $d=26.7; $e=18.7; $f=17.6; $lin=1; $col=1;{
break;




$status=1;}}}

break;

}



$pdf -> SetFont('Arial','',12);

$pdf -> SetXY($e,$f);

#$pdf -> Cell(1,0.05,'ACCESO LOCAL: 3224 26 22',0,0,'L');



//Codigo PIN

$pdf -> SetFont('Arial','',12);

$pdf -> SetXY($a,$b);

$pdf -> Cell(1,0.05,$linha[1],0,0,'L');



//Numero de serie e codigo de barras

$pdf -> SetFont('Arial','',10);

$pdf -> SetXY($c,$d);

$pdf -> Cell(1,0.05,$linha[0],0,0,'L');



if(($status == 1) and ($_POST[folhas] != $cont)){$pdf -> AddPage(); $status = 0; $cont++;}

}

}



$pdf -> Output('arquivo','I');

include('../default/a2desconectar.php');

?>

[22] Comentário enviado por beniltonet em 27/02/2009 - 11:41h

case 3:

if(($lin == 3) and ($col == 1)){$a=3; $b=13; $c=7.5;$d=15.7; $e=1.9; $f=12.4; $col++;} else {

if(($lin == 3) and ($col == 2)){$a=12.5; $b=13; $c=17; $d=15.7; $e=18.7; $f=12.4; $col = 1; $lin++;}}}

break;

Neste Aqui pra ser mais exato!

[23] Comentário enviado por miqueias3000 em 06/04/2009 - 15:05h

"Acredito que faltou setar o contentType para pdf!"

E como se seta o CONTENT TYPE?

Abraço!

[24] Comentário enviado por jotacam em 24/05/2009 - 23:55h

Olá, parabéns pelo Viva o Linux!.
Estou procurando um script em php como este apresentado acima pelo Luis Carlos de Brito.
Estou começando a estudar PHP e como sou iniciante, preciso da ajuda destes "Feras".

É o seguinte, mais ou menos como apresenta o script acima,
preciso de um banco de dados que armazene tipo nome e valor on line pelo navegador.
Estes dados serão editados por alguem autorizado em um apágina com opção de serem apagados ou inseridos novos dados. (Ex. abaixo)

____________________________________________________
José da Silva | 1.200,00 | apagar
____________________________________________________
Ana Maria | 800,00 | apagar
....

Botão "Adicionar Novo"

Depois preciso fazer estes dados serem salvos em pdf e que posteriormente
serão exibidos ao clicar em um menu.

Espero ter explicado o que preciso.
Se puderem me ajudar, fico muito agradecido.

Abraço,
João Camilo.


[25] Comentário enviado por ehglopes em 16/09/2009 - 12:41h

Ola estou tentando gerar um pdf e fiz os passos mas na hora de rodar apareceu isso:

%PDF-1.3 %âãÏÓ 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Creator (R and OS php pdf writer, http://www.ros.co.nz) /CreationDate (D:20090916) >> endobj 6 0 obj << /Type /Page /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 62 >> stream xœãr Q06Ð300P°04Ô³°4PIQÐwS04Š*„¤)(hx¤æää+„çå¤(j*„d)¸†J£ & endstream endobj xref 0 8 0000000000 65535 f 0000000015 00000 n 0000000080 00000 n 0000000126 00000 n 0000000257 00000 n 0000000286 00000 n 0000000391 00000 n 0000000454 00000 n trailer << /Size 8 /Root 1 0 R /Info 5 0 R >> startxref 588 %%EOF


O que devo fazer??

Grato

Eduardo
Skape = du.tigrosa

[26] Comentário enviado por paulocamboim em 27/04/2010 - 23:29h

Para resolver o problema com acentuação basta fazer o seguinte:
(retirado de: http://listas.softwarelivre.org/pipermail/dotproject-br/2008-May/002350.html)

No arquivo lib/ezpdf/class.pdf.php por volta da linha 2159 substitua:

function addText($x,$y,$size,$text,$angle=0,$wordSpaceAdjust=0){
if (!$this->numFonts){$this->selectFont(\'./fonts/Helvetica\');}

por
function addText($x,$y,$size,$text,$angle=0,$wordSpaceAdjust=0){
$text = utf8_decode($text);
if (!$this->numFonts){$this->selectFont(\'./fonts/Helvetica\');}


Ou seja acrescente na função a linha
$text = utf8_decode($text);

até mais...

[27] Comentário enviado por josao_loco em 18/05/2010 - 16:10h

Boa tarde galera, gostei pra caramba desta dica, consegui gerar um relatorio com somente texto que eu estava querendo, mas a duvida é tenho um catalogo em PHP com varias imagens e não faço a minima idéia de como tornar ele em PDF oque seria de grande ajuda pra mim. Será que alguém pode me ajudar, meu email é josao_loco@hotmail.com, desde ja agradeço a todos.. e principalmente ao luis carlos.

vou postar o codigo fonte aqui:

<?
include("admin/includes/header.php");
include_once("admin/includes/conexao.php");
include_once("configuracoes.php");
$a = "1";
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">;
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<style type="text/css">
div {
position: relative;
left: 120px;
width: 240px;
top: 140px;/*
text-align: left;
padding: 5px;
background: #a9d06a;
margin: 3px 0 0 0;
border-bottom: 1px solid #333333;
border-bottom: 1px solid #555555; */
}

div.fundo {
position: relative;
left: -10px;
width: 854px;
top: 130px;
}
div.subdepto {
position: absolute;
z-index: 2;
left: 51px;
width: 129px;
height: 25px;
top: 41px;
}

div.paginacao {
position: absolute;
z-index: 3;
left: 590px;
width: 218px;
height: 25px;
top: 2px;
}
div.paginacao2 {
position: absolute;
z-index: 4;
left: 625px;
width: 218px;
height: 25px;
top: 1217px;
}

body {
background-image: url(img/fundo_cat.jpg);
background-repeat:repeat-y;
}
</style>
</head>

<body>
<div class="fundo">
<table width="200" height="226" border="0" align="right">
<?
$select = mysql_query("SELECT IF(ISNULL(produtos.marca),'',marcas.nome) AS nmarca, produtos.* FROM produtos LEFT JOIN marcas ON marcas.id = produtos.marca");
$coluna=1;
echo "<tr>";
if(mysql_num_rows($select) != 0){

$p = "20";

$sql = mysql_query("SELECT IF(ISNULL(produtos.marca),'',marcas.nome) AS nmarca, produtos.* FROM produtos LEFT JOIN marcas ON marcas.id = produtos.marca WHERE disponivel = '1' order by subdepto , nome asc");

while($valor = mysql_fetch_array($sql)){
?>
<?
if ($valor["foto"]){
$nf = explode('pq',$valor["foto"]);
//echo $nf[0];
if($nf[0] == ""){
$caminho21 = "grande/gr".$nf[1];
}else{
$caminho21 = "grande/".$valor["foto"];
}
$caminho = "pequena/".$valor["foto"];
$caminho2 = $caminho21;
}
?>
<td width="156" valign="top"> <table width="177" height="202" border="0" cellpadding="0" cellspacing="0" style="border-bottom:1px dashed #CCCCCC;">
<tr>
<td valign="top"><font size="2">
<?=$valor["nome"]?><?=$valor['subdepto']?>
</font></td>
</tr>
<tr>
<td width="194" valign="top">
<img src="<?=$caminho?>" width="140px" height="140px" border="0" /><br />
Ref: <font color="#FF0000"><?=$valor['codigo']?></font><br />
<?=$valor['unidades']?> un</a></td>
</tr>
</table>
<?
if(($a%16)==0){
echo "<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />";
}
if (($coluna%4)==0)
{
echo "</tr><tr>"; //quando atingir 5 colunas, fecha a linha anterior e inicia uma nova linha
}
$coluna++;
$a++;
}
}else{
echo "Banco de Dados Vazio";
}
echo "</tr>";
?>
</table>
</div></body>
</html>

[28] Comentário enviado por vinnycp em 07/06/2010 - 14:32h

"Acredito que faltou setar o contentType para pdf!"

E como se seta o CONTENT TYPE?

Abraço!
--------------------------------------------------------------

Amigo, no caso se estiver usando o IE 8 assim como eu estava, e tendo o mesmo problema, apague seus arquivos temporários da internet, para forçar o navegador de carregar a página novamente.
Eu fiz isso e bastou.
Se realmente não for só problema com isso, tente usar a função header desta maneira:

header('Content-type: application/pdf');

Creio que isso vá funcionar.

Abraço.

[29] Comentário enviado por rizzi em 19/08/2020 - 14:24h

Boa tarde!

Realizei a parametriza usando a biblioteca no Windows com WAMP, tudo funcionado perfeitamente, gerando PDF pegando variável do BD, porem precisei mover aplicação para ambiente com Linux Mint com XAMPP, ao gerar o PDF ele fica vira e rotacional.

Tentei fazer alguns ajuste ma não deu certo.

Por favor se puder me ajudar, agradeço!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts