Linguagem PHP: 3ª Parte (Criando o Banco de Dados no phpmyadmin) – Criando uma Agenda de Contatos.


Criando uma Agenda de Contatos – Criando o Banco de Dados no phpmyadmin

Jbwebmaster João Batista Dantas Bezerra Júnior

Olá pessoal, seguindo a sequência do tutorial, vamos criar o banco de dados. Para isso vamos usar o phpmyadmin que já vem no próprio xampp ou wampp, verá que é bem simples de usar e que também é bastante completo, não ficando pra traz de nenhum outro programa para criação de banco de dados.

Para começar digite no seu navegador localhost/phpmyadmin/, seguida na tela inicial você já poderá digitar o nome do banco de dados que desejar, no nosso caso será agendatel tudo junto e minúsculo, além disso você deverá escolher a collate utf8_unicode_ci , pois é um padrão internacional que suporta 65 mil caracteres, permitindo considerar todos os diferentes caracteres de todos idiomas falados no mundo. Deverá ficar assim:

Tela inicial do phpmyadmin, nome do banco de dados.

Feito isso vamos criar a primeira tabela chamada de agenda e que possui 5 campos, do jeito que está na imagem:

Criando a Tabela Agenda.

Agora vamos dar nomes aos campos e configurar seu tipo, tamanho, se é not null ou nul, auto_increment e etc. Feito o que está na imagem clique no botão salvar.

Nomeando as campos e configurando!

Criando a tabela menu que possui 4 campos.

Tabela Menu

Agora configurando essa tabela do mesmo modo que fizemos com a tabela agenda.

Nomeando e configurando os dados da tabela menu.

Pronto seu banco de dados está criado, agora precisa apenas inserir os dados na tabela menu, no nosso caso temos apenas dois link, então para não perder tempo vou mostrar como você poderá preencher os campos com seus respectivos valores, porém vou importar os dados executando na query do phpmyadmin.

Bem para colocar os dados um a um você clica na aba inserir e em seguida digita os dados:

Inserindo dados na tabela.

Para importar usando a query do phpmyadmin vá até a aba sql, digite ou copie e cole o código abaixo:

INSERT INTO `menu` (`id`, `nomeMenu`, `link`, `title`) VALUES
(null, 'Cadastrar um Número', 'CadAgenda.php', 'Cadastrar Números na agenda.'),
(null, 'Números da Agenda', 'ListaAgenda.php', 'Listar  os Números da Agenda');
Inserindo os dados na tabela menu usando a aba sql.

Bem agora até o próximo post, valeu!

Linguagem PHP: 2ª Parte (Classe para inserir, deletar e atualizar) – Criando uma Agenda de Contatos.


Criando uma Agenda de Contatos – Classe para inserir, deletar e atualizar.

Jbwebmaster João Batista Dantas Bezerra Júnior

Olá pessoal, continuando o tutorial, vamos desenvolver a classe que realizará a manutenção do sistema, sendo a responsável por inserir, deletar e atualizar. Nesse tutorial iremos intender, dentre várias instruções, o conceito de ter uma classe abstrata.

  • Crie uma classe chamada Modelo.class.php no diretório Classes.
  • O nome da classe será Modelo (class Modelo { } ).

Agora vamos a sua construção:

Para começar, vamos precisar estender a classe Conexao, para isso chamamos a instrução include_once, que além de incluir o arquivo somente uma vez ainda avalia-o, depois do nome da classe usamos extends em seguida Conexao. Mais informações. Ficando assim:

abstract class Modelo extends Conexao { }

Entendendo quando usar a palavra chave abstract:

Usamos uma classe abstrata sempre que precisamos utilizar seus métodos mais vezes e para vários objetos, dessa forma ao invés dela servir a um único propósito ela pode ser generalizada e usada para outros objetivos. De acordo com a Caelum, usamos a palavra chave abstract também para impedir que ela possa ser instanciada. No nosso caso, a classe Modelo é abstrata, pois podemos usar em várias outras classes seus métodos para inserir, deletar e atualizar, servindo de molde para todas as classes que a herdarem e para evitar o erro de tentar instancia-la. Como por exemplo, você possui a classe Vectra e Palio sendo que os dados comuns a essas classes poderiam ficar numa classe chamada Carro, dessa forma a classe Carro seria abstrata e as outras herdam dela os dados comuns:

exemplo de classe abstrata

Como deve estar até agora:

/*
 * ******************************************************************************
 *    JBWEBMASTER - CLASSE MODELO PARA MANIPULAÇÃO COM O BANCO DE DADOS        *
 *                AUTOR: JOAO BATISTA DANTAS BEZERRA JUNIOR                    *
 *                E-MAIL: jbtrab@gmail.com                                     *
 *                        DATA: 18/12/2010                                     *
 * *****************************************************************************
 */

include_once("Conexao.class.php");

abstract class Modelo extends Conexao { }

Feito isso, vamos construir o método que verifica a chave primária, para quem não sabe o que significa, chave primária corresponde a um campo ou mais da tabela do banco de dados em que seus valores nunca se repetem, sendo geralmente o identificado da tabela em questão (ID), deixando essa linha única.

Para a construção desse método se faz necessário os conceitos:

  • get_object_vars – Retorna uma matriz associativa com as propriedades do objeto (Manual PHP).
  • Foreach – funciona somente com arrays, e lançará um erro se tentar utilizá-lo em uma variável de qualquer tipo diferente ou em variáveis não inicializadas. O foreach varre uma matriz e em cada iteração atribui um valor avançando seu ponteiro interno para o próximo elemento (apostilas.fok).
  • If – é um estrutura de controle que permite a execução de parte do código.
  • Array – Um array no PHP é atualmente um mapa ordenado. Um mapa é um tipo que relaciona valores para chaves. Este tipo é otimizado de várias maneiras, então você pode usá-lo como um array real, ou uma lista (vetor), hashtable (que é uma implementação de mapa), dicionário, coleção, pilha, fila e provavelmente mais. Como você pode ter outro array PHP como um valor, você pode facilmente simular árvores (Manual PHP).

Vamos chamar nosso método de chavePrimaria, public function chavePrimaria() { }, criamos uma variável para saber em que posição do loop vai estar que é $c, a variável $var receberá as propriedades da classe em questão assim: $var = get_object_vars($this); . Agora construímos um loop através do foreach, pois se trata de um array, dessa forma em cada iteração verificamos se na primeira posição do valor emitido pelo loop a $nome, se possui um _ (anderline) e se $c for zero (0), então a variável $cp (chave primária) recebe o valor de $nome.

Chave primária:

    /**
     * FUNCAO USADA PARA RETORNAR A CHAVE PRIMARIA DA TABELA.
     * @return UMA STRING COM O ATRIBUTO CHAVE PRIMARIA.
     */
    public function chavePrimaria() {
        $c = 0;
        //vai pegar nomes e conteudos das propriedades dos objetos
        $var = get_object_vars($this);
        foreach ($var as $nome => $valor) {
            //SE A PRIMEIRA POSICAO FOR UM ANDERLINE E
            // O $c ESTIVER NA PRIMEIRA POSIÇÃO (ZERO) ENTÃO É UMA CHAVE PRIMARIA
            if ($nome[0] == "_") {
                if ($c == 0) {
                    $cp = $nome;
                }
            }
            $c++;
        }
        return $cp;
    }

Agora vamos construir o método para inserir os dados no banco de dados MySql, sendo necessário conhecer:

OBS: Só colocarei o que ainda não estudamos até agora, então fique atento e caso queira saber dos demais, volte e leia as informações do outros métodos.

Manual PHP:

  • strtolower – Converte uma string para minúsculas.
  • get_class – Retorna o nome da classe de um objeto.
  • strlen – Retorna o tamanho de uma string.
  • Deve conhecer um pouco de SQL.

Chame o método de inserir, public function inserir() { }, a variável $var irá receber as propriedades da classe ($var = get_object_vars($this);), iniciamos a construção do sql: $sql = “INSERT INTO ” . strtolower(get_class($this)) . ” (“; , veja que o nome da classe será a que estiver instanciada, dessa forma o get_class retorna o nome da classe instanciada e o strtolower transforma tudo em minúsculos. Continuando a instrução sql agora temos que passar as variáveis, para isso foi utilizado o foreach e instruções de controle if, os dois juntos vão retornar todas as variáveis da classe em questão, o problema fica no final que receberia aspas simples e um sinal de virgula a mais. Para resolver esse problema foi utilizado strlen que retorna o tamanho da string e substituímos os últimos caracteres para vazio.

Terminado essa etapa instanciamos a classe Conexão, chamamos o método conectar, executamos o sql que foi feito e desconectamos.

Inserir:

/**
     * FUNCAO PARA INSERIR OS DADOS NO BANCO DE DADOS
     */
    public function inserir() {

        $var = get_object_vars($this);
        //CONSTRUINDO A INSTRUÇÃO SQL
        //UTILIZANDO strtolower PARA DEIXAR TUDO EM MINÚSCULO
        //get_class($this) PEGA A CLASSE ATUAL, QUE FOI INSTANCIADA
        $sql = "INSERT INTO " . strtolower(get_class($this)) . " (";
        foreach ($var as $nome => $valor) {
            //VERIFICANDO SE É CHAVE PRIMÁRIA - $nome[0] != "_" - CASO NÃO
            //CONTINUA A CONCATENAR OS $campos .= "$nome,"; E $valores .= "$valor','";
            if ($nome[0] != "_") {
                $campos .= "$nome,";
                $valores .= "$valor','";
            }
        }
        /*
         * utilizamos strlen para contar quantos caracteres existem na string,
         * mas também modificar acessando um de seus caractéres.
         */
        $uc = strlen($campos);
        //no nosso caso modificamos o último caracter que seria "," por " ".
        $campos[$uc - 1] = ' ';
        $uc = strlen($valores);
        $valores[$uc - 1] = ' ';
        $valores[$uc - 2] = ' ';
        //concatenar para formar uma instrução sql para inserir os dados.
        $sql = $sql . $campos . ") VALUES ('" . $valores . ")";
        //instanciando a classe conexão
        $con = new Conexao();
        //conectando ao mysql
        $con->conectar();
        //executando o sql passado
        $con->execSQL($sql);
        //desconectando
        $con->desconectar();
    }

Método para atualizar os dados do banco de dados. Utiliza-se das mesmas instruções php vistas no método inserir. As mudanças ficam a cargo da forma da construção do sql, por exemplo: UPDATE agenda SET nome = ‘joao’, numero = ‘33333333’, dataInclusao = ’11/01/03′, comentario = ‘teste’ WHERE idList=1.O foreach possui uma mudança, agora é verificado se o campo que o loop está retornando não é a chave primária, pois no sql de atualização só é necessário o id na condição WHERE, para isso passei por parâmetro $ch, $id. O resto permanece igual ao método inserir.

Atualizar:

/**
     * FUNCAO PARA ATUALIZAR OS DADOS DO BANCO DE DADOS
     * @param <String> $ch CHAVE PRIMARIA.
     * @param <String> $id ID FORNECIDO, NESSE CASO POR GET.
     */
    public function atualizar($ch, $id) {
        $var = get_object_vars($this);
        //CONSTRUINDO A INSTRUÇÃO SQL
        //UTILIZANDO strtolower PARA DEIXAR TUDO EM MINÚSCULO
        //get_class($this) PEGA A CLASSE ATUAL, QUE FOI INSTANCIADA
        $sql = "UPDATE " . strtolower(get_class($this));
        $sql .= " SET ";
        foreach ($var as $campo => $valor) {
            if ($campo[0] != "_") {
                if ($campo != $this->chavePrimaria()) {
                    $sql .= " $campo = '$valor',";
                }
            }
        }
        $uc = strlen($sql);
        $sql[$uc - 1] = ' ';
        $sql .= "WHERE $ch=$id";
        //instanciando a classe conexão
        $con = new Conexao();
        //conectando ao mysql
        $con->conectar();
        //executando o sql passado
        $con->execSQL($sql);
        //desconectando
        $con->desconectar();
    }

Função deletar é a mais simples, só é necessário passar o id e o valor do id por parâmetro para o sql e deletar, as instruções php também já foram explicados.

Deletar:

/**
     * DELETAR OS DADOS DO BANCO DE DADOS
     * @param <String> $ch CHAVE PRIMARIA.
     * @param <String> $id ID FORNECIDO, NESSE CASO POR GET.
     */
    public function deletar($ch, $id) {
        //CONSTRUINDO A INSTRUÇÃO SQL
        //UTILIZANDO strtolower PARA DEIXAR TUDO EM MINÚSCULO
        //get_class($this) PEGA A CLASSE ATUAL, QUE FOI INSTANCIADA
        // A CONDIÇÃO PARA QUE OCORRA UMA EXCLUSÃO É QUE $ch = '$id', CHAVE PRIMÁRIA
        // IGUAL AO ID RECEBIDO POR GET.
        $sql = "DELETE FROM " . strtolower(get_class($this)) . " WHERE $ch = '$id'";
        //instanciando a classe conexão
        $con = new Conexao();
        //conectando ao mysql
        $con->conectar();
        //executando o sql passado
        $con->execSQL($sql);
        //desconectando
        $con->desconectar();
    }

Agora todo o código fonte:

<?php

/*
 * ******************************************************************************
 *    JBWEBMASTER - CLASSE MODELO PARA MANIPULAÇÃO COM O BANCO DE DADOS        *
 *                AUTOR: JOAO BATISTA DANTAS BEZERRA JUNIOR                    *
 *                E-MAIL: jbtrab@gmail.com                                     *
 *                        DATA: 18/12/2010                                     *
 * *****************************************************************************
 */

include_once("Conexao.class.php");

abstract class Modelo extends Conexao {

    /**
     * FUNCAO USADA PARA RETORNAR A CHAVE PRIMARIA DA TABELA.
     * @return UMA STRING COM O ATRIBUTO CHAVE PRIMARIA.
     */
    public function chavePrimaria() {
        $c = 0;
        //vai pegar nomes e conteudos das propriedades dos objetos
        $var = get_object_vars($this);
        foreach ($var as $nome => $valor) {
            //SE A PRIMEIRA POSICAO FOR UM ANDERLINE E
            // O $c ESTIVER NA PRIMEIRA POSIÇÃO (ZERO) ENTÃO É UMA CHAVE PRIMARIA
            if ($nome[0] == "_") {
                if ($c == 0) {
                    $cp = $nome;
                }
            }
            $c++;
        }
        return $cp;
    }

    /**
     * FUNCAO PARA INSERIR OS DADOS NO BANCO DE DADOS
     */
    public function inserir() {

        $var = get_object_vars($this);
        //CONSTRUINDO A INSTRUÇÃO SQL
        //UTILIZANDO strtolower PARA DEIXAR TUDO EM MINÚSCULO
        //get_class($this) PEGA A CLASSE ATUAL, QUE FOI INSTANCIADA
        $sql = "INSERT INTO " . strtolower(get_class($this)) . " (";
        foreach ($var as $nome => $valor) {
            //VERIFICANDO SE É CHAVE PRIMÁRIA - $nome[0] != "_" - CASO NÃO
            //CONTINUA A CONCATENAR OS $campos .= "$nome,"; E $valores .= "$valor','";
            if ($nome[0] != "_") {
                $campos .= "$nome,";
                $valores .= "$valor','";
            }
        }
        /*
         * utilizamos strlen para contar quantos caracteres existem na string,
         * mas também modificar acessando um de seus caractéres.
         */
        $uc = strlen($campos);
        //no nosso caso modificamos o último caracter que seria "," por " ".
        $campos[$uc - 1] = ' ';
        $uc = strlen($valores);
        $valores[$uc - 1] = ' ';
        $valores[$uc - 2] = ' ';
        //concatenar para formar uma instrução sql para inserir os dados.
        $sql = $sql . $campos . ") VALUES ('" . $valores . ")";
        //instanciando a classe conexão
        $con = new Conexao();
        //conectando ao mysql
        $con->conectar();
        //executando o sql passado
        $con->execSQL($sql);
        //desconectando
        $con->desconectar();
    }

    /**
     * FUNCAO PARA ATUALIZAR OS DADOS DO BANCO DE DADOS
     * @param <String> $ch CHAVE PRIMARIA.
     * @param <String> $id ID FORNECIDO, NESSE CASO POR GET.
     */
    public function atualizar($ch, $id) {
        $var = get_object_vars($this);
        //CONSTRUINDO A INSTRUÇÃO SQL
        //UTILIZANDO strtolower PARA DEIXAR TUDO EM MINÚSCULO
        //get_class($this) PEGA A CLASSE ATUAL, QUE FOI INSTANCIADA
        $sql = "UPDATE " . strtolower(get_class($this));
        $sql .= " SET ";
        foreach ($var as $campo => $valor) {
            if ($campo[0] != "_") {
                if ($campo != $this->chavePrimaria()) {
                    $sql .= " $campo = '$valor',";
                }
            }
        }
        $uc = strlen($sql);
        $sql[$uc - 1] = ' ';
        $sql .= "WHERE $ch=$id";
        //instanciando a classe conexão
        $con = new Conexao();
        //conectando ao mysql
        $con->conectar();
        //executando o sql passado
        $con->execSQL($sql);
        //desconectando
        $con->desconectar();
    }

    /**
     * DELETAR OS DADOS DO BANCO DE DADOS
     * @param <String> $ch CHAVE PRIMARIA.
     * @param <String> $id ID FORNECIDO, NESSE CASO POR GET.
     */
    public function deletar($ch, $id) {
        //CONSTRUINDO A INSTRUÇÃO SQL
        //UTILIZANDO strtolower PARA DEIXAR TUDO EM MINÚSCULO
        //get_class($this) PEGA A CLASSE ATUAL, QUE FOI INSTANCIADA
        // A CONDIÇÃO PARA QUE OCORRA UMA EXCLUSÃO É QUE $ch = '$id', CHAVE PRIMÁRIA
        // IGUAL AO ID RECEBIDO POR GET.
        $sql = "DELETE FROM " . strtolower(get_class($this)) . " WHERE $ch = '$id'";
        //instanciando a classe conexão
        $con = new Conexao();
        //conectando ao mysql
        $con->conectar();
        //executando o sql passado
        $con->execSQL($sql);
        //desconectando
        $con->desconectar();
    }

}

?>

Posts seguintes:

  • Criação do banco de dados no phpmyadmin.
  • Formulário da Agenda.
  • Script usando os métodos inserir, deletar e atualizar os dados.

Até a próxima e só pra empolgar uma imagem do formulário:

 

Imagem do formulário da agenda de contatos

Espero que tenham gostado e boa sorte!

 

Passo a Passo da instalação do GLPI, além de sua descrição.


JBWEBMASTER – Apresentação e instalação do GLPI.

Olá pessoal, nesse tutorial irei explicar o que é, para que serve, instalação e demonstração do GLPI, usando a teoria através de pesquisas e um passo a passo através de um tutorial de instalação. Para facilitar o apredizado as informações foram divididas  por etapas, como:

  1. O QUE É HELP DESK?
  2. O QUE É ACORDO DE NÍVEL DE SERVIÇO?
  3. O QUE É GLPI?
  4. APRESENTAÇÃO DA FERRAMENTA E SUA INSTALAÇÃO

O QUE É HELP DESK?

Help Desk é uma ferramenta usada para solicitação de melhoria ou correção de máquinas ou serviços, designando o serviço de apoio aos usuários para suporte e resolução de problemas técnicos nas diversas áreas da TIC, sendo que este apoio pode ser tanto dentro de uma empresa, quanto externamente.

O QUE É ACORDO DE NÍVEL DE SERVIÇO?

Um acordo de nível de serviço é a parte de contrato de serviços entre duas ou mais entidades no qual o nível da prestação de serviço é definido formalmente, sendo que na prática, o termo é usado no contexto de tempo de entregas de um serviço ou de um desempenho específico.

O QUE É GLPI?

GLPI é uma aplicação livre, distribuído sob a licença GPL para a gestão de parques de computador e helpdesk. Escrito em PHP, é composto de um conjunto de serviços web, para identificar e gerenciar todos os componentes do hardware e dos softwares, otimizando o trabalho dos profissionais de TIC. Oferece um sistema de atendimento a solicitações de usuário integrado com uma ferramenta de inventário, dessa forma podendo haver uma integração com o OCS Inventory, o destaque fica para o suporte a 22 idiomas e análise de TCO do inventario.

APRESENTAÇÃO DA FERRAMENTA E SUA INSTALAÇÃO

Requisitos importantes para a instalação do GLPI são:

  • XAMPP
  • PHP
  • MYSQL

Os principais recursos da aplicação se articulam em torno dos seguintes eixos:

  • Inventário dos computadores, periféricos, rede, impressoras e produtos afins.
  • Gestão de licenças (adquiridas, a serem adquiridas, sites, OEM..) e datas de expiração.
  • Indicação do hardware por área geográfica (sala, piso…).
  • Gestão das informações comerciais e financeiras (compra, garantia e extensão, amortização).
  • Gestão do estado do hardware.
  • Gestão dos pedidos de intervenção para todos os tipos de hardware do inventário.
  • Interface do usuário final para pedido de intervenção.
  • Gestão das empresas, contratos, documentos ligados aos elementos dos inventários…
  • Reserva de equipamentos.
  • Gestão de um sistema de base de conhecimentos hierárquicos (FAQ), gestão de um FAQ público.
  • Criação de relatórios sobre o hardware, dos relatórios da rede, dos relatórios sobre as intervenções.

No ultimo tópico mostrarei a integração do GLPI e o OCS Inventory NG, sendo uma solução muito valiosa para a automatização de funções.

Para poder instalar o GLPI deve instalar o XAMPP, que é um servidor independente de plataforma, um software livre, que consiste principalmente na base de dados MYSQL, o servidor web Apache e os interpretadores para linguagens de script: PHP e Perl, ou pode instalar outro a sua escolha.

Para começar faça o download do GLPI que deverá estar em arquivo zip, então extraia no htdocs do xampp ou se estiver com outro servidor talvez seja a pasta www. Feito isso vamos no navegador digitamos localhost/glpi e começamos a instalação.

  • Escolha da LÍngua de sua preferência para seguir com a instalação do GLPI.
FIGURA 1 – INICIANDO A INSTALAÇÃO DO GLPI, SELECIONANDO A LÍNGUA.
FIGURA 2 - TERMOS DA LICENÇA.
FIGURA 3 - AVANÇAR PARA INSTALAR O GLPI.
  • Nesse passo da instalação, foi verificada uma quantidade insuficiente de memória alocada 32MB, visto que o mínimo é de 64MB.  Abaixo segue as instruções de como resolver.
FIGURA 4 - CHECANDO A COMPATIBILIDADE DO SEU AMBIENTE E VERIFICANDO QUE POSSUI UMA QUANTIDADE BAIXA DE MEMÓRIA.

Para mudar isso,  primeiro você deve descobrir qual php.ini o seu GLPI está usando, pois verifiquei que possui alguns na pasta xampp\php outro na pasta xampp\apache\bin, no meu caso e talvez seja o seu, está no caminho c:\xampp\apache\bin\php.ini, que descobrir quando verifiquei no meu navegador que o GLPI estava usando um arquivo PHP chamado install.php que fica em glpi/install/install.php, dessa forma abrir o arquivo pesquisei por php.ini e encontrei o caminho já passado anteriormente.

Encontrado o php.ini agora pesquise dentro do arquivo por memory_limit, lá deve está com 32MB ou um outro, altere para 64MB salve o arquivo e restart (reinicie) o seu apache, depois isso vá na página e aperte no botão tentar novamente ou similar que vai está no final da página. Seguindo esses passos deve resolver o problema ficando assim:

FIGURA 5 - COMPATIBILIDADE VERIFICADA COM SUCESSO.

Configurando o banco de dados MYSQL, aqui como é local mesmo, coloquei o servidor como localhost, usuário root, e senha “sem senha”.

 

FIGURA 6 - CONFIGURAÇÃO COM O BANCO DE DADOS.
FIGURA 7 - INICINADO A BASE DE DADOS.

Usuários e senhas usadas em diversos níveis de acesso são:

glpi/glpi – administrador.
tech/tech para usuário técnico.
Normal/normal para usuário conta simples.

E com isso termina a instalação. Usando usuário e a senha glpi, logando como adminstrador.

Tela inicial do GLPI:

FIGURA 8 - TELA INICIAL DO GLPI.

Espero que gostem e que tenha ajudado.

Valeu até apróxima!

Linguagem PHP: 2ª Parte (Gerando o PDF) – Gerar um documento em PDF usando a biblioteca FPDF.


Olá pessoal, dando início a 2ª parte que é a criação do script PHP para gerar a página em PDF. Vamos utilizar a biblioteca FPDF, uma das mais conhecidas e usadas, para configurar a página PDF. As ferramentas utilizadas foram: O IDE Netbeans 6.9 (Oracle) e servidor web XAMPP (Apache) para testar e rodar as páginas. Hoje, poderíamos dizer que há mais pessoas usando o NetBeans do que qualquer outro IDE, a comunidade está prosperando, melhorando e crescendo de maneira vertiginosa e sempre com grande adesão por parte dos desenvolvedores. O Apache é um servidor web extremamente robusto, configurável e de alto desempenho, é também o mais bem sucedido servidor livre. Use as ferramentas que achar melhor ou tiver domínio.

Gosto de fazer as coisas bem organizadas, então para começar crie um projeto (pasta) com o nome GerarPdf, adicione os arquivos MetasTags, index.php e estilo.css que foram mostrados no post passado, 1ª parte. Nesse tutorial utilizei 3 imagens, são elas:

Baixe as imagens do tutorial aqui

Agora vamos dar início ao script chamado PaginaPdf.php. Precisará baixar a biblioteca FPDF, click aqui para baixar. Abra um arquivo PHP insira os códigos de abertura , insira um comentário breve sobre título, autor, e-mail e data. Para fazer comentário de múltiplas linhas utilize /**/, por exemplo:

/*
 *******************************************************************************
 *     JBWEBMASTER - Gerar um documento em PDF usando a biblioteca FPDF        *
 *                AUTOR: JOAO BATISTA DANTAS BEZERRA JUNIOR                    *
 *                E-MAIL: jbtrab@gmail.com                                     *
 *                        DATA: 28/09/2010                                     *
 * *****************************************************************************
 */

Depois de baixar a biblioteca coloque-a no mesmo projeto (pasta) GerarPdf, como ela está em arquivo zip, extraia para a pasta GerarPdf, agora na página PHP insira a biblioteca usando require ‘BibliotecaFPDF/fpdf.php’; , o require é idêntico ao “include” exceto em caso de falha que irá produzir um nível de erro e irá parar o script. Feito isso defina a fonte, define (‘FPDF_FONTPATH’, ‘BibliotecaFPDF/font/’); , se o arquivo que corresponde à fonte solicitada não existir, o erro “Could not include font metric file” (não foi possível incluir o arquivo de fonte) é DISPARADO, para que isso não ocorra defina o caminho a fonte e não esqueça de colocar a barra no final é obrigatória “/”.

Agora vamos capturar os valores do formulário, declare a variável e faça-a receber o conteúdo de $_POST assim:

//numero do processo
//exemplo do numero do processo 08664-001098/2010-09
$numProcesso = $_POST["numeroProcesso"];

Onde $numProcesso é a variável e numeroProcesso é o correspondente valor de “name” no HTML, mais dois exemplos:

//numero da nota fiscal
$numNotaFiscal = $_POST["notaFiscal"];
//nome da <span class="hiddenGrammarError" pre="da ">empresa
$empresa</span> = $_POST["nomeEmpresa"];

No final disponibilizarei o código completo.

Em seguida instanciamos a classe FPDF chamando seu construtor, $pdf = new FPDF (“P”, “mm”, “A4”); , FPDF é o construtor da classe e permite que seja definido o formato da página P=Retrato ou L= Paisagem, mm = tipo de medida utilizada no casso milímetros e tipo de folha = A4, para outras informações acesse o manual FPDF. Agora definimos as margens com a função SetMargins, define as margens esquerda, superior e direita. Por padrão elas são iguais a 1 cm sendo assim chame este método para alterá-las, $pdf->SetMargins(30, 20, 30); , como a medida está em milímetros então usei 30, 20 e 30. Função SetFont define a fonte que será usada para imprimir os caracteres do texto, é obrigatório chamar esse método ao menos uma vez ou o documento resultante não será válido.  A fonte será mantida de uma página para outra, agora sempre que quiser mudar a fonte chame esse método novamente, dessa forma pode mudar a fonte a qualquer momento. Procure usar as fontes padrão ou adicione uma através do método AddFont(). Definindo a fonte a ser usada, estilo e tamanho $pdf->SetFont(‘arial’, ”, 12);. Agora definimos o assunto $pdf->SetSubject(“Gerar PDF com FPDF”);. $pdf->SetY(“-1”); define a abscissa da posição corrente e se o valor passado for negativo, ele será relativo à margem direita da página.  $pdf->SetX(“10”); move a abscissa atual de volta para margem esquerda e define a ordenada. Se o valor passado for negativo, ele será relativo à margem inferior da página.

Exemplo das funções mencionadas até aqui:

$pdf = new FPDF("P", "mm", "A4");
$pdf->SetMargins(30, 20, 30);
$pdf->SetFont('arial', '', 12);
$pdf->SetTitle("Gerar PDF com FPDF");
$pdf->SetSubject("Gerar PDF com FPDF");
$pdf->SetY("-1");

Construindo o cabeçalho:

Pensando em várias páginas, resolvi fazer o cabeçalho em outra página chamada cabeçalho.php. Outras funções usadas: Image coloca uma imagem na página, $pdf->Image(“brasao.gif”); , função Line, que desenha uma linha entre dois pontos, $pdf->Line(70, 48, 70, 23); e MultiCell, função que permite imprimir um texto com quebras de linha, podendo ser alinhado, centralizado ou justificado, $pdf->MultiCell(90, 5, utf8_decode($textoCabecalho), 0, “L”); , largura 90, altura 5, texto e nesse caso utilizei o utf8_decode() para que fosse interpretado os caracteres e acentos, borda 0 que por padrão já é e alinhado a esquerda “L”. Defini o texto que ficará abaixo da imagem e usei o valor da variável nome da empresa, $textoImg = “BRASÃO da {$empresa}”; e adicionei o texto do cabeçalho:

$textoCabecalho = "DESENVOLVIDO POR \n";
$textoCabecalho .= "João Batista Dantas Bezerra Júnior ";
$textoCabecalho .= "JBWEBMASTER - Analista de Sistemas \n";
$textoCabecalho .= "Documento da {$empresa} \n";
$textoCabecalho .= "Processo n° {$numProcesso}";

OBS: “.=” serve para concatenar, juntando todas essas frases.

Dessa forma, usando as funções mostradas até aqui, o cabeçalho já pode ser feito ficando assim:

Nomeie essa página como: Cabecalho.php

<?php
/* 
 * CABECALHO DA PAGINA
 */

//CONFIGURACAO DA IMAGEM - IMAGEM 1
//posiciona horizontal 37mm da imagem
$pdf->SetX("37");
//gerando a imagem na pagina
$pdf->Image("brasao.gif");
//Definir a fonte e o tamanho 6 para o texto da imagem
$pdf->SetFont('arial', '', 6);
//posiciona horizontal 35mm do texto da imagem
$pdf->SetX("35");
//TEXTO DO IMAGEM
$textoImg = "BRASAO da {$empresa}";
/*
 * imprimir um texto com quebras de linhas
 * a largura 26.
 * a altura foi definida como 5 - dando um expasamento entre as linas,
 * vai depender de quanto vai precisar de espaco entre elas.
 * Para resolver o problema de acentuacao e/ou caracteres que serao
 * usados no pdf e aconselhavel usar utf8_decode() na saida do texto.
 */
$pdf->MultiCell(26, 5, utf8_decode($textoImg), 0, "L");

//TEXTO DO CABECALHO
$textoCabecalho = "DESENVOLVIDO POR \n";
$textoCabecalho .= "João Batista Dantas Bezerra Júnior ";
$textoCabecalho .= "JBWEBMASTER - Analista de Sistemas \n";
$textoCabecalho .= "Documento da {$empresa} \n";
$textoCabecalho .= "Processo nº {$numProcesso}";
//posiciona verticalmente
$pdf->SetY("23");
//posiciona horizontalmente
$pdf->SetX("70");
/*
 * Desenha uma linha entre dois pontos.
 * cordenadas do ponto 1 e 2 para a linha
 */
$pdf->Line(70, 48, 70, 23);
//Definir a fonte e o tamanho 12 para o texto do cabeCalho
$pdf->SetFont('arial', '', 12);
$pdf->MultiCell(90, 5, utf8_decode($textoCabecalho), 0, "L");
?>

Agora insira o cabeçalho na página usando o include ‘Cabecalho.php’;

Bem, mais quatro funções e você será capaz de desenvolver qualquer página em PDF usando a biblioteca FPDF. Função Cell(), AddPage(), Output() e Ln(). A função Cell imprime uma célula (área retangular) com bordas opcionais, cor de fundo e texto. AddPage(), adiciona uma página nova ao documento, função Output() que envia o documento para o destino informado: string, arquivo local ou browser, nesse tutorial escolhemos enviar para o  browser e a função Ln() que realiza uma quebra de linha.

OBS1: Perceba no código fonte final do script que foi chamada a função setFont algumas vezes, isso acontece pelo fato de que quando você define uma fonte para o cabeçalho essa fonte se estende para todo o script então se precisar de um tamanho de fonte menor precisar chama-lo mais uma vez antes de mandar imprimir o texto que quer. Por exemplo:

//Nesse caso foi dado o tamanho 12 para o texto do documento
$pdf->SetFont('arial', '', 12);
//texto principal do documento
// "x .= x" usado para concatenar e tem a mesma funçao que x = x.x
$texto .= "               Juntei ao processo n° $numProcesso a nota fiscal n° $numNotaFiscal da empresa $empresa, e os ";
$texto .= "termos de recebimento provisório e definitivo, passando a compor as folhas ";
$texto .= "de n° $folhas.";
$texto .= "";

OBS2: Veja que já coloquei as variáveis aonde eu queria no texto que quero imprimir, como no caso “processo n° $numProcesso”.

OBS3: Para realizar as quebras de linhas não esqueça de usar o Ln().

OBS4: Usando a função MultiCell, não é necessário quebrar as linhas essa função já faz, ao indicar sua largura com 0 por padrão irá até o limite da margem direita, já a altura precisará ser indicada e vai ser ela a responsável pelo espaçamento entre as linhas do texto.

OBS5: Acesse o Manual FPDF para saber mais sobre as funções mencionadas aqui e outras.

Bom, com toda essa explicação e com os comentários das linhas de código que estão no código fonte, será capaz de entender, construir e aperfeiçoar sua página PDF. O código fonte do script PaginaPdf.php segue abaixo:

Nomeie essa página como: PaginaPdf.php

<?php

/*
 *******************************************************************************
 *     JBWEBMASTER - Gerar um documento em PDF usando a biblioteca FPDF        *
 *                AUTOR: JOAO BATISTA DANTAS BEZERRA JUNIOR                    *
 *                E-MAIL: jbtrab@gmail.com                                     *
 *                        DATA: 28/09/2010                                     *
 * *****************************************************************************
 */


require 'BibliotecaFPDF/fpdf.php';
define('FPDF_FONTPATH', 'BibliotecaFPDF/font/');

/*
 * CONFIGURANDO A PAGINA
 */

//RECEBENDO VALORES DO FORMULARIO:
//numero do processo
//exemplo do numero do processo 08664-001098/2010-09
$numProcesso = $_POST["numeroProcesso"];
//numero da nota fiscal
$numNotaFiscal = $_POST["notaFiscal"];
//nome da empresa
$empresa = $_POST["nomeEmpresa"];
//numero das folhas
$folhas = $_POST["numeroFolhas"];
//Data do documento
$dataDoc = $_POST["dataDoc"];
//Nome do responsavel pelo documento
$responsavelDoc = $_POST["nomeResponsavel"];
//Tipo do responsavel
$tipoResponsavelDoc = $_POST["TipoResponsavel"];
//Matricula do responsavel
$matriculaResponsavel = $_POST["matricula"];

/*
 * construtor da classe, que permite que seja definido o formato da pagina
 * P=Retrato, mm =tipo de medida utilizada no casso milimetros,
 * tipo de folha = A4
 */
$pdf = new FPDF("P", "mm", "A4");
//Define as margens esquerda, superior e direita.
$pdf->SetMargins(30, 20, 30);
//define a fonte a ser usada, estilo e tamanho
$pdf->SetFont('arial', '', 12);
//define o titulo
$pdf->SetTitle("Gerar PDF com FPDF");
//assunto
$pdf->SetSubject("Gerar PDF com FPDF");
// posicao vertical no caso -1.. e o limite da margem
$pdf->SetY("-1");

//inserir o cabecalho da pagina
include 'Cabecalho.php';

//espacamento
$pdf->Ln(30);
//define a fonte a ser usada, estilo e tamanho
//Nesse caso foi dado o tamanho 14 ao ti­tulo do documento
$pdf->SetFont('arial', '', 14);
//variavel que recebe o texto
$titulo = "Gerar um documento em PDF usando a biblioteca FPDF.";
//imprimi o texto em uma celula
$pdf->Cell(0, 10, $titulo, 0, 0, 'C');
//define a fonte a ser usada, estilo e tamanho
//Nesse caso foi dado o tamanho 12 para o texto do documento
$pdf->SetFont('arial', '', 12);

//texto principal do documento
// "x .= x" usado para concatenar e tem a mesma funcao que x = x.x
$texto .= "               Juntei ao processo nº $numProcesso a nota fiscal nº $numNotaFiscal da empresa $empresa, e os ";
$texto .= "termos de recebimento provisório e definitivo, passando a compor as folhas ";
$texto .= "de nº $folhas.";
$texto .= "";

//margens do texto principal
//medidas das margens
$pdf->SetMargins(30, 20, 30);
//posiciona verticalmente 41mm
$pdf->SetY("41");
//posiciona horizontalmente 10mm
$pdf->SetX("10");
//espacamento
$pdf->Ln(70);
/*
 * imprimir um texto com quebras de linhas
 * a largura sendo 0, serao extendidas ate a margem direita da pagina.
 * a altura foi definida como 7 - dando um expacamento entre as linas,
 * vai depender de quanto vai precisar de espaco entre elas.
 * Para resolver o problema de acentuacao e/ou caracteres que serao
 * usados no pdf e aconselhavel usar utf8_decode() na saida do texto.
 */
$pdf->MultiCell(0, 7, utf8_decode($texto));
//espacamento
$pdf->Ln(5);
//data do documento
$textoData = "Em {$dataDoc}.";
/*
 * celular de largura 94, altura 10, texto ja¡ com utf8_decode(), bordas 0,
 * posicionar a direita, texto alinha ao centro
 */
$pdf->Cell(94, 10, $textoData, 0, 0, 'C');
//espacamento
$pdf->Ln(15);
//data do documento
$rodape = "$responsavelDoc\n";
$rodape .= "$tipoResponsavelDoc\n";
$rodape .= "Mat. " . $matriculaResponsavel;
//rodape
//posiciona verticalmente 190mm
$pdf->SetY("190");
//posiciona horizontalmente 60mm
$pdf->SetX("60");
/*
 * imprimir um texto com quebras de linhas
 * a largura de 90.
 * a altura foi definida como 7 - dando um expacamento entre as linas,
 * borda 0 - sem bordas, no caso de nao informar o padrao e 0 (zero)
 * vai depender de quanto vai precisar de espaco entre elas.
 * Para resolver o problema de acentuacao e/ou caracteres que serao
 * usados no pdf e aconselhavel usar utf8_decode() na saida do texto.
 */
$pdf->MultiCell(90, 7, utf8_decode($rodape), 0, "C");

/*
 * IMPRIMIR A SAIDA DO ARQUIVO
 * nome do arquivo
 * I: envia o arquivo diretamente para o browser,
 * Se o plug-in estiver instalado ele serao usado.
 * mais opcoes no final do artigo ou visite o manual fpdf.
 */
$pdf->Output("PaginaPdf", "I");
?>

Com isso termino esse tutorial, espero que tenha ajudado e até a próxima.

Exemplo das funções mencionadas até aqui:

Linguagem PHP: 1ª Parte (Formulário) – Gerar um documento em PDF usando a biblioteca FPDF.


Jbwebmaster – João Batista Dantas Bezerra Júnior

Olá pessoal, hoje vamos aprender como gerar um documento em PDF usando a biblioteca FPDF, uma das mais utilizadas em PHP, será dividido em  2 partes. Na 1ª parte, para ficar mais completo, desenvolvi uma página em PHP + HTML  contendo um formulário que vai ser o responsável por enviar os dados para a outra página em PHP que ficará responsável por gerar o arquivo em PDF no navegador, você também verá que pode optar por: envia para o browser e forçar o download do arquivo e por salvar em um arquivo local. O objetivo é a criação do PDF através de parâmetros fornecidos pelo formulário mostrado nessa 1ª parte, portanto os detalhes ficam a cargo do script PHP que virá na 2ª parte deste artigo. Esse formulário envia os dados pelo método do tipo POST, um formulário simples. Também desenvolvi o CSS dessa página, os códigos seguem abaixo:

MetasTags.php

Metas Tags, que são etiquetas que descrevem o conteúdo do seu site para os buscadores. Poderá baixar o arquivo no link: MetasTags.php. As Metas Tags usadas foram:
– A meta tag (meta http-equiv=”content-language” content=”pt-br”), serve para referenciar a linguagem do conteúdo da página.
– A meta tag (meta http-equiv=”content-type” content=”text/html; charset=UTF-8″), serve para informar o conjunto de caracteres dentro da página.
– A meta tag (meta name=”title” content=”Gerar um documento em PDF usando a biblioteca FPDF.”), informa o título do documento.
– A meta tag (meta name=”author” content=”Joao Batista Dantas Bezerra Junior”), informa o autor da página.
– A meta tag (meta name=”robots” content=”index,follow” ), essa meta tag é muito importante, pois será responsável por dizer se seu site ficará visível nos sites de busca ou não.
– A meta tag (meta name=”generator” content=”NetBeans IDE 6.9” ), informa qual Software foi utilizado para a construção da página. Conheça mais sobre metas tags.
OBS: Perceba que no código fonte existe uma contra barra (\) antes de cada aspa (“), esse é o caracter de controle e serve para escapar as aspas, interpretando como uma string.

Código Fonte:

<?php
echo "  <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />
        <meta http-equiv=\"content-language\" content=\"pt\" />
        <meta name=\"title\" content=\"Gerar um documento em PDF usando a biblioteca FPDF.\" />
        <meta name=\"author\" content=\"Joao Batista Dantas Bezerra Junior\" />
        <meta name=\"robots\" content=\"index,follow\" />
        <meta name=\"generator\" content=\"NetBeans IDE6.9\" />
";
?>

Página index.php

Essa página será responsável por enviar os parâmetros ou dados para a página PHP que gera o PDF, servindo de suporte aqueles que queiram saber como fazer para enviar os dados através do formulário. Poderá baixar o arquivo no link: index.php. Bem, com essa página você poderá usar como base para a sua, não perdendo mais tempo, como já disse anteriormento não entrarei em detalhes na construção do formulário, orientação das DIVs e etc, pois esse não é o objetivo desse post. O HTML já foi validado pela W3C.

Código Fonte:

<!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">
    <!--
    *******************************************************************************
    *     JBWEBMASTER - Gerar um documento em PDF usando a biblioteca FPDF        *
    *                AUTOR: JOAO BATISTA DANTAS BEZERRA JUNIOR                    *
    *                E-MAIL: jbtrab@gmail.com                                     *
    *                        DATA: 28/09/2010                                     *
    *******************************************************************************
    -->
    <head>
        <?php include_once 'MetasTags.php'; ?>
        <title>Gerar um documento em PDF usando a biblioteca FPDF.</title>
        <!--ESTILO DA PAGINA FORMULARIO-->
        <link href="estilo.css" rel="stylesheet" type="text/css" />
    </head>
    <body>
        <div class="cabecalho">
            <h2>Gerar um documento em PDF usando a biblioteca FPDF.</h2>
            <div class="contato"><a href="https://jbwebmaster.wordpress.com/" title="Voltar para P&aacute;gina inicial">
                    Natal/RN 2010 - Desenvolvido por: Jo&atilde;o Batista Dantas B. J&uacute;nior - JBWEBMASTER -
                    CONTATO/D&Uacute;VIDAS: jbtrab@gmail.com</a></div>
        </div>
        <div class="central">
            <div class="frmManut">
                <form method="post" action="PaginaPdf.php" name="frmLista" target="blank">

                    <div class="titulo">Documento da Empresa X</div>
                    <div class="colunaUmLinhaUm">
                        <p>
                            <label for="numeroProcesso">N&uacute;mero do Processo:</label>
                            <br />
                            <input type="text" name="numeroProcesso" value="" />
                        </p>
                        <p>
                            <label for="notaFiscal">N&uacute;mero Nota Fiscal:</label>
                            <br />
                            <input type="text" name="notaFiscal" value="" />
                        </p>
                        <p>
                            <label for="nomeEmpresa">Nome da Empresa:</label>
                            <br />
                            <input type="text" class="nomeEmpresa" name="nomeEmpresa" value="" />
                        </p>
                    </div>
                    <div class="colunaDoisLinhaUm">
                        <p>
                            <label for="numeroFolhas">N&uacute;mero das Folhas:</label>
                            <br />
                            <input type="text" name="numeroFolhas" value="" />
                        </p>
                        <p>
                            <label for="dataDoc">Data do Documento:</label>
                            <br />
                            <input type="text" class="dataDoc" name="dataDoc" value="" />
                        </p>
                        <p>
                            <label for="nomeResponsavel">Nome do Respons&aacute;vel:</label>
                            <br />
                            <input type="text" class="nomeResponsavel" name="nomeResponsavel" value="" />
                        </p>
                    </div>
                    <div class="colunaTresLinhaUm">
                        <p>
                            <label for="TipoResponsavel">Tipo do Respons&aacute;vel:</label>
                            <br />
                            <select name="TipoResponsavel">
                                <option>Estagi&aacute;rio</option>
                                <option>Contratado</option>
                            </select>
                        </p>
                        <p>
                            <label for="matricula">Matr&iacute;cula:</label>
                            <br />
                            <input type="text" class="matricula" name="matricula" value="" />
                        </p>
                    </div>
                    <p>
                        <span><input type="submit" value="Gerar o Documento em PDF" name="enviar" /></span>
                    </p>
                </form>
            </div>
        </div>
        <div class="rodape">
           Natal/RN 2010 - Desenvolvido por: Jo&atilde;o Batista Dantas B. J&uacute;nior - JBWEBMASTER - CONTATO/D&Uacute;VIDAS: jbtrab@gmail.com
        </div>
    </body>
</html>

Página estilo.css

Página de estilo responsável por toda configuração da página index.php. Poderá baixar o arquivo no link: estilo.css.

Código Fonte:

@charset "utf-8";
/* 
    Document: CSS 
    Created on: 16/10/2010, 10:44:03
    Author: Joao Batista Dantas B. Júnior
    Contato: jbtrab@gmail.com
*/
* {
    margin:0px;
    padding:0px;
    top:0px;
    left:0px;
    position: relative;
    text-align:center;
}
body{
    background-image:url(fundo.PNG);
    background-color:#C0C0C0;
    background-repeat:repeat;
    background-attachment:fixed;
    padding-top:5px;
    padding-bottom:5px;
    font-weight: bolder;
    color: #000000;
    font: 80% Arial, Helvetica, sans-serif;
}

.cabecalho{
    background-image: url(novoLay2.png);
    background-repeat:repeat-x;
    margin: auto;
    width: 100%;
    height: 140px;
}

.contato{
    font-size: 100%;
    font-family: verdana;
    font-weight: bolder;
    margin-top:6px;
    width: 100%;
    height: auto;
    position: absolute;
    color: white;
}
.contato a:link{
    text-decoration: none;
    color: #000000;
}
.contato a:hover{
    text-decoration: none;
    color: #000099;
}
.contato a:visited{
    text-decoration: none;
    color: #000000;
}
.cabecalho h2{
    font-size: 180%;
    font-family: verdana;
    font-weight: bolder;
    margin-top:50px;
    width: 100%;
    height: auto;
    position: absolute;
    color: white;
}
.central{
    background-color: #C0C0C0;
    padding-top:20px;
    padding-bottom:20px;
    margin: auto;
    margin-top: 50px;
    margin-bottom: 50px;
    width:900px;
    height:auto;
}

/*Formulario de manutencao*/
div.frmManut{
    width:auto;
    height:auto;
    margin:auto;
    font-size: 95%;
    font-weight:bolder;
    text-align:left;
}
div.frmManut .numero{
    width: 100px;
}
div.frmManut form input{
    text-align:left;
    border-left-style:solid;
    border-left-color:gray;
    border-top-style:solid;
    border-top-color:gray;
    text-align:left;
    width: 200px;
}
div.frmManut form select{
    text-align:left;
    border-left-style:solid;
    border-left-color:gray;
    border-top-style:solid;
    border-top-color:gray;
    text-align:left;
    width: 200px;
}
div.frmManut span input{
    padding: 10px;
    margin: auto;
    margin-top: 90px;
    margin-left: 75px;
    background-color:#000099;
    color:white;
    text-align:center;
    font-size:110%;
    font-weight:bolder;
    border-style: outset;
    border-width: 4px;
    border-color: white;
    cursor:pointer;
    width: auto;
}
div.frmManut form p{
    padding-bottom:10px;
    text-align:justify;
}
/*PAGINA UM DO TERMO*/
div.frmManut form .titulo{
    background-color: #ccccaf;
    padding-top: 15px;
    padding-bottom: 15px;
    width: auto;
    height: auto;
    text-align:center;
    font-size: 140%;
    color:#000099;
}
div.frmManut form .colunaUmLinhaUm {
    margin-top: 10px;
    margin-left:75px;
    position:relative;
    width: 250px;
    height: auto;
}
div.frmManut form .colunaDoisLinhaUm {
    margin-top: -131px;
    margin-left:345px;
    position:relative;
    width: 250px;
    height: auto;
}
div.frmManut form .colunaTresLinhaUm {
    margin-top: -133px;
    margin-left:605px;
    position:relative;
    width: 250px;
    height: auto;
}

/************   RODAPE   *************/

div.rodape{
    padding-bottom: 6px;
    padding-top: 6px;
    cursor: text;
    font-weight:bolder;
    margin:auto;
    width: 100%;
    height: auto;
    background-color:#fff34f;

}