terça-feira, 3 de maio de 2011

iTextSharp (parte 1) - PDF: Criação de documento e adição de texto em C#

[update]
Gostaria de salientar que este post e o seguinte contêm apenas explicações. Nada de código. Se, por algum motivo, houver preferência por ver apenas um código de exemplo do uso do iTextSharp, sugiro ir direto para o terceiro post, mas acho que a leitura das explicações pode ajudar bastante.
[/update]

Nos próximos dias, a ideia é falar sobre criação de documentos em pdf.

Pra quem ainda não viu, um tempo atrás eu fiz um post sobre geração de arquivos do Excel.

A ideia aqui segue a mesma linha:
Eu precisava gerar um documento. A reação inicial foi: "Vou gerar um documento do Word, a biblioteca deve ser bem parecida com a do Excel". Mas então recebi a sugestão de trabalhar com '.pdf', já que pode ser aberto em um visualizador que é distribuído gratuitamente, ao contrário do '.doc' que usa o Word. Gostei da sugestão e fui pesquisar sobre bibliotecas para geração de pdf que eu pudesse integrar ao meu projeto em C#. Acabei encontrando o iTextSharp.

iTextSharp é uma biblioteca (ou um componente, se preferirem ver dessa forma) que permite fazer diversas operações com documentos pdf. Das várias possibilidades que encontrei na internet ele é com certeza um dos mais completos na área, embora ainda faltem alguns recursos que, em determinados momentos, poderiam ter sido extremamente úteis para mim. Mas nenhum grande transtorno.

Bom, a intenção, então, é falar sobre esse "cara", ou ao menos começar a falar.

Vejamos o que pretendo abordar nos próximos dias:

- Criação do documento em si, principais parâmetros.
- Principais observações sobre como adicionar, ao documento:
  - Parágrafos, utilizando a classe Paragraph.
  - Frases, utilizando a classe Phrase.
  - Imagens (superficialmente).
- Abordagem rápida sobre como adicionar tabelas, mas com foco em demostrar os problemas que tive, e como os resolvi.


Eu mudei um pouco a ideia de como produzir os posts. Tenho preferido fazer uma explicação e depois deixar o código todo agrupado, ao invés de ter um parágrafo de explicação e um trecho de código, como nos primeiros posts. Embora isso deixe a explicação com uma aparência um pouco densa, acredito que o código agrupado é melhor. Em todo caso vou tentar separar a explicação em pequenos títulos dessa vez.
No último post eu colocarei apenas um código de exemplo. Embora me pareça ruim a ideia de o código estar separado do post acho que fica melhor organizado dessa forma.

Sobre o iTextSharp.
Ele é gratuito e você pode baixá-lo aqui, ou pela página abaixo:
http://sourceforge.net/projects/itextsharp/


Sobre o documento.

Criação do documento
Para a criação do documento em pdf será necessário fazer uso da classe Document em conjunto com o método GetInstance, da classe PdfWriter.
A classe Document pode ser instanciada sem parâmetros, com um Rectangle que representa o tamanho da página, ou com um Rectangle e as medidas das bordas (quatro objetos float).
No código irei mostrar o instanciamento com o tamanho da página e as bordas.

Feito isso será necessário iniciar uma sequência try/catch.
Dentro do try é feita a chamada ao PdfWriter.GetInstance, com 2 parâmetros: uma classe Document e uma FileStream. A classe Document é, obviamente, a que instanciamos antes do try e a FileStream pode ser instanciada ali mesmo, passando um nome para o arquivo e um FileMode.Create, como parâmetros.

Pode parecer meio sem sentido ficar escrevendo assim, mas com o código ficará claro. Ao menos é o que eu espero.



Adicionando Paragraph
Para efeitos de organização, como o meu texto será fixo, eu definirei as strings dos parágrafos antes de começar a criar o documento. Escreverei quatro parágrafos. As string deles serão chamadas paragrafo1texto, paragrafo2texto, paragrafo3texto e paragrafo4texto. Eventualmente, irei subdividir o texto de um parágrafo em texto1, texto2 e assim por diante.

Primeiramente, instanciarei cada parágrafo e ajustarei determinadas configurações em cada um.
Ao instanciar o parágrafo com a instrução new, usarei o construtor sem parâmetros. Ele possui vários construtores, mas não vou entrar em detalhes sobre cada um deles até mesmo porque eu não testei todos ainda.

Feito isso, a próxima etapa é acertar as propriedades do parágrafo conforme minhas necessidades.
No caso vou mudar a propriedade Leading e Alignment.

A propriedade Leading é do tipo float e define a altura das linhas no parágrafo (ou como alguns preferem dizer, o espaçamento entre duas linhas). Digo que ela define a altura da linha porque se ela for definida com um valor inferior ao tamanho da letra, o texto ficará cortado. Se essa propriedade não for alterada ela será definida, se não me engano, como 1,5 vezes o tamanho da fonte do texto. Esse seria o valor default dela.

A propriedade Alignment define o alinhamento do texto. A classe Element que servirá para modificar a propriedade Alignment possui diversos valores, pois tem outras utilidades. Aqui usarei apenas o necessário para fazer o alinhamento do texto.

Sem mais considerações sobre o Paragraph. O resto será visto no código.

Adicionando Phrase
Trabalhar com a classe Phrase é semelhante a trabalhar com a classe Paragraph.
A diferença, no meu caso, é que a maioria dos objetos Phrase que eu uso são instanciados diretamente no local de uso. Como assim? Bom. No código depois ficará mais claro, mas o fato é que eu geralmente instancio eles no próprio método em que eles são passados por parâmetro, nesse caso o método Add (ou semelhante), seja de um parágrafo, uma tabela ou do próprio documento.
Assim como o Paragraph essa classe possui vários construtores. Eu usarei o construtor com os seguintes parâmetros:
- Uma string que corresponderá ao texto da frase.
- Um objeto da classe Font do iTextSharp. Estou chamando atenção ao fato de essa classe ser do iTextSharp por que ela é diferente daquela classe Font do .NET. Na verdade, essa classe Font do iTextSharp está limitada a 5 tipos de fontes. Para instanciá-la eu passei por parâmetro um enumerator FontFamily, um float correspondente ao tamanho que eu desejo para a fonte do texto, um int correspondente ao estilo (embora na verdade o que se use são constantes internas da classe) e uma instância da classe BaseColor do iTextSharp, que será a cor da fonte.
Nos estilos temos opções como Font.BOLD, Font.NORMAL, Font.UNDERLINE e assim por diante.
Para usar combinações deles usa-se o operador | entre eles.

Há construtores em que o primeiro parâmetro é um float leading, que define a altura da linha da frase. Ele pode ser útil às vezes, mas não vou falar sobre isso agora.


Continua...

Nenhum comentário: