zoukankan      html  css  js  c++  java
  • 分享基于silverlight的仿“百度文库”的文档控件

    通用的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. 源代码下载

     https://199.47.216.171/u/10032723/DocumentToolkit.rar

    5. 在线预览

    http://rapidsl2.guozili.25u.com/  (admin/admin  点左边菜单 控件展示 - 文档查看器)

     6. 截图

     

     

  • 相关阅读:
    洛谷P2219 [HAOI2007]修筑绿化带(单调队列)
    CF1059E Split the Tree(倍增)
    CF1059D Nature Reserve(二分)
    洛谷P4199 万径人踪灭(manacher+FFT)
    洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)
    洛谷P4867 Gty的二逼妹子序列(莫队+树状数组)
    CF932E Team Work(第二类斯特林数)
    JZOJ4307. 【NOIP2015模拟11.3晚】喝喝喝
    洛谷 P2519 [HAOI2011]problem a
    构建秘钥对验证的SSH体系
  • 原文地址:https://www.cnblogs.com/guozili/p/2593437.html
Copyright © 2011-2022 走看看