quarta-feira, 28 de agosto de 2013

HTML - PDF ITextSharp & XmlWorker - C#

Olá a todos,

Hoje eu vou tentar explicar como converter um arquivo HTML para um PDF.

Primeiramente,precisamos criar um projeto webform (O código que será explicado nesse post também pode ser reutilizado para um projeto MVC,tranquilamente).


Vamos lá então.

Abra seu Visual Studio (nesse exemplo estou utilizando a versão 2012).

Com o Visual Studio aberto:

File > New > Project

Selecione o seguinte tipo de Projeto: Asp.net Empty Web Application



Nomeie como  HtmlToPDF


Apos a criação do projeto,precisamos instalar dois projetos via nuget
Para isso no visual studio selecione:

Tools > Library Package Manager > Package Manager Console

E execute os seguintes comandos
Install-Package iTextSharp 
Install-Package itextsharp.xmlworker 

Após o sucesso da instalação.

Crie uma classe chamada PDFHelper
eis a classe PDFHelper por completa.
------------------------------------------------------------------------

using System;
using System.IO;
using System.Text.RegularExpressions;
using System.Web;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using iTextSharp.tool.xml.html;
using iTextSharp.tool.xml.parser;
using iTextSharp.tool.xml.pipeline.css;
using iTextSharp.tool.xml.pipeline.end;
using iTextSharp.tool.xml.pipeline.html;

namespace HtmlToPDF
{
    public class PDFHelper
    {
        ///
        /// Exportar um HTML fornecido.
        ///
        /// O HTML.
        /// Nome do Arquivo.
        /// Link para o CSS.
        public static void Export(string html, string fileName, string linkCss)
        {
            ////reset response
            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.ContentType = "application/pdf";

            ////define pdf filename
            HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + fileName);


            //Gera o arquivo PDF
            using (var document = new Document(PageSize.A4, 40, 40, 40, 40))
            {


                html = FormatImageLinks(html);

                //define o  output do  HTML
                var memStream = new MemoryStream();
                TextReader xmlString = new StringReader(html);

                PdfWriter writer = PdfWriter.GetInstance(document, memStream);

                document.Open();

                //Registra todas as fontes no computador cliente.
                FontFactory.RegisterDirectories();

                // Set factories
                var htmlContext = new HtmlPipelineContext(null);
                htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

                // Set css
                ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false);
                cssResolver.AddCssFile(HttpContext.Current.Server.MapPath(linkCss), true);

                // Exporta
                IPipeline pipeline = new CssResolverPipeline(cssResolver,
                                                             new HtmlPipeline(htmlContext,
                                                                              new PdfWriterPipeline(document, writer)));
                var worker = new XMLWorker(pipeline, true);
                var xmlParse = new XMLParser(true, worker);
                xmlParse.Parse(xmlString);
                xmlParse.Flush();

                document.Close();
                document.Dispose();

                HttpContext.Current.Response.BinaryWrite(memStream.ToArray());
            }

            HttpContext.Current.Response.End();
            HttpContext.Current.Response.Flush();
        }

        ///
        /// Convertemos o link relativo para um link absoluto
        ///
        /// input.
        ///
        public static string FormatImageLinks(string input)
        {
            if (input == null)
                return string.Empty;
            string tempInput = input;
            const string pattern = @"";
            HttpContext context = HttpContext.Current;

            //Modificamos a URL relativa para abosuluta,caso exista alguma imagem em nossa pagina HTML.
            foreach (Match m in Regex.Matches(input, pattern, RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.RightToLeft))
            {
                if (!m.Success) continue;
                string tempM = m.Value;
                const string pattern1 = "src=[\'|\"](.+?)[\'|\"]";
                var reImg = new Regex(pattern1, RegexOptions.IgnoreCase | RegexOptions.Multiline);
                Match mImg = reImg.Match(m.Value);

                if (!mImg.Success) continue;
                string src = mImg.Value.ToLower().Replace("src=", "").Replace("\"", "").Replace("\'", "");

                if (src.StartsWith("http://") || src.StartsWith("https://")) continue;
                //Inserimos a nova URL na tag img
                src = "src=\"" + context.Request.Url.Scheme + "://" +
                      context.Request.Url.Authority + src + "\"";
                try
                {
                    tempM = tempM.Remove(mImg.Index, mImg.Length);
                    tempM = tempM.Insert(mImg.Index, src);

                    // inserimos a nova url img para todo o código html
                    tempInput = tempInput.Remove(m.Index, m.Length);
                    tempInput = tempInput.Insert(m.Index, tempM);
                }
                catch (Exception)
                {

                }
            }
            return tempInput;
        }
    }

}

------------------------------------------------------------------------

Agora para utilizar sua classe basta chama-la da seguinte forma:

HTML: Seu código HTML(.aspx) ou uma string que contenha o HTML.

PDFHelper.Export(HTML, "NomeQueVoceEscolheuParaOArquivo", "~/Style/style.css");


Pronto!

terça-feira, 1 de novembro de 2011

Entendendo um Boleto Bancário

Bom dia,Boa Tarde,Boa Noite,

Hoje com esse post,vamos tentar entender esse complexo mundo a parte dos Boletos.
Neste artigo vou tentar explicar como funciona um boleto bancário e como você pode ter esse recurso cada vez mais presente em sites dinâmicos.

Quanto você terminar de ler este artigo, você terá esclarecido (eu suponho) a maioria de suas duvidas sobre o assunto (pra quem não entendia nada de Boleto, é um grande avanço!!).

Partes que compõe um boleto bancário, e seu significado.
Observe a figura abaixo, para facilitar a localização de cada campo

1-Código do Banco
É composto pelo código do banco mais o dígito verificador.

2-Linha digitável
É a representação numérica do código de barras.
A linha digitável é baseada no valor do código de barras, mas não é o mesmo numero.
Ela serve para o pagamento do boleto via Internet e também é utilizada quando o código de barras está danificado.

3-Vencimento
Data de vencimento do boleto.

4-Agência código cedente
Este campo varia conforme o banco, mas em geral é composto pelo número da carteira, agência, conta e dígito. Dependendo do banco, pode ser: agência+conta ou mesmo carteira+agência+conta. Cada banco tem um padrão.

5-Nosso Número
Este campo também varia conforme o banco, mas você deve dar uma atenção especial a ele, porque quando o boleto é pago, em geral é esse o número que aparece no seu extrato, assim você tem como identificar o boleto pago.
Portanto esse número deve ser diferente para cada boleto emitido, e não podendo haver duplicidades.
Alguns bancos fornecem uma faixa de números que o cliente pode trabalhar, outros já deixam a critério do cliente.

6- Valor do Documento
Este campo contém o valor do documento, com duas casas decimais e vírgula como separador decimal.

7-Código de Barras

(Essa parte é interessante)
São códigos de barras, que através de sua espessura representam "0" ou "1" em binário.
No total o código de barras é composto por 44 dígitos numéricos, que representam o valor, data de vencimento, entre outras informações do boleto. A composição e disposição desses números variam de banco para banco, podendo conter o número da agencia, conta corrente, código do cliente, etc.

8-Carteira
Contem o código da carteira, que está sendo utilizada.

(Essa parte é interessante, já cheguei a confundir e acabei colocando meus dados na parte do sacado, hehe nada eSperto(por 1 seg,você achou que estava errado,né!?) da minha parte.)

9-Sacado
Sacado é quem paga o boleto.
Este campo contém os dados da pessoa que irá pagar o boleto: nome, endereço, etc..

10- Data do Documento
Data em que o boleto foi gerado ou emitido, no caso de segunda via por Internet.

11- Cedente
Cedente é quem emitiu o boleto.
Este campo contém o nome de quem emitiu o boleto, que em geral é o titular da conta.
Pode ser pessoa física ou jurídica, mas isso depende do banco.


Isso ae Fellows,até a Próxima.


segunda-feira, 31 de outubro de 2011

Mas que diabos eles estão falando?

Mas que diabos eles estão falando??

Todas as áreas possuem seus jargões, hoje vou falar de alguns da área que eu trabalho informática.

Alguns “verbos” que já ouvi (ou até uso, hehe):

startar / stopar / restartar /rebootar /Attachar

inputar - note que existe o verbo "imputar" que tem um significado completamente diferente
sortear - note que o verbo "sortear" correto em português é "to draw", não "to sort".

Algumas frases que você provavelmente ira ouvir em um ambiente com programadores:

Debuga ae pra gente ver!
Quem Commitou isso aqui?
O cara fez copy paste no fonte!

Processo tá attachado!?

Alguns que uso bastante (mas do que deveria,hehe)

Parsear,
setar ,
gettar,

E fora algumas perolas heheh

Aceita o accept..


Isso ae Fellows,até a próxima.

Instant SQL Formatter

Bom dia,Boa tarde,Boa noite

Falaa Pessoal,segue um link que ando utilizando muito atualmente,se você já se deparou com algumas queries monstruosas e nada legiveis e encontraram aquela dificuldade de interpretação e tiveram que identá-las dá 1º linha a ultima entendem a importância da identação na vida, e as vezes isso é mais incomodo do que o casual depedendo do tamanho do monstro que você está interagindo...hehe


Para esse problema segue o link abaixo:
http://www.dpriver.com/pp/sqlformat.htm

Como usar?

Selecione o Tipo de banco, o output que o código será gerado.



Cole o Script e clique no botão Format SQL,


no TextBox abaixo você terá o resultado formatado,caso seu Script não contenha nenhum erro de sintaxe.



é isso ae fellows até a proxima!!

domingo, 30 de outubro de 2011

Verificando a versão do Java Instalado

Bom dia,Boa Tarde,Boa Noite,


Para verificar a versão do Java em execução em sua maquina em ambiente Windows,vá ao prompt de comando ou : Win(botão windows mesmo)  + R e escreva cmd,que se resume a mesma coisa. 

Digite o seguinte comando:
           java -version

O output será a versão instalada em seu ambiente.

 Pronto,você agora sabe qual versão do Java está em execução no seu ambiente,caso não tenha instalado será apresentado a janela abaixo:





Instalando JDK (pacote de desenvolvimento, que hoje é chamado de JSE)

Bom dia, Boa tarde, Boa Noite,

Segue abaixo um tutorial simples, de como instalar o JDK.
Você deve instalar o JDK (pacote de desenvolvimento, que hoje é chamado de JSE) antes de instalar o Eclipse.
Baixe a versão correspondente ao seu sistema operacional e a sua plataforma, caso seja Windows 64bits, por exemplo: Download do Java SE Development Kit 7 Downloads Após efetuado o download execute: A janela abaixo será apresentada:
O processo daqui em diante é simples o famoso NNNF. (Next,Next,Next,Finish).
Apos definir o diretório de instalação, espere o termino da barra de progresso e pronto.