XPS Silverlight Reader

功能简介:

服务器读取XPS文件生成图片供前端SILVERLIGHT展示

核心代码如下:

1.生成JPG的代码

 public static System.Drawing.Image GetXpsPageJpeg(string xpsFileName, int page)
{
            AutoResetEvent are = new AutoResetEvent(false);
            Thread thread = new Thread(new ParameterizedThreadStart(delegate(object p){
                SaveXpsPageToJpegParam c = p as SaveXpsPageToJpegParam;
                SaveXpsPageToJpeg(c);
            }));
            var param =  new SaveXpsPageToJpegParam { Event = are, Page = page, XpsFileName = xpsFileName };
            thread.SetApartmentState(ApartmentState.STA);
            thread.Start(param);
            are.WaitOne();
            return param.Image;
}

 internal static void SaveXpsPageToJpeg(SaveXpsPageToJpegParam p)
{
            try
            {
                XpsDocument xpsDoc = new XpsDocument(p.XpsFileName, System.IO.FileAccess.Read);
                FixedDocumentSequence docSeq = xpsDoc.GetFixedDocumentSequence();
                DocumentPaginator paginator = docSeq.DocumentPaginator;
                DocumentPage docPage = paginator.GetPage(p.Page - 1);
                RenderTargetBitmap renderTarget = new RenderTargetBitmap(
                    (int)docPage.Size.Width,
                    (int)docPage.Size.Height,
                    96,
                    96,
                    PixelFormats.Default);
                renderTarget.Render(docPage.Visual);
                JpegBitmapEncoder encoder = new JpegBitmapEncoder();
                encoder.Frames.Add(BitmapFrame.Create(renderTarget));
                MemoryStream memoryStream = new MemoryStream();
                encoder.Save(memoryStream);
                docPage.Dispose();
                xpsDoc.Close();
                p.Image = System.Drawing.Image.FromStream(memoryStream);
            }
            catch
            { }
            p.Event.Set();
}

internal class SaveXpsPageToJpegParam
{
            public string XpsFileName
            {
                get;
                set;
            }
            public int Page
            {
                get;
                set;
            }
            public AutoResetEvent Event
            {
                get;
                set;
            }
            public  System.Drawing.Image Image
            {
                get;
                set;
            }
}

2。HttpHandler

 public abstract class AjaxHandler : IHttpHandler
    {
        protected HttpContext context;
        protected HttpRequest request;
        protected HttpResponse response;
        protected JavaScriptSerializer serializer = new JavaScriptSerializer();

        protected virtual void ProcessMethod()
        {
            string op = request["op"];
            if (!string.IsNullOrEmpty(op))
            {
                Type t = this.GetType();
                MethodInfo[] methods = t.GetMethods();
                string message = string.Empty;
                try
                {
                    foreach (var m in methods)
                    {
                        if (m.Name.ToLower() == op.ToLower() && m.Name.ToLower() != "processmethod")
                        {
                            ParameterInfo[] pis = m.GetParameters();
                            if (pis != null && pis.Length > 0)
                            {
                                object[] ps = new object[pis.Length];
                                int count = 0;
                                foreach (var i in pis)
                                {
                                    ps[i.Position] = ConvertData(request[i.Name], i);
                                    count++;
                                }
                                if (count == pis.Length)
                                {
                                    m.Invoke(this, ps);
                                    break;
                                }
                            }
                            m.Invoke(this, null);
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    message = ex.Message;
                }
                if (!string.IsNullOrEmpty(message))
                {
                    ExceptionJson(message);
                }
               
            }
        }
        private object ConvertData(string data, ParameterInfo i)
        {
            if (i.ParameterType == typeof(System.String))
            {
                return data;
            }
            if (i.ParameterType == typeof(System.Int32))
            {
                return Convert.ToInt32(data);
            }
            if (i.ParameterType == typeof(System.Int16))
            {
                return Convert.ToInt16(data);
            }
            if (i.ParameterType == typeof(System.DateTime))
            {
                return Convert.ToDateTime(data);
            }
            if (i.ParameterType == typeof(System.Double))
            {
                return Convert.ToDouble(data);
            }
            if (i.ParameterType == typeof(System.Single))
            {
                return Convert.ToSingle(data);
            }
            if (i.ParameterType == typeof(System.Boolean))
            {
                return Convert.ToBoolean(data);
            }
            if (i.ParameterType == typeof(System.Decimal))
            {
                return Convert.ToDecimal(data);
            }
            if (i.ParameterType == typeof(System.Guid))
            {
                try
                {
                    return new Guid(data);
                }
                catch
                {
                    return Guid.Empty;
                }
            }

            return null;

        }
        protected virtual void Json(object data)
        {
            response.Write(serializer.Serialize(data));
            response.End();
        }
        protected virtual void ExceptionJson(string message)
        {
            Json(new { Success = false, Message = message });
        }
        protected virtual void SuccessJson(string message, object data)
        {
            Json(new { Success = true, Data = data, Message = message });
        }
        public void ProcessRequest(HttpContext context)
        {
            this.context = context;
            this.request = context.Request;
            this.response = context.Response;
            ProcessMethod();
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }

  public class ImageHandler : AjaxHandler
    { 
        public void GetPage(string filePath, int page)
        {
            response.ContentType = "image/jpeg";
                Image img = XPSToImage.GetXpsPageJpeg(request.MapPath(filePath), page);
                img.Save(response.OutputStream,ImageFormat.Jpeg);
                response.End();
                img.Dispose();
          }
        
    }

3.SILVERLIGHT

 String imgUrl = string.Format("../ImageHandler.ashx?op=getpage&filePath={0}&page={1}",
                filePath,pageNumber);
 Uri endpoint = new Uri(imgUrl, UriKind.Relative);
WebClient client = new WebClient();
client.OpenReadCompleted += new OpenReadCompletedEventHandler(OnOpenReadCompleted);
client.OpenReadAsync(endpoint);

void OnOpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
            if (e.Error != null)
            {
                MessageBox.Show(e.Error.ToString());
                return;
            }
            if (e.Cancelled != true)
            {
                //获取下载的流数据(在此处是图片数据)并显示在图片控件中
                try
                {
                    Stream stream = e.Result;
                    if (stream != null)
                    {
                        BitmapImage bitmap = new BitmapImage();
                        bitmap.SetSource(stream);
                        img.Source = bitmap;
                    }
                    else
                    {

        //出错了就用本地一张图片显示出错提示
                        BitmapImage bitmap = new BitmapImage();
                        bitmap.SetSource(Application.GetResourceStream(new Uri("/XPSViewer;component/images/04.jpg", UriKind.Relative)).Stream);
                        img.Source = bitmap;
                    }
                  
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }
}

 

posted @ 2010-09-30 09:26  mayamoon  阅读(1117)  评论(0)    收藏  举报