domingo, 29 de abril de 2012

ASP.NET - PRINT SCREEN DE UMA PÁGINA ASP.NET


Recentemente, deparei-me com a necessidade de retirar print screen de uma página em ASP.NET em um dado momento via código sem a interação do usuário.

Quem trabalha com o ASP.NET deve saber que todas as páginas visualizadas em um browser na verdade estão sendo executadas dentro do servidor.  Então retirar um print screen via código é uma tarefa mais complicada porque a execução do código irá em busca de uma página que está em execução no servidor ASP.NET onde a página se encontra e não realmente no browser ativo no momento.


Minha saída para este problema:  


Um aplicativo em separado estaria em execução na máquina cliente onde o browser está em execução.
Esse aplicativo se encarregaria de fazer um print screen da tela ativa salvando na página c:\temp, Em seguida, obteria esta imagem do diretório c:\temp e a salvaria em um arquivo pdf na própria pasta c:\temp. 
Quando houvesse a necessidade de realizar um print screen esse pequeno aplicativo seria acionado - executarservico seria setado em 1, fazendo o print screen da tela e gerando a imagem requisitada e salvando-a em arquivo pdf. Este pequeno aplicativo teria um timer que de 15 em 15 segundos verificaria
se o ExecutarServico na tabela está setado em 1 ou não. No momento em que o Executarservico estiver setado em 1 a imagem seria gerada e o arquivo pdf criado.

Utilizei o ASP.NET com o VB.Net para gerar o código.

Os imports associados a isso estão listados abaixo:

Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Windows.Forms

Para gerar o print screen via código:

'Ler se ExecutarServico está setado em 1

 myCommand = New OleDbCommand("select ExecutarServico,linha from Parametros", myConnection)
ds = myCommand.ExecuteReader()

While ds.Read()

            sValor = ds.Item("ExecutarServico")
            sLinha = ds.Item("Linha")
         

End While

 'Se o valor padrão foi 1, dispara a cópia da imagem
 If sValor = "1" Then

            'Grava o nome do arquivo com a linha associada ao mesmo
            Dim sNomeArquivo = sLinha + "_" + DateTime.Now.ToString("yyMMddhhmmss") + ".jpg"
            arquivoWS.WriteLine("Captura de Tela iniciada... " & DateTime.Now)
            arquivoWS.Flush()

            Try


                Dim image As New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb)
                Dim g As Graphics = Graphics.FromImage(image)
                g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy)
                image.Save("c:\temp\" + sNomeArquivo, ImageFormat.Jpeg)


            Catch ex As Exception
                arquivoWS.WriteLine("Erro na Captura de Tela efetuada... " & DateTime.Now)
                arquivoWS.Flush()
            End Try
End If

Caso um erro ocorra na geração da imagem, o mesmo será gerado no arquivo de log criado.
      
A geração do arquivo pdf com a imagem criada é mostrado abaixo:


 'Recuperar o nome do arquivo de imagem na base de dados
        sSQL = "select ExecutarServico,nomearquivo,diretorio from Parametros where linha = '" & sLinhaSelecionada & "' and ROTA =  '" & sRotaSelecionada & "' and computador = '" & shostname & "'"
        myCommand = New OleDbCommand(sSQL, myConnection)
        ds = myCommand.ExecuteReader()

        'Recuperar nome e caminho do arquivo na base de dadps
        While ds.Read()

            sLimpaArquivoJPG = ds.Item("nomearquivo")
            sDiretorioArquivo = ds.Item("diretorio")

        End While

        ds.Close()


'Gerar arquivo PDF com a imagem criada
        ''Gravar a imagem dentro do arquivo PDF
        ''baseado em : http://www.dotnetspark.com/kb/1364-add-image-to-pdf-document-using-itextsharp.aspx
        Dim imageFilePath As String = sDiretorioArquivo + sLimpaArquivoJPG
        Dim test As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(imageFilePath)


        'Resize image depend upon your need
        'logo.ScaleToFit(280.0F, 260.0F)
        test.ScaleToFit(600.0F, 600.0F)

        'Give space before image
        test.SpacingBefore = 30.0F

        'Give some space after the image
        test.SpacingAfter = 1.0F
        test.Alignment = Element.ALIGN_CENTER

        Dim hoje As DateTime = DateTime.Now
        Dim arquivoPDF = sLinhaSelecionada & "_" & sRotaSelecionada & "_" & DateTime.Now.ToString("yyMMddhhmmss") & ".pdf"


        'Grava o arquivo PDF no modo retrato
        Dim doc As New Document(iTextSharp.text.PageSize.A4_LANDSCAPE, 2, 2, 42, 42)
        PdfWriter.GetInstance(doc, New FileStream(sDiretorioArquivo + "\" & arquivoPDF, FileMode.Create))
        doc.Open()
        doc.Add(test)
        doc.Close()


Desse modo, teremos um arquivo pdf com a imagem da tela desejada em seu interior.


Sucesso a todos!

Nenhum comentário:

UM APLICATIVO PARA LEITURA DEVOCIONAL ANUAL DA BIBLIA EM ANDROID

Olá, pessoal!  Este novo projeto foi criado em Visual Studio 2019 em C#.Net com o Xamarin. Já está disponível no Google Play para vocês baix...