Somente pelo IIS é possível converter uma pasta em aplicação? Mais ou menos. Na versão 7 do IIS já dispõe de módulos que simplificam o processo de criação de site, diretório virtual, pools de aplicação e as aplicações em si. Nesse artigo mostrarei bem rápido como converter uma pasta em uma aplicação.
Crie sua aplicação e adicione, como referência, o binário Microsoft.Web.Administration.dll que fica na pasta C:\Windows\System32\inetsrv . Agora adicione o seguinte código:
using Microsoft.Web.Administration;
private void CriaEntradaIIS(string diretorio)
{
try
{
// Cria a pasta do site
if (!Directory.Exists(diretorio))
Directory.CreateDirectory(diretorio);
// Servidor de Aplicação
ServerManager sm = new ServerManager();
// Captura o site raiz onde irá adicionar a aplicação
Site st = sm.Sites["Default Web Site"];
// Cria a aplicação no diretório criado apontando o caminho, ex: aplicacao
Application app = st.Applications.Add("/aplicacao", diretorio);
app.ApplicationPoolName = "ASP.NET v4.0";
sm.CommitChanges();
// Libera
sm.Dispose();
}
catch (Exception erro)
{
return;
}
}
Se tentar executar dará erro... Antes dê permissão total ao grupo Serviço de Rede (Network Service) à pasta C:\Windows\System32\inetsrv\config . Agora sim irá criar. Para mais exemplos veja nesse post aqui.
Convertendo uma pasta em aplicação no IIS via código (C#)
Postado por
Thiago Marçal
on segunda-feira, 28 de novembro de 2011
/
Marcadores:
application,
diretório virtual,
dll,
iis,
site,
windows
/
Comments: (3)
Converter PDF em Imagem em C# com GhostScript
Postado por
Thiago Marçal
on terça-feira, 22 de novembro de 2011
/
Marcadores:
componentes,
dll,
ghostscript,
imagem,
pdf,
upload,
winform
/
Comments: (1)
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.
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.
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!
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:
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();
}
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();
}
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!
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 Wikipedia, Crop (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.
Usando o ScripManager em sequência
Esse artigo será apenas uma dica para os desatentos. Quando você usa o ScriptManager para exibir um alerta, por exemplo, e em outro trecho do código fazer a mesma coisa, verá que apenas o primeiro alerta é demonstrado e o segundo não. O porquê disso é se estiver reaproveitando o mesmo script e não diferenciar o bloco de execução dele, sempre será exibido apenas o primeiro. Logo, o certo, é ter algo do tipo:
// Exibe o primeiro alerta
ScriptManager.RegisterStartupScript(Page, typeof(Page), "script1", "alert('Alerta 1');", true);
...
// Exibe o segundo alerta
ScriptManager.RegisterStartupScript(Page, typeof(Page), "script2", "alert('Alerta 2');", true);
Reparou no bloco script1 e script2? É isso.
// Exibe o primeiro alerta
ScriptManager.RegisterStartupScript(Page, typeof(Page), "script1", "alert('Alerta 1');", true);
...
// Exibe o segundo alerta
ScriptManager.RegisterStartupScript(Page, typeof(Page), "script2", "alert('Alerta 2');", true);
Reparou no bloco script1 e script2? É isso.