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