silverlight仿“百度文库”的文档控件
2023-03-14 23:00:51 时间
通用的FlashPaper支持Word/Excel/PDF,到时对于Silverlight的XPS的文档支持问题比较多,本控件提供了一个可视化的XPS文档展示,提供放大缩小/打印/搜索/分页等功能,主要整合了开源的Document Toolkit。
1. 使用Document Toolkit,DocumentDataSource提供数据源,PageNvaigator提供分页 :
- <doc:DocumentDataSource x:Name="dataSource"/>
- <doc:DocumentViewer Grid.Row="1" x:Name="viewer" DocumentDataSource="{Binding ElementName=dataSource}" ViewMode="{Binding SelectedViewMode, ElementName=viewModePicker}" BorderBrush="#9fa9a4" BorderThickness="1"/>
- <doc:PageNavigator x:Name="navigator" HorizontalAlignment="Center"
- PageCount="{Binding PageCount, ElementName=viewer}"
- PageIndex="{Binding PageIndex, ElementName=viewer, Mode=TwoWay}"
- />
- <doc:ViewModePicker Grid.Column="1" x:Name="viewModePicker" Visibility="Collapsed"/>
2. WebPackageReader读取本地xps或远程xps文件作为数据源
DotNetZipPackageReader 根据分页延迟加载文档
- // loads the sample XPS document from the web
- var url = string.Format("/DocumentService.ashx?id={0}", HtmlPage.Document.GetElementById("documentId").GetProperty("value"));
- webClient.OpenReadAsync(new Uri(HtmlPage.Document.DocumentUri, url));
- var reader = new WebPackageReader(new Uri(HtmlPage.Document.DocumentUri, url + "&part="));
- this.dataSource.PackageReader = reader;
- var xpsClient = new XpsClient();
- xpsClient.LoadXpsDocumentAsync(reader);
3. 服务端根据请求的文件ID和当前页码返回指定的文件流
- private void Response(HttpContext context, string xpsFileName, string partName)
- {
- using (FileStream stream = File.OpenRead(xpsFileName))
- {
- ZipFile file = new ZipFile(stream);
- ZipEntry entry = file.GetEntry(partName);
- if (entry != null)
- {
- using (Stream entryStream = file.GetInputStream(entry))
- {
- // TODO: set mime-type as defined in XPS package
- context.Response.ContentType = "application/octet-stream";
- byte[] buffer = new byte[2 << 14]; // write blocks of 32768 bytes
- int read;
- while ((read = entryStream.Read(buffer, 0, buffer.Length)) > 0)
- {
- context.Response.OutputStream.Write(buffer, 0, read);
- }
- }
- }
- else
- {
- // return 404 Not Found
- context.Response.StatusCode = (int)HttpStatusCode.NotFound;
- }
- }
- }
4. 源代码下载
5. 在线预览
http://rapidsl2.guozili.25u.com/ (admin/admin 点左边菜单 控件展示 - 文档查看器)
6. 截图
原文链接:http://www.cnblogs.com/guozili/archive/2012/07/16/2593437.html
【编辑推荐】
相关文章
- Java 从零实现属于你的 Redis 分布式锁
- 深入浅出协程、线程和并发问题
- Redis都要老了,你还在用什么古董客户端?
- 前5个基于Redis的Java对象
- Java程序员这项技能没掌握,还是别去面试了
- 频繁插入(insert)的业务,用什么存储引擎更合适? | 数据库系列
- Java大牛分享关于Redis缓存的几道典型面试题
- Java架构之Redis系列:通过文章点赞排名案例学习Sortedset命令
- 基于内存和 Redis 的两级 Java 缓存框架
- Java 框架之Redis 分布式缓存
- Java开发人员使用哪些大数据工具?
- 聊聊Java数据库开发的那点事儿
- 是否值得付费?Oracle,Open JDK等四大JVM性能全面对比
- 主流Java数据库连接池分析(C3P0,DBCP,TomcatPool,BoneCP,Druid)
- Java面试中常问的数据库方面问题
- Java高级编程——慢SQL问题经验总结
- Java面试要点-数据存储-精简答案
- 使用Java语言从零开始创建区块链
- 基于OS信号实现Java异步通知
- 在Android Native层中创建Java虚拟机实例