Baixe o binário e adicione em seu aplicativo (pasta Bin). Utilize o código abaixo para fazer o processo de conversão e exibição do PDF na tela:
using System;
using System.Web;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html.simpleparser;
// Captura ou atribui o HTML a ser convertido - no caso estou baixando de uma URL
string html = new System.Net.WebClient().DownloadString("http://thiagomarcal.blogspot.com/");
//string html = "Convertendo o HTML em PDF - Thiago Marçal";
// Cria o documento aplicando o tamanho e margens
Document documento = new Document(PageSize.A4, 80, 50, 30, 65);
// Memory Stream para ser usado na conversão e emissão
MemoryStream ms = new MemoryStream();
// Inicializa o gravador
PdfWriter writer = PdfWriter.GetInstance(documento, ms);
// Lê o HTML e atribui
StringReader conteudo = new StringReader(html);
// Objeto de conversão do HTML
HTMLWorker objeto = new HTMLWorker(documento);
// Abre o documento
documento.Open();
// Aplica o parser para análise de conversão
// Geralmente aqui ocasiona muitos erros - irei explicar no post
objeto.Parse(conteudo);
// Fecha o documento
documento.Close();
// Força o download do PDF gerado - se desejável você pode salvar em disco também
Response.Clear();
Response.AddHeader("content-disposition", "attachment; filename=Documento_HTML.pdf");
Response.ContentType = "application/pdf";
Response.Buffer = true;
Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
Response.OutputStream.Flush();
Response.End();
Veja que a variável html eu atribuo o HTML que desejo converter. O seu conteúdo pode vir externamente ou posso atribuir um valor desejado.
Vamos aos problemas! Muitos vão encontrar erro quando o objeto estiver fazendo o parser do HTML e muitos irão falhar. Acontece que, devido à complexidade do HTML que estiver trabalhando, o componente não consegue converter para o formato adequado ao que ele usa internamente. Por exemplo, o TABLE do HTML que usamos é "meio" diferente do TABLE que o componente usa. Esse é um dos exemplos... Então prepara-se para fazer um tratamento adequado antes de fazer o parser. Eu sugiro o seguinte:
- Use expressão regular para validar seu HTML;
- Use expressão regular e/ou o HtmlAgilityPack para remover os JavaScripts;
- O conteúdo a ser convertido deve ser apenas o que está dentro do body;
- Imagens, CSS e links devem conter o caminho completo (exemplo: http://thiagomarcal.blogspot.com/imgs/logo.png ao invés de ../imgs/logo.png), etc.
Ou seja, quanto mais simplificado for seu HTML mais rápido e fácil será convertido em PDF. Uma observação bem clara é: nem sempre ficará 100% que o esperado.
Uma dica que pode ser usada (e um armengue, claro!) é fazer o seguinte:
- Gere um thumb (imagem) do HTML que deseja converter (saiba como gerar um thumb de um HTML nesse post) e salve em disco;
- Atribua a variável html com o conteúdo "<img src="http://thiagomarcal.blogspot.com/imgs/thumb.png" />";
- Coloque o width e height na tag IMG o tamanho desejado (pode ser até o tamanho do papel).
Pronto! O parser irá identificar apenas uma imagem no HTML e gerará o PDF com ela. Mole-mole...
6 comentários:
Bom dia Tiago,
Preciso de uma ajuda sua, na minha tela tenho varios documentos que marco no checkbox 3 clico em gerar pdf e ao gerar faço um loop sendo que o primeiro roda normalmente no segundo gera erro:
"Servidor não pode limpar cabeçalhos após os cabeçalhos HTTP terem sido enviados." sabe como posso resolver isto preciso armazenar em um array de byte para depois fazer o flush.
No caso, se você deseja que ele realize o download de mais de um documento, seria mais viável que você gere um ZIP/RAR com os documentos e envie para download ao invés de um por um.
Mas se realmente precisar você precisará dar pelo menos um refresh na tela para que possa fazer o novo download. Isso é uma idéia, mas prefiro fazer o ZIP com todos eles.
Thiago tem como me passar um exemplo do mesmo.
Este método esta eleminiando as quebras de linha. Mesmo que eu insira varias quebras de linha no meu html, o pdf sai sem nenhuma (o texto vem todo "colado"). Existe um modo de resolver isso?
vlw mano ajudou muito
Opa.. Bom dia.. Então, o post ajudou muito, mas tem um problema, quando converto minha pagina para pdf, o estilo(css) vem escrito no documento, e o documento vem todo sem formatação. Pode dar alguma dica?
Postar um comentário