TCPDF é uma popular biblioteca PHP de software livre que permite criar
documentos PDF. Sua flexibilidade e versatilidade permitem criar até
mesmo documentos coloridos complexos, com quaisquer fontes e gráficos
necessários. TCPDF é escrito totalmente em PHP, e realiza toda essa
mágica de PDF sem precisar de qualquer biblioteca externa. Este artigo
apresenta o TCPDF, e em seguida acompanha a reprodução de uma simples
fatura em HTML em um arquivo PDF transferível por download.
Introdução
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 esse 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.
Os links para o download de todos esses podem ser encontrados ao final do artigo, 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.
Instalando o TCPDF
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 no 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, 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
ao 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 essa 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.
Configuração para todos
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 útils mudar em tcpdf_config.php incluem:
- PDF_PAGE_FORMAT – Configure como letter
se 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 para pt se 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.
Criando 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 estes 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 - 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 ao final deste artigo.
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.
Segunda versão O PDF
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 essa 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 esses 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.
Resumo
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.
Recursos
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.
-
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. - 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.
artigo publicado originalmente no developerWorks Brasil, por Chris Herborth
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.