TCPDF, um dos mais ativos projetos hospedados em Sourceforge.net, implementa um poderoso mecanismo de geração de PDF, inteiramente em PHP. Isso o torna fácil de instalar, mesmo em locais nos quais não se tem acesso aos diretórios do sistema ou onde não é possível compilar seu próprio código. Também facilita o desenvolvimento iterativo ao permitir ver imediatamente os resultados gerados pelo código PHP sem qualquer etapa intermediária.
TCPDF suporta uma gama de formatos de imagem úteis, incluindo formato de vetor SVG e de bitmap, tais como JPEG e PNG. Um simples utilitário independente permite processar fontes TrueType, OpenType, PostScript Tipo 1 e CID-0, de modo que possam ser incluídas em documentos criados pelo TCPDF. O TCPDF pode ser usado para gerar diversos formatos de códigos de barras 1-D e 2-D, e ele suporta todos os recursos de PDF usuais, como indicadores, links de documento, compactação, anotações, criptografia de documento e assinaturas digitais.
O TCPDF e as páginas que o usam são escritos em PHP, o que torna fácil criar e implementar páginas da Web que geram PDFs. Embora seja possível desenvolver e implementar TCPDF usando qualquer servidor da Web suportado e seu ambiente de desenvolvimento PHP favorito, eu usarei o seguinte:
- Eclipse V3.5.2 — Um dos meus ambientes de desenvolvimento de software livre favoritos, com suporte para uma ampla gama de linguagens e ambientes de programação.
- PHP Development Tools V2.2.0 — Um plug-in de PHP para Eclipse.
- MAMP Pro V1.9 — Um pacote útil para Mac OS X, que fornece Apache, MySQL e PHP em um ambiente isolado com um front-end GUI útil. Embora o Mac OS X já venha com Apache e PHP instalados, eu optei por usar este pacote porque ele fornece um conjunto estável e facilmente segregado de servidor da Web/banco de dados/PHP.
- TCPDF V5.0.006 — A atual versão estável do TCPDF.
Links para o download de todos esses podem ser encontrados na seção Recursos.
Vejamos como é possível usar o TCPDF em seus próprios Web sites, desde que o PHP esteja instalado. Iremos examinar o processo de instalação, depois iremos usar PHP para gerar uma página da Web mostrando um documento estilo fatura que poderia vir de qualquer site de e-commerce. Em seguida, iremos usar o TCPDF para criar uma versão PDF da fatura para impressão usando formatação similar.
Ao fazer o download do TCPDF do Sourceforge.net, ele vem em um arquivo ZIP autocontido. Ou seja, é possível usar sua ferramenta de extração ZIP favorita para descompactar o archive, e o resultado é um diretório do TCPDF contendo tudo necessário para começar.
Se o diretório do TCPDF for incluído ao seu diretório de documentos da Web, é possível acessar a documentação do programa carregando doc/index.html e visualizar qualquer um dos exemplos, que também podem ser encontrados no site do TCPDF na Web (consulte Recursos), carregando o arquivo examples/index.php.
Entretanto, antes de poder visualizar os exemplos, é necessário configurar a instalação do TCPDF.
Configuração — Sistemas semelhantes a UNIX
Ao instalar o TCPDF em um sistema semelhante a UNIX®, é necessário alterar os modos de arquivo para que não sejam todos sinalizados como executáveis. Isso é um efeito colateral do fato de o archive do TCPDF ter sido criado em um sistema Microsoft® Windows®. Felizmente, é fácil ajustá-los de uma vez a partir do shell (consulte a Listagem 1). Também é necessário verificar se os diretórios de cache e de imagens permitem gravações, já que o TCPDF irá armazenar arquivos temporários neles.
Em seguida, é necessário designar os arquivos ao usuário e grupo do servidor da Web; geralmente trata-se do usuário www e grupo www, mas depende do seu sistema. Se você estiver executando o TCPDF em sua área pessoal no Web site (geralmente public_html em seu diretório inicial), é possível ignorar esta etapa.
Listagem 1. Ajustando modos de arquivo e propriedade
$ cd tcpdf
$ find . -type f | xargs chmod -x
$ chmod +w cache images
$ chown -R www:www .
|
Observe que o comando pode usar um . em vez de
: para separar o usuário e grupo em alguns sistemas; se o comando reclamar, consulte a documentação para detalhes.
Usando seu editor de texto favorito, carregue o arquivo config/tcpdf_config.php. Estas são as configurações do TCPDF, que permitem controlar os valores padrão da biblioteca e informar a ela como encontrar os arquivos de suporte.
Configurações que pode ser útil mudar em tcpdf_config.php incluem:
PDF_PAGE_FORMAT— Configure comoletterse não estiver usando formatos de página métricos. O TCPDF provavelmente suporta mais tamanhos de página que a sua impressora, a menos que você tenha algo muito exótico.PDF_UNIT— Configure paraptse preferir usar pontos em vez de milímetros para o layout do seu documento PDF.PDF_CREATOR,PDF_AUTHOR— Criador e autor padrões do documento, caso seu código gerador de PDFs se esqueça de configurá-los.
É possível ajustar qualquer uma dessas configurações também no código PHP, portanto não se preocupe se não tiver certeza (por exemplo, se layouts de documento forem configurados para modo de retrato aqui, ainda será possível criar documentos em paisagem).
Com as configurações padrão, o TCPDF não deve ter problema em renderizar qualquer um dos exemplos incluídos com ele, desde que os arquivos e diretórios não tenham sido movidos de seus locais originais.
Nesse momento, é possível carregar os arquivos de exemplo para ter certeza de que há uma instalação funcional do TCPDF. Vamos usá-la para criar uma versão para impressão de uma fatura.
Depois que você criar seu Web site que é uma obra-prima do e-commerce, seus clientes irão pedir coisas, e você irá receber o dinheiro deles. Isso é ótimo, mas eles irão querer algum tipo de fatura, para o caso de o pedido dar errado ou de a empresa do cartão de crédito errar no pagamento.
Vamos criar uma página da Web razoavelmente agradável para fatura, para que eles possam ver o que pediram e o quanto lhes será cobrado.
Primeira versão — A página da Web
Usando meu ambiente de desenvolvimento PHP favorito, eu criei uma nova pasta Invoice contendo esses arquivos:
- Invoice.php — PHP para gerar uma fatura
- Invoice.css — Estilo CSS para a fatura
- Azuresol_OnyxTree-S.png — "OnyxTree S" de Azuresol, que será usado como o logotipo da sua empresa (um ícone gratuito do Web site iconfinder.com (consulte Recursos))
- gentleface_print.png — "Print" de gentleface, que será usado para acionar a geração do PDF (outro ícone gratuito de iconfinder.com)
Dentro de Invoice.php, verifique se a página foi chamada com o argumento PDF (consulte a Listagem 2). Se não foi, o usuário está procurando por uma página da Web normal, portanto a página deve ser exibida usando a função generateHTML (consulte a Listagem 3). Vamos examinar a função generatePDF mais tarde, mas podemos partir do princípio de que ela será usada para gerar um PDF dos dados da fatura.
Listagem 2. Código de controle da geração da página
if( array_key_exists( 'PDF', $_REQUEST ) ) {
generatePDF( $invoiceData );
} else {
generateHTML( $invoiceData );
}
|
A array $invoiceData contém todos os seus dados de fatura; ela é criada diretamente em Invoice.php, mas pode-se imaginar os dados vindos de um banco de dados, serviço da Web ou uma espécie de sistema de carrinho on-line.
Listagem 3. Gerando o HTML
function generateHTML( $data ) {
?>
... havia código HTML aqui ...
<?php
foreach( $data['items'] as $item ) {
echo '<tr class="invoiceRow">' . "\n";
echo ' <td class="itemCol">' . $item[0] . "</td>\n";
echo ' <td class="quantityCol">' . $item[1] . "</td>\n";
echo ' <td class="priceCol">' . $item[2] . "</td>\n";
echo ' <td class="costCol">' . $item[3]. "</td>\n";
echo "</tr>\n";
}
?>
... HTML code was here ...
<?php
echo '<td class="totalCol">' . $data['total'] . "</td>\n";
?>
... HTML code was here ...
<?php
echo 'Invoice prepared for ' . $data['user'] . ' on ' . $data['date'] . "\n";
?>
... HTML code was here ...
<?php
}
|
Eu eliminei o código de marcação HTML por motivos de espaço; é possível vê-lo no Invoice.php no archive CreatingPDFs-Invoice.zip, que pode ser encontrado na seção Downloads.
Usando as informações de fatura passadas para a função como $data, crie uma tabela contendo uma linha por item, com a quantidade, preço unitário e preço total. No final da tabela, inclua uma linha contendo o custo total do pedido. O rodapé da página contém o ID do usuário e a data/horário em que a fatura foi preparada.
Coisa fácil, sem dúvida, e o desafio maior ao implementar isso em seu site será interagir com as fontes de dados e ajustar o estilo CSS.
Figura 1. A fatura da página da Web em toda a sua glória
Minha empresa South Seas Pacifica, totalmente fictícia, fornece café e chá finos, e aparentemente eu tenho um sério vício na variedade Sumatraa. Ao menos os preços são bons!
O ícone de impressora na parte inferior é convidativo, e se esperaria poder clicar nele e obter uma impressão da fatura. É aqui que entra o TCPDF. Em vez de imprimir a página da Web, você dará aos seus valiosos clientes uma elegante versão em PDF que eles podem imprimir quando quiserem.
Agora que a fatura da página da Web está com uma boa aparência, é necessário criar uma versão em PDF que possa ser impressa.
Como vimos na Listagem 2, ao carregar a página Invoice.php com o argumento PDF (http://.../Invoice.php?PDF), a função generatePDF é chamada com os mesmos dados (veja a Listagem 4).
Listagem 4. Gerando a fatura em PDF
function generatePDF( $data ) {
# Create a new PDF document.
$pdf = new InvoicePdf( $data, 'P', 'pt', 'LETTER' );
# Generate the invoice.
$pdf->CreateInvoice();
# Output the PDF document.
$pdf->Output( 'Your_Invoice.pdf', 'D' );
}
|
A função generatePDF cria um objeto InvoicePdf, chama o método CreateInvoice e em seguida envia o documento PDF como um download chamado Your_Invoice.pdf para o navegador do usuário. Isso parece extremamente fácil, mas esconde o fato de que eu tive que criar a classe InvoicePdf eu mesmo, duplicando o estilo original de Invoice. Vejamos como.
A classe InvoicePdf estende a classe TCPDF do TCPDF, que é o principal mecanismo gerador de PDF. No construtor (veja a Listagem 5), inicialize a classe-pai usando o $orientation (orientação da página), $unit (unidade de medida) e
$format (tamanho da página) que foram passados.
Os últimos três argumentos do construtor TCPDF indicam que a entrada é Unicode (o padrão, verdadeiro), a codificação de caractere de nosso PDF gerado será UTF-8 e armazenamento em cache de disco não deve ser usado (falso). O armazenamento em cache de disco reduz a área de cobertura na memória ao criar o PDF, mas é mais lento. Como nosso documento não é grande ou complexo, não há a necessidade de fazer essa concessão.
Após inicializar a classe-pai, armazene uma referência aos dados da fatura para mais tarde. Em seguida, configure as margens direita e esquerda para 72 pontos e a margem superior para 36 pontos usando o método SetMargins. O argumento final de SetMargins indica que as margens padrão estão sendo substituídas por nossos próprios valores. Usando o método SetAutoPageBreaks, indique ao TCPDF para criar uma nova página quando estiver a 36 pontos do fundo da página.
Listagem 5. O construtor da classe
InvoicePdf
function __construct( $data, $orientation, $unit, $format ) {
parent::__construct( $orientation, $unit, $format, true, 'UTF-8', false );
$this->invoiceData = $data;
# Set the page margins: 72pt on each side, 36pt on top/bottom.
$this->SetMargins( 72, 36, 72, true );
$this->SetAutoPageBreak( true, 36 );
# Set document meta-information
$this->SetCreator( PDF_CREATOR );
$this->SetAuthor( 'Chris Herborth (chrish@pobox.com)' );
$this->SetTitle( 'Invoice for ' . $this->invoiceData['user'] );
$this->SetSubject( "A simple invoice example for 'Creating PDFs on
the fly with TCPDF' on IBM's developerWorks" );
$this->SetKeywords( 'PHP, sample, invoice, PDF, TCPDF' );
//set image scale factor
$this->setImageScale(PDF_IMAGE_SCALE_RATIO);
//set some language-dependent strings
global $l;
$this->setLanguageArray($l);
}
|
Após configurar as margens, configure as meta informações do documento PDF. Elas serão exibidas na janela das propriedades de documento dentro do seu visualizador PDF favorito. São apenas cadeias, portanto podem ser configuradas da maneira que fizer sentido para seu aplicativo.
Usando o método setImageScale, use a proporção de escala de imagem padrão configurada no arquivo de configuração do TCPDF. Isso é usado para ajustar tamanhos de imagens de bitmap de seu tamanho de pixel para algo adequado para a página.
Finalmente, use setLanguageArray para configurar algumas cadeias dependentes do idioma para o arquivo PDF; elas são definidas no arquivo de configuração específico do idioma, carregado pela configuração principal do TCPDF.
Na Listagem 6, é sobrescrito o método Header, que é chamado para gerar o conteúdo do cabeçalho de cada página. Primeiro, defina algumas variáveis. Começando com um tamanho bigFont de 14 pontos, deve-se descobrir o tamanho relativo da imagem do logotipo e do texto normal em relação ao tamanho bigFont. Em seguida, nos aprofundamos nas chamadas do TCPDF.
O método ImagePngAlpha insere a imagem do logotipo colocando seu canto superior esquerdo 72 pontos para dentro e 36 pontos para baixo, o que corresponde às configurações de margem anteriores. Como se trata de uma imagem quadrada, é possível especificar a mesma largura e altura (o $imageScale calculado). Deve-se indicar que se trata de uma imagem PNG, porque esta chamada pode inserir imagens PNG e JPEG (se a biblioteca GD estiver instalada na configuração do PHP, a chamada também pode carregar qualquer imagem suportada pelo GD). Em seguida, especifique um valor nulo, porque você não está adicionando um destino de link PDF (criado com o método AddLink) para essa imagem.
Em seguida, use T para indicar que o próximo objeto PDF deve ser desenhado no canto superior direito da área da imagem. Por fim, diga ao TCPDF para não redimensionar a imagem; que ela tinha originalmente 72 dpi (uma resolução de tela comum); e que ela deve ser alinhada à esquerda na página.
Obviamente, o método ImagePngAlpha permite um enorme controle sobre como as imagens são incluídas em uma página em um documento PDF (veja a Listagem 6).
Listagem 6. Geração de cabeçalho de página
public function Header() {
global $webcolor;
# The image is this much larger than the company name text.
$bigFont = 14;
$imageScale = ( 128.0 / 26.0 ) * $bigFont;
$smallFont = ( 16.0 / 26.0 ) * $bigFont;
$this->ImagePngAlpha('Azuresol_OnyxTree-S.png', 72, 36, $imageScale,
$imageScale, 'PNG', null, 'T', false, 72, 'L' );
$this->SetFont('times', 'b', $bigFont );
$this->Cell( 0, 0, 'South Seas Pacifica', 0, 1 );
$this->SetFont('times', 'i', $smallFont );
$this->Cell( $imageScale );
$this->Cell( 0, 0, '', 0, 1 );
$this->Cell( $imageScale );
$this->Cell( 0, 0, '31337 Docks Avenue,', 0, 1 );
$this->Cell( $imageScale );
$this->Cell( 0, 0, 'Toronto, Ontario', 0, 1 );
$this->SetY( 1.5 * 72, true );
$this->SetLineStyle( array( 'width' => 2, 'color' =>
array( $webcolor['black'] ) ) );
$this->Line( 72, 36 + $imageScale, $this->getPageWidth() - 72, 36
+ $imageScale );
}
|
Depois que a imagem do logotipo tiver sido colocada no cabeçalho, configure a fonte (Times negrito, com o seu tamanho bigFont) e, em seguida, crie algumas células para guardar o nome e endereço da empresa. Essas células contêm texto, e funcionam um pouco como células de tabela em HTML. O método Cell
aceita estes argumentos (e vários outros, na verdade); consulte a documentação do TCPDF para uma lista completa):
Width— Largura da célula; se configurado como 0, a célula se estende até a margem direita (ou margem esquerda ao usar uma língua escrita da direita para a esquerda).Height— Altura da célula; se configurado como 0, a altura expande para que o conteúdo caiba na célula.Text— O texto a ser desenhado dentro da célula, usando as atuais configurações de fonte e cor.Border— Indica se uma borda deve ser desenhada em torno da célula. Nesse caso, você não quer nenhuma borda, por isso usa 0. Também é possível passar 1 para desenhar uma borda completa em torno da célula, ou uma cadeia para indicar tamanhos específicos de bordas.Position— Indica onde criar a próxima célula; 1 indica que ela deve aparecer no começo da próxima linha, mas é possível usar 0 para incluir a nova célula ao lado desta, ou 2 para permanecer na posição X atual e mover-se para a próxima linha.
Por fim, nosso método Header desenha uma linha preta de dois pontos ao longo da área de conteúdo, na parte inferior do cabeçalho. A Figura 2 mostra como isso fica na página, conforme renderizado pelo aplicativo Preview do Mac OS X.
Figura 2. O cabeçalho de impressão, igual ao cabeçalho da página da web
Depois de criar uma cópia razoável do cabeçalho original, é necessário também sobrescrever o método Footer para gerar o rodapé.
Isso é bem mais simples, e contém apenas o ID do usuário e dados da fatura, separados do restante da página por outra linha preta de dois pontos.
A única parte desse método que ainda não vimos é a chamada ao método SetY com um valor negativo. Ao fazer isso, o Y atual é configurado em relação à parte inferior da página. Aqui um espaço generoso está sendo deixado para o rodapé da página, para assegurar que não estamos desenhando próximos demais da margem inferior (ver a Listagem 7).
Listagem 7. Geração do rodapé de página
public function Footer() {
global $webcolor;
$this->SetLineStyle( array( 'width' => 2, 'color' =>
array( $webcolor['black'] ) ) );
$this->Line( 72, $this->getPageHeight() - 1.5 * 72 - 2,
$this->getPageWidth() - 72, $this->getPageHeight() - 1.5 * 72 - 2 );
$this->SetFont( 'times', '', 8 );
$this->SetY( -1.5 * 72, true );
$this->Cell( 72, 0, 'Invoice prepared for ' .
$this->invoiceData['user'] . ' on ' . $this->invoiceData['date'] );
}
|
Ao criar a página, ela se assemelha à versão da fatura na Web, sem o ícone de impressão. Ele está sendo deixado de fora porque se trata da versão para impressão (é redundante). A Figura 3 tem os resultados.
Figura 3. O rodapé impresso
Nesse momento, temos uma página em branco com um bom cabeçalho e rodapé. É necessário incluir o conteúdo da fatura para que isso se torne útil.
Após usar o método AddPage para iniciar uma página nova (a única página, nesse caso), configure a fonte para Helvética 11 pontos e mova o local de inserção para 144 pontos a partir da parte superior da página. Isso nos dá um pequeno espaço abaixo do cabeçalho, antes de a tabela começar.
Em seguida, calcule a indentação necessária para centrar a tabela, baseado na largura de página, duas margens de 72 pontos, uma coluna ampla e três colunas regulares.
Depois disso, crie uma série de células para renderizar os cabeçalhos de coluna usando os valores calculados previamente, e desenhando bordas completas para cada célula. Também alinhe os cabeçalhos à direita, de modo que fiquem alinhados com os valores. Ao fim das células de cabeçalho, chame o método Ln para ir para o início da próxima linha.
Faça o mesmo tipo de layout para cada linha de conteúdo através de um loop foreach que itera os itens da fatura (veja a Listagem 8).
Listagem 8. Geração de conteúdo de página
public function CreateInvoice() {
$this->AddPage();
$this->SetFont( 'helvetica', '', 11 );
$this->SetY( 144, true );
# Table parameters
#
# Column size, wide (description) column, table indent, row height.
$col = 72;
$wideCol = 3 * $col;
$indent = ( $this->getPageWidth() - 2 * 72 - $wideCol - 3 * $col ) / 2;
$line = 18;
# Table header
$this->SetFont( '', 'b' );
$this->Cell( $indent );
$this->Cell( $wideCol, $line, 'Item', 1, 0, 'L' );
$this->Cell( $col, $line, 'Quantity', 1, 0, 'R' );
$this->Cell( $col, $line, 'Price', 1, 0, 'R' );
$this->Cell( $col, $line, 'Cost', 1, 0, 'R' );
$this->Ln();
# Table content rows
$this->SetFont( '', '' );
foreach( $this->invoiceData['items'] as $item ) {
$this->Cell( $indent );
$this->Cell( $wideCol, $line, $item[0], 1, 0, 'L' );
$this->Cell( $col, $line, $item[1], 1, 0, 'R' );
$this->Cell( $col, $line, $item[2], 1, 0, 'R' );
$this->Cell( $col, $line, $item[3], 1, 0, 'R' );
$this->Ln();
}
# Table Total row
$this->SetFont( '', 'b' );
$this->Cell( $indent );
$this->Cell( $wideCol + $col * 2, $line, 'Total:', 1, 0, 'R' );
$this->SetFont( '', '' );
$this->Cell( $col, $line, $this->invoiceData['total'], 1, 0, 'R' );
}
|
A última parte do código renderiza a linha total. Isso mostra como é possível alterar estilos de fonte facilmente entre células (chamando o método SetFont para ativar ou desativar o negrito).
A largura da primeira célula é configurada para ocupar as três primeiras colunas da tabela, já que o total da fatura deve aparecer ao final da última coluna.
Uma vez concluída, a tabela de itens da fatura tem boa aparência (veja a Figura 4).
Figura 4. Os itens na fatura
Ao organizar células de texto logicamente, você recriou a fatura da Web em um formato adequado para a impressão. O TCPDF permite adicionar suporte para a criação de PDFs a páginas da Web em PHP, sem necessitar de mudanças na página em si ou nos dados subjacentes.
Neste artigo, apresentamos o TCPDF, uma popular biblioteca PHP para gerar documentos PDF. Ele faz isso sem exigir bibliotecas adicionais, o que o torna fácil de instalar como parte de um Web site existente em PHP. Apresentamos uma visão geral da instalação e configuração do TCPDF em sistemas semelhantes a UNIX. Em seguida, criamos uma simples fatura baseada na Web, semelhante ao tipo de coisa que poderia ser vista em um site de e-commerce especializado em bebidas quentes exóticas.
Com uma página da Web que se parecia com uma fatura profissional, estendemos a classe TCPDF para produzir uma versão em PDF da fatura, que o cliente poderia então transferir por download ou imprimir, como quisesse. Sobrescrever os métodos Header e Footer permite configurar a página de maneira familiar. Em seguida, escrevemos um método adicional para organizar os itens da fatura em uma tabela.
| Descrição | Nome | Tamanho | Método de download |
|---|---|---|---|
| Article source code | os-tcpdf-CreatingPDFs-Invoice.zip | 21KB | HTTP |
Informações sobre métodos de download
Aprender
-
Visite TCPDF.org.
-
"Gerar Arquivos PDF a partir de Aplicativos Java Dinamicamente" apresenta o iText e oferece um guia etapa por etapa do seu uso para gerar documentos PDF de aplicativos de tecnologia Java.
-
Eu usei Iconfinder para encontrar os ícones de uso gratuito usados como logotipo da empresa e para o ícone de impressão. O Iconfinder facilita a navegação por vários ícones de alta qualidade e a filtragem baseada em tamanho ou na disponibilidade para uso comercial.
-
"Getting started with the
Eclipse Platform" oferece um histórico e visão geral do Eclipse, incluindo detalhes sobre como instalar o Eclipse e plug-ins.
-
Para ouvir entrevistas e discussões interessantes para desenvolvedores de software, consulte os podcasts developerWorks.
-
Fique atualizado com os Eventos técnicos e webcasts do developerWorks.
-
Siga o developerWorks no Twitter.
-
Veja as próximas conferências, feiras comerciais, webcasts e outros Eventos em todo o mundo que são de interesse para desenvolvedores de software livre IBM.
-
Visite a Zona de software livre do developerWorks para informações práticas, ferramentas e atualizações de projetos para lhe ajudar a desenvolver com tecnologias de software livre e usá-la com os produtos IBM, e também nossos artigos e tutoriais mais populares.
-
A comunidade My developerWorks é um exemplo de uma bem sucedida comunidade geral que cobre uma ampla variedade de tópicos.
-
Acompanhe e aprenda sobre a IBM e tecnologias de software livre e funções de produto com os demos developerWorks On demand gratuitos.
Obter produtos e tecnologias
-
Faça o download do projeto TCPDF do Sourceforge.net.
-
O IDE Eclipse foi usado para criar o código usado neste artigo.
-
Obtenha as Ferramentas de Desenvolvimento PHP para Eclipse.
-
Obtenha MAMP Pro (pacote Apache, MySQL e PHP para Mac OS X).
-
A documentação do Lotus Connections lista documentação de produto e outros recursos para versões suportadas do Lotus Connections.
-
Inove em seu próximo projeto de desenvolvimento de software livre com software de teste IBM, disponível para download ou em DVD.
- Faça o download de
versões de avaliação de produtos IBM ou explore os testes on-line no IBM SOA Sandbox e obtenha ferramentas de desenvolvimento de aplicativos e produtos de middleware DB2®, Lotus®, Rational®, Tivoli® e WebSphere®.
Discutir
-
Participe dos blogs do developerWorks e entre na comunidade do developerWorks.

Chris Herborth é um escritor técnico senior vencedor de prêmios, com mais de 10 anos de experiência na escrita de materiais sobre sistemas operacionais e programação. Quando ele não está brincando com seu filho Alex ou junto de sua esposa Lynette, ele passa seu tempo projetando, escrevendo e pesquisando (é isso mesmo, jogando) videogames.