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 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
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
dicas handler imagem thumbnail

Redimensionar imagens com alta qualidade em ASP.NET

O c??digo que irei mostrar nem precisarei de muita explica????o. Voc?? encontra a rodo a?? pela internet… Contudo, esse tem um pequeno diferencial: misturei o c??digo “pescado” da net com o incremento de Glenn Jones. O redimensionamento consiste em colocar no SRC da imagem o Generic Handler que faz todo o processo e gera a imagem. Ou seja, crie um arquivo ImageResize.ashx e coloque o seguinte c??digo abaixo:

using System;
using System.Drawing;
using System.IO;
using System.Web;


public class ImagemHandler : IHttpHandler {
    
    public void ProcessRequest (HttpContext context) {
        
        // Recupera os par??metros passados pela p??gina
        string strSrcImagemOriginal = “../upload/” + context.Request[“img”].ToString();
        string strAlturaImagemRedimensionar = “”;
        string strLarguraImagemRedimensionar = context.Request[“w”].ToString();        
        
        // Cria temporariamnte a imagem
        System.Drawing.Image imagemTemp = System.Drawing.Image.FromFile(context.Server.MapPath(strSrcImagemOriginal));
        
        // Vari??veis contendo o tamanho
        int srcWidth = imagemTemp.Width;
        int srcHeight = imagemTemp.Height;
        int thumbHeight;
        int thumbWidth;
        
        // Redimensiona a largura de forma proporcional
        if (context.Request[“w”] != null)
        {
            thumbWidth = int.Parse(strLarguraImagemRedimensionar);
            thumbHeight = (int)(thumbWidth * imagemTemp.Height) / imagemTemp.Width;
        }
        else
        {
            thumbWidth = imagemTemp.Width;
            thumbHeight = imagemTemp.Height;
        }
        
        // Redimensiona a altura
        if (context.Request[“h”] != null)
        {
            strAlturaImagemRedimensionar = context.Request[“h”].ToString();
            thumbHeight = int.Parse(strAlturaImagemRedimensionar);
            // Faz o rateio para o redimensionamento proporcional
            // Assim a altura e a largura nunca ir??o ultrapassar o tamanho limite
            double widthRatio = (double)imagemTemp.Width / (double)thumbWidth;
            double heightRatio = (double)imagemTemp.Height / (double)thumbHeight;
            double ratio = Math.Max(widthRatio, heightRatio);
            thumbWidth = (int)(imagemTemp.Width / ratio);
            thumbHeight = (int)(imagemTemp.Height / ratio);
        }
        imagemTemp.Dispose();
        
        // Envia para a mem??ria o objeto a ser trabalhado bem como o novo objeto
        Stream objStream = new StreamReader(context.Server.MapPath(strSrcImagemOriginal)).BaseStream;
        BinaryReader objBinaryReader = new BinaryReader(objStream);
        int i = (int)objStream.Length;
        byte[] arrBytes = objBinaryReader.ReadBytes(i);
        System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(arrBytes);
        System.Drawing.Image image = System.Drawing.Image.FromStream(memoryStream);
        System.Drawing.Image thumbnail = new Bitmap(thumbWidth, thumbHeight);
        System.Drawing.Graphics graphic = System.Drawing.Graphics.FromImage(thumbnail);
        
        // Melhoria da nova imagem
        graphic.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        graphic.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        graphic.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
        graphic.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        
        // Desenha a nova imagem
        graphic.DrawImage(image, 0, 0, thumbWidth, thumbHeight);


        // Aplica a codifica????o necess??ria
        System.Drawing.Imaging.ImageCodecInfo[] info = System.Drawing.Imaging.ImageCodecInfo.GetImageEncoders();
        System.Drawing.Imaging.EncoderParameters encoderParameters;
        encoderParameters = new System.Drawing.Imaging.EncoderParameters(1);
        encoderParameters.Param[0] = new System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L);
        
        // Exibe a imagem em forma de JPG
        context.Response.ContentType = “image/jpeg”;
        thumbnail.Save(context.Response.OutputStream, info[1], encoderParameters);


    }


}

Mais dado do que isso ?? s?? de m??o beijada!

Categorias
dll imagem resources

Inserindo Imagem em DLL

A alguns dias atr??s, comecei a desenvolver um Framework para que eu pudesse incorporar em minhas aplica????es e que pudesse reaproveit??-la constantemente. Nela cont??m classes de conex??o, cria????o de objetos dinamicamente e imagens. Estava quase pronto quando me deparei com a parte das imagens. Eu queria que as imagens ficassem na DLL e quando eu fosse atualizar uma aplica????o, eu s?? substituiria a DLL e n??o esquecesse dos arquivos.

??bvio que comecei a ler alguns materiais na Internet para saber qual o melhor m??todo para desenvolver. Por mais que eu lia, mais eu achava complicado. E outros, quanto eu mais fazia mais eu achava que estava errado. At?? que ent??o consegui…

Voc?? pode utilizar de duas formas: chamando dentro da pr??pria DLL ou atrav??s de uma p??gina ASPX para, ao final, gerar uma imagem. Irei explicar como pois ?? praticamente a mesma coisa…

No Visual Studio, abra seu projeto (ele deve ser um Class Library). Clique com o direito sobre a Solu????o na aba do Solution Explorer e escolha a op????o Properties. Ir?? abrir o conjunto de propriedades vigentes da DLL. Entre na aba Resources e notar?? a seguinte tela:


Nesse caso ele diz que n??o, por padr??o, nenhum recurso. Clique sobre o link para adicionarmos um. Agora, v?? em Add Resource, New Image e escolha um dos tipos de imagem suportado ou escolha Add Existing File… para selecionar uma imagem existente no disco.

Se escolhido a primeira op????o ter?? que dar um nome que o identifique para que possamos invoc??-lo posteriormente e ter?? que desenhar ou incorporar uma imagem no editor que ir?? abrir. Caso contr??rio, a segunda op????o ?? a mais r??pida pois iremos apenas selecionar uma imagem que ela j?? ser?? incoporada.
Logo ap??s incorpor??-la nos recursos, ver??, atrav??s do Solution Explorer, que foi criada uma pasta chamada Resources contendo a imagem desejada. Agora iremos permitir tamb??m que a imagem seja “chamada” ou, melhor dizendo, seja embedded. Para isso, clique com o direito sobre a imagem e entre em Properties. No Build Action, escolha a propriedade Embedded Resource.
Agora, v?? na pasta Properties da solu????o e abra o arquivo AssemblyInfo.cs. Adicione o namespace:
using System.Web.UI;
E adicione a seguinte linha no final (pode ser depois de todas que tiverem):
[assembly: WebResource(“Framework.Resources.Calendario.png”, “image/png”)]

Sendo que ?? constitu??do por:

  • Framework: ?? o namespace que comp??e sua solu????o, no meu caso estava utilizando o namespace Framework;
  • Resources: indica o nome da pasta onde est?? o recurso;
  • Imagem

Assim a imagem j?? est?? incorporada ?? DLL e prontra para uso. Para invocarmos, conforme descrito anteriormente, pode ser de duas formas: de dentro da DLL e fora dela.

Por dentro, podemos gerar um objeto Image e adicionar seu atributo ImageUrl diretamente:

Image imagem = new Image();

imagem.ImageUrl = ClientScript.GetWebResourceUrl(this.GetType(), “Framework.Resources.Calendario.png”);

Pode-se utilizar a mesma forma de invoca????o quando for chamar de fora da DLL pelo CodeBehind. Se for chamar direto na p??gina ASPX basta utilizar as tags <%= %>colocando dentro o m??todo de invoca????o do recurso.

Voc?? pode utilizar essa forma de acoplamento de recursos para alguns outros tipos de objetos como JavaScript, por exemplo. Lembrando que n??o ?? bom ter uma DLL muito grande com diversos objetos. Caso for de extrema import??ncia mant??-lo na DLL, fragmente-os em diversas outras DLLs.