2010-08-23 3 views
0

J'essaie de produire un rapport en utilisant C#. La première partie du rapport obtient une image visuelle d'un lot (en utilisant Mapguide) et le place dans un fichier PDF Cette partie fonctionne très bien.Générer une image à partir de l'URL. Ne fonctionne pas avec la page aspx?

La partie suivante nécessite la conversion d'une page Web dynamique en une image à insérer dans le PDF. Le problème est que je n'ai aucun contrôle sur la façon dont la page Web est créé, il semble être produit dans le cadre d'un webservice ou une page ASPX (http://nautilus/maint_responsibility/rpt_summary.aspx?lease_code=TL01306)

L'application se bloque tout en essayant de produire une image de l'URL ci-dessus :(Ce est la classe im en utilisant

using System.Drawing; 
using System.Drawing.Imaging; 
using System.IO; 
using System.Threading; 
using System.Windows.Forms; 

public class WebsiteToImage 
{ 
    private Bitmap m_Bitmap; 
    private string m_Url; 
    private string m_FileName = string.Empty; 

    public WebsiteToImage(string url) 
    { 
     // Without file 
     m_Url = url; 
    } 

    public WebsiteToImage(string url, string fileName) 
    { 
     // With file 
     m_Url = url; 
     m_FileName = fileName; 
    } 

    public Bitmap Generate() 
    { 
     // Thread 
     var m_thread = new Thread(_Generate); 
     m_thread.SetApartmentState(ApartmentState.STA); 
     m_thread.Start(); 
     m_thread.Join(); 
     return m_Bitmap; 
    } 

    private void _Generate() 
    { 
     var browser = new WebBrowser { ScrollBarsEnabled = false }; 
     browser.Navigate(m_Url); 
     browser.DocumentCompleted += WebBrowser_DocumentCompleted; 

     while (browser.ReadyState != WebBrowserReadyState.Complete) 
     { 
      Application.DoEvents(); 
     } 

     browser.Dispose(); 
    } 

    private void WebBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     // Capture 
     var browser = (WebBrowser)sender; 
     browser.ClientSize = new Size(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); 
     browser.ScrollBarsEnabled = false; 
     m_Bitmap = new Bitmap(browser.Document.Body.ScrollRectangle.Width, browser.Document.Body.ScrollRectangle.Bottom); 
     browser.BringToFront(); 
     browser.DrawToBitmap(m_Bitmap, browser.Bounds); 

     // Save as file? 
     if (m_FileName.Length > 0) 
     { 
      // Save 
      m_Bitmap.SaveJPG100(m_FileName); 
     } 
    } 
} 

public static class BitmapExtensions 
{ 
    public static void SaveJPG100(this Bitmap bmp, string filename) 
    { 
     var encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
     bmp.Save(filename, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static void SaveJPG100(this Bitmap bmp, Stream stream) 
    { 
     var encoderParameters = new EncoderParameters(1); 
     encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, 100L); 
     bmp.Save(stream, GetEncoder(ImageFormat.Jpeg), encoderParameters); 
    } 

    public static ImageCodecInfo GetEncoder(ImageFormat format) 
    { 
     var codecs = ImageCodecInfo.GetImageDecoders(); 

     foreach (var codec in codecs) 
     { 
      if (codec.FormatID == format.Guid) 
      { 
       return codec; 
      } 
     } 

     // Return 
     return null; 
    } 
} 

Ceci est la partie qui génère l'image.

WebsiteToImage w = new WebsiteToImage("http://nautilus/maint_responsibility/rpt_summary.aspx?lease_code=TL01306"); 

MemoryStream myMemoryStream = new MemoryStream(); 
w.Generate().Save(myMemoryStream, System.Drawing.Imaging.ImageFormat.Jpeg); 

Si son changé en http://www.google.com.au ou une autre application dans hou ça marche ... vraiment mal à comprendre

+0

Sur quelle ligne est-elle accrochée? Que se passe-t-il si vous essayez simplement de charger la page dans un contrôle WebBrowser? Est-ce que ça traîne là aussi? – Jason

+0

L'URL que vous avez fournie (http://www.nautilus.com/maint_responsibility/rpt_summary.aspx?lease_code=TL01306) donne une erreur 404 Not Found. Est-ce une raison possible? – Chandam

+0

-Jason Lors du chargement directement dans un contrôle WebBrowser, l'URL se bloque. -Chandam Désolé, l'URL est un site intranet. Plus d'infos: Il semble que le site nécessite l'authentification de Windows? Je ne vois pas d'option pour attribuer une authentification à partir d'une session existante? – Jamo

Répondre

0

Ok, pas la meilleure façon de faire les choses que j'espérais permettre à chaque utilisateur de générer ces rapports en cas de besoin, mais cela fonctionne ...

J'ai utilisé IECapt (http://www.iecapt.sourceforge.net) pour générer les images localement puis les ai copiées sur le serveur et les ai affectées au pdf dans le code ci-dessus.

Ce n'est pas le meilleur résultat, mais il a fait le travail pour l'instant.

Le problème initial concerne toujours les autorisations basées sur Windows sur le site et mon manque de connaissances sur la façon d'attribuer ces autorisations au contrôle webbrowser.

Cheers

Questions connexes