views:

39

answers:

1

I'm trying to produce a report using c#. First part of the report gets a visual image of a lot (using Mapguide) and places it in a PDF This part works fine.

Next part requires converting a dynamic web page to an image to be inserted into the PDF. The problem is I have no control over how the webpage is created it seems to be produced as part of a webservice or an ASPX page (http://nautilus/maint_responsibility/rpt_summary.aspx?lease_code=TL01306)

The application hangs while trying to produce an image from the above url :( This is the class im using

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;
    }
}

This is the part that generates the 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);

If its changed to http://www.google.com.au or another application in house it works .... realy struggling to figure this out

A: 

Ok not the best way of getting things done as I was hoping to allow each user to be able to generate these reports when needed but it works ...

I used IECapt (http://www.iecapt.sourceforge.net) to generate the images locally then coppied them to the server and assigned them to the pdf in code above.

This is not the best outcome but it got the job done for now.

The initial problem is still to do with windows based permissions on the site and my lack of knowledge on how to assign these permissions to the webbrowser control.

Cheers

Jamo