Categorias
componentes dll ghostscript imagem pdf upload winform

Converter PDF em Imagem em C# com GhostScript

Esse ?? um artigo bem old, mas que muita gente me enviou e-mails pedindo como fazer isso. Ent??o criei um artigo bem resumido baseado no de Lord TaGoH. Primeiramente, voc?? precisa ter a DLL do GhostScript em seu projeto: ou voc?? instala ou pega de algu??m que j?? tenha instalado. O arquivo que me refiro ?? o gsdll32.dll. Obs: a convers??o s?? funciona para as vers??es mais recentes ent??o pegue alguma a partir da vers??o 9 como garantia.

Lembra do meu ??ltimo post de scaneamento? Adicionei um bot??o de anexar um PDF e converter em imagem, ent??o irei aproveitar a mesma aplica????o adicionando essa funcionalidade. Copie a DLL para seu projeto e, em Propriedades, deixe configurado o atributo Copiar sempre para quando for compil??-la caso seja um Windows Form. Se for um Web Form, adicione em algum local onde a classe conversora possa encontr??-la.

Na p??gina do CodeProject disp??e de uma classe (bin??ria) j?? pronta para uso uso da DLL chamada de PdfToImage. Ent??o voc?? podem baixar de l?? ou aqui. Baixado a DLL, voc?? pode adicionar como refer??ncia ao seu projeto/p??gina. Agora ?? s?? c??digo…

using PdfToImage;

// Objeto de convers??o
PDFConvert converter = new PDFConvert();

// Arquivo PDF selecionado de um OpenFileDialog
string arquivo = FileUploadSelect.FileName;

// Local de sa??da do arquivo convertido
string output = _directoryForImages + “LJ_” + _loja + “_Scan_” + DateTime.Now.ToString(“yyyy_MM_dd_HH_mm_ss”) + “.jpg”;

// Configura????es de convers??o
converter.OutputToMultipleFile = false;
converter.TextAlphaBit = 4;
converter.FirstPageToConvert = 1;
converter.LastPageToConvert = 1;
converter.FitPage = false;
converter.JPEGQuality = 10;
converter.OutputFormat = “png16m”;

// Faz a convers??o e retorna true se estiver tudo OK
bool resultado = converter.Convert(arquivo, output);

Pronto! Mais f??cil do que isso imposs??vel. Fique atento ??s configura????es de convers??o, sen??o n??o funciona.

Categorias
componentes dll scanner windows winform

Scanear um documento com C#

Um dos melhores componentes de scaneamento que j?? utilizei ?? o da VintaSoft. Ele n??o ?? free, mas pode ser utilizado normalmente. O ??nico empecilho ?? que, para cada scan que fizer, ele ir?? solicitar que clique em Evaluate. Quem comprar, vale a pena pois ?? muito bom e seu suporte sempre est?? a disposi????o. Chega de elogios e vamos ao que interessa.

O componente permite tanto utilizar em Windows Form quando Web Form e no site h?? todos os exemplos necess??rios. Baixe o componente e instale. Para nosso exemplo, trabalharemos com um Windows Form. Fiz uma pequena aplica????o de scanear nota fiscal.

V?? na pasta de instala????o do componente, copie o arquivo Vintasoft.Twain.dll para sua aplica????o e adicione como refer??ncia. No Code-Behind do formul??rio a ser trabalhado, adicione o seguinte c??digo para inicializar o componente:

using Vintasoft.Twain;


// Carrega o gerenciador de dispositivo
DeviceManager _deviceManager = new DeviceManager();
Device _device;


// Avalia se ?? um dispositivo ??til
if (!_deviceManager.IsTwainAvailable)
{
           MessageBox.Show(“N??o ?? um dispositivo TWAIN!”, “Erro”, MessageBoxButtons.OK, MessageBoxIcon.Error);
           return;
}


try
{
           // Abre o gerenciador de dispositivo
           _deviceManager.Open();
           // Seta o dispositivo corrente
           _device = _deviceManager.Devices.Current;
           lblDipositivo.Text = _deviceManager.Devices.Current.Info.ProductName;
}
catch (TwainDeviceManagerException ex)
{
           MessageBox.Show(ex.Message, “Gerenciador de Dispositivos”);
           return;
}

Agora, ao clicar no bot??o Scannear, adicionamos o seguinte m??todo:

private void btnScanear_Click(object sender, EventArgs e)
        {
            try
            {
                // Seta as configura????es
                _device.TransferMode = TransferMode.File;
                try
                {
                    _device.ShowUI = false;
                    _device.ShowIndicators = false;
                    _device.DisableAfterAcquire = true;
                }
                catch { }


                // Abre o dispositivo
                _device.Open();


                // Propriedades do scaneamento
                try
                {
                    _device.UnitOfMeasure = UnitOfMeasure.Inches;
                    _device.Resolution = new Resolution(float.Parse(resolucaoX.SelectedItem.ToString()), float.Parse(resolucaoY.SelectedItem.ToString()));
                }
                catch { }


                // Informa????o sobre o arquivo
                _arquivo = “LJ_” + _loja + “_Scan_” + DateTime.Now.ToString(“yyyy_MM_dd_HH_mm_ss”) + “.jpg”;
                _device.FileName = _directoryForImages + _arquivo;
                //_device.FileFormat = TwainImageFileFormat.Jpeg;


                // Captura a imagem
                AcquireModalState acquireModalState = AcquireModalState.None;
                do
                {
                    acquireModalState = _device.AcquireModal();
                    switch (acquireModalState)
                    {
                        case AcquireModalState.ImageAcquired:


                            _device.FileName = _directoryForImages + _arquivo;
                            //_device.FileFormat = TwainImageFileFormat.Jpeg;
                            break;


                        case AcquireModalState.ScanCompleted:


                            CloseDevice();


                            break;


                        case AcquireModalState.ScanCanceled:


                            CloseDevice();


                            break;


                        case AcquireModalState.ScanFailed:


                            CloseDevice();


                            break;


                        case AcquireModalState.UserInterfaceClosed:


                            CloseDevice();


                            break;
                    }
                }
                while (acquireModalState != AcquireModalState.None);
            }
            catch (TwainException ex)
            {
                MessageBox.Show(ex.Message + ” – “ + ex.StackTrace, “Erro”, MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
        }

E outros m??todos s??o necess??rios adicionar ao form, como:

        /// Fecha o dispositivo e a ger??ncia

        private void CloseDeviceAndDeviceManager()
        {
            // Verifica de h?? dispositivo
            if (_device != null)
            {
                if (_device.State != DeviceState.Closed)
                    _device.Close();
            }


            // Fecha a ger??ncia
            if (_deviceManager.State != DeviceManagerState.Closed)
                _deviceManager.Close();
        }

        /// Fecha o dispositivo

        private void CloseDevice()
        {
            // Desabilita o servi??o
            if (_device.State == DeviceState.Enabled)
            {
                if (!_device.ShowUI)
                    _device.Disable();
            }


            // Fecha
            if (_device.State == DeviceState.Opened)
                _device.Close();
        }

        /// Ao fechar o formul??rio, libera o uso

        private void Scan_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (_device != null)
            {
                // Verifica se est?? em uso
                if (_device.State == DeviceState.Transferring ||
                    _device.State == DeviceState.TransferReady)
                {
                    // Envia a solicita????o de cancelamento
                    _device.CancelTransfer();
                    // Aguarda finalizar
                    e.Cancel = true;
                    MessageBox.Show(“O dispositivo est?? em uso! Aguarde alguns instantes enquanto ?? solicitado a libera????o do scanner.”, “Informa????o”);
                    return;
                }
            }


            // Fecha o dispositivo e a ger??ncia
            CloseDeviceAndDeviceManager();
        }

Pronto! O scaneamento ?? realizado e ?? gerado um arquivo JPG. Reparem que est?? comentado o atributo _device.FileFormat porque nem todo scanner d?? a possibilidade de configura????o. Alguns aceitam e outros n??o. Se utilizar alguma configura????o que o scanner n??o suporta, deve aparecer a mensagem: “Failed to get/get to capability”. Ent??o voc?? precisa deixar apenas as configura????es que o scanner suporte.
Bons scans!

Categorias
componentes crop handler imagem thumbnail

Recortando uma Imagem em Tempo de Execu????o (Image Crop) em C#

Lembram do post de Redimensionar Imagem? Esse post ser?? bem similar e explicarei em poucas palavras o que ele faz. O que ?? Crop? Segundo a WikipediaCrop (Recorte) refere-se ?? remo????o da parte exterior de uma imagem para melhorar o seu enquadramento. Um exemplo mais entend??vel: temos uma galeria de fotos nas quais todas as imagens possuem largura e altura diferentes que n??o s??o proporcionais; o redimensionamento de imagem para gerar um thumb n??o ir?? funcionar pois o produto final ou ficar?? distorcido ou n??o ficar??o com tamanhos iguais. ?? a?? que o recorte entra…

Veja o exemplo abaixo (retirado da Wikipedia):
  • Imagem recortada
  •  

  • Imagem original
No caso em quest??o era desejado obter um thumb quadrado da imagem. O enquadramento desejado n??o ?? proporcional ?? image original, logo ?? feito o recorte.
Dessa vez n??o irei colocar o c??digo pois ?? um pouco grandinho, mas, como disse, ?? bem similar ao c??digo do post de Redimensionar Imagem bem como seu uso (em forma de handler.ashx). Esse c??digo ?? bem velhinho e n??o ?? meu. Ele est?? a?? na net a muito tempo e j?? o vi em v??rios blogs e artigos. A ??ltima vez que o vi estava no subversion de Assembla.
Logo, baixem aqui e usem-o como desejar.
Categorias
ajax componentes dicas javascript

Utilizando mensagem de confirma????o e executando c??digo de acordo com o que foi clicado na mesma p??gina

N??o sei se o t??tulo ficou claro com o que eu queria dizer, mas vejamos a seguinte situa????o:

“Quero colocar uma mensagem de confirma????o via code-behind onde ir?? ser emitida para o usu??rio e a depender do que ele escolher ir?? ser processado um certo trecho de c??digo ou outro. Tipo o confirm do JavaScript, s?? que ?? executado pelo ASP.NET.”

No Code Project tem v??rias formas de implementa????o e umas delas me chamou a aten????o: o de Yavuz Kucukpetek. Usando AJAX ?? poss??vel transformar um Panel nessa janela flutuante usando o ModalPopupExtender. Dei uma simplificada no c??digo dele (j?? informei que n??o fiz, apenas ajustei) e voc?? podem baixar o controle modificado aqui.

Depois que baixarem o controle, adicione no seu projeto. Vamos l??! Na p??gina que deseja utilizar o controle, registre-o e coloque-o da seguinte forma:

<%@ Register Src=”~/inc_ConfirmMessage.ascx” TagName=”ConfirmacaoBox” TagPrefix=”Thiago” %>


<Thiago:ConfirmacaoBox ID=”ConfirmacaoBox” runat=”server”></Thiago:ConfirmacaoBox>

No code-behind dever?? ficar o seguinte:

    protected void Page_Load(object sender, EventArgs e)
    {
        ConfirmacaoBox.MsgBoxAnswered += Mensagem_Resposta;
    }

    public void Mensagem_Resposta(object sender, inc_ConfirmMessage.MsgBoxEventArgs e)
    {
        if (e.Answer == inc_ConfirmMessage.enmAnswer.OK)
        {
            // Se clicou em OK processa o que deseja
        }
        else
        {
            // Sen??o processa outra coisa
        }
    }

    protected void ExecutaProcesso_Click(object sender, EventArgs e)
    {
        ConfirmacaoBox.AddMessage(“Deseja continuar o c??lculo do processo na mesma p??gina?”, inc_ConfirmMessage.enmMessageType.Attention, true, true, “”);
    }

Pronto! Apenas isso… Vamos ??s explica????es. No Page_Load precisamos informar o m??todo que ir?? gerenciar as decis??es do usu??rio, por isso informamos o Mensagem_Resposta. Dentro dele ir?? conter os processos que ir??o ser executados a depender da escolha. O ExecutaProcesso_Click ?? o m??todo executado quando clicamos no bot??o que ir?? disparar a pergunta.

“Ah Thiago, mas a?? ?? s?? apenas uma confirma????o. E se eu quiser v??rias intera????es?”

Simples, basta adicionar outra Caixa de Confirma????o para a segunda etapa de decis??es chamando-a dentro do processo de decis??o da primeira e assim por diante.

Categorias
componentes dicas dll imagem pdf thumbnail

Convertendo HTML em PDF

Nesse artigo veremos como converter um HTML em PDF. O HTML pode vir de uma p??gina externa quanto ser criado em tempo de execu????o. N??o haver?? muito o que explicar pois o c??digo em si, voc?? encontra a rodo pela net. Usaremos o componente iTextSharp.

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:

  1. Use express??o regular para validar seu HTML;
  2. Use express??o regular e/ou o HtmlAgilityPack para remover os JavaScripts;
  3. O conte??do a ser convertido deve ser apenas o que est?? dentro do body;
  4. 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:
  1. Gere um thumb (imagem) do HTML que deseja converter (saiba como gerar um thumb de um HTML nesse post) e salve em disco;
  2. Atribua a vari??vel html com o conte??do <img src=”http://thiagomarcal.blogspot.com/imgs/thumb.png” />;
  3. 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…
Categorias
boleto banc??rio componentes dll

Boleto Banc??rio em ASP.NET

Para quem quer implementar boleto banc??rio em ASP.NET e n??o quer perder tempo fazendo tudo, h?? um componente que ?? m??o na roda: Boleto.Net. Segue abaixo descritivo retirado do site:

“Boleto.Net ?? um componente desenvolvido em C# e ASP.Net e contempla as seguintes funcionalidades:

Emiss??o e Impress??o de Boletos Banc??rios

Gera????o de Arquivo de Remessa (CNAB 240 e 400)

Leitura do Arquivo de Retorno (CNAB 240 e 400)

Atualmente estamos implementando mais alguns bancos e toda colabora????o ser?? importante. Nosso objetivo ?? implementar todos os bancos brasileiros.

A vers??o 2.0 est?? dispon??vel. Nessa vers??o contempla leitura e remessa de arquivos CNAB 400/240.”

Uma boa iniciativa por parte do pessoal. Todo apoio ?? importante! Na p??gina do site deles h?? toda informa????o que precisa para desenvolver: tanto o componente quanto exemplo. Os bancos homologados s??o: Banco do Brasil, Bradesco, Santander, Ita?? e BRB. J?? ajuda bastante…

Categorias
componentes dll iis

URL Rewriter – Escreva URL Amig??veis em ASP.NET

A URL Rewriter permite mascarar o endere??o original por um novo endere??o mais seguro e amig??vel. Se temos o endere??o:

http://thiagomarcal.blogspot.com/noticas.aspx?id_noticia=123

Podemos re-escrev??-la da seguinte forma:

http://thiagomarcal.blogspot.com/noticias/123

Ou de outras formas conforme o mascaramento desejado. Para fazer o mascaramento ?? preciso do componente URL Rewriter instalado no IIS. Ele ?? gratuito e ?? instalado facilmente. Para cada web-site ?? configurado um mascaramento de endere??os que automaticamente ele faz a convers??o logo que requisitado.
N??o vou entrar em detalhes do processo de instala????o e configura????o aqui pois no site oficial tem um v??deo (logo na Home), bastando seguir o passo-a-passo, que ir?? conseguir deixar conforme deseja. Tamb??m h?? dispon??vel v??rios tutoriais que auxiliam no processo bem como fun????es avan??adas. Clique aqui para visitar o site da Micrososft URL Rewriter.